el-select 触底分页+远程搜索

这篇具有很好参考价值的文章主要介绍了el-select 触底分页+远程搜索。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿
🍟欢迎来到前端初见的博文,本文主要讲解el-select 触底分页+远程搜索🍟
👨‍🔧 个人主页 : 前端初见
🥞喜欢的朋友可以关注一下,下次更新不迷路🥞
@[TOC](文章目录)

前言

大部分情况下使用 el-select 的时候,el-options 中 options 的值都是后端接口给的数据,直接赋值就可以了。但是有的时候数据量比较大,比如几千甚至上万条的时候,如果直接赋值,整个页面的 dom 会被撑爆,不仅请求全量数据接口的时候时间会很久,而且赋值完之后整个页面会非常卡。
解决方案:

  • 后端将接口改为分页的、前端将el-select下拉框中的数据改为滚动加载
  • 后端将接口改为模糊搜索的形式,通过选择器中输入的内容去搜索模糊匹配的数据然后返回;前端使用 elementUI 中el-select的远程搜索
  • 我们可以实现一个Vue的自定义指令,每当使用el-select滚动到列表底部的时候就请求下一页数据,来达到下拉滚动加载更多的目的。
    el-select分页,前端,vue.js,javascript

一、el-select 触底分页+远程搜索

触底分页
el-select分页,前端,vue.js,javascript
远程搜索
el-select分页,前端,vue.js,javascript

1.封装触底自定义指令

src目录下创建 select.js,并在main.js中全局引入
代码主要是实现一个el-select下拉加载的自定义指令v-loadmore:

import Vue from 'vue'
export default {}.install = (Vue, options = {}) => {
  Vue.directive('loadmore', {
    inserted(el, binding) {
      // 获取element-ui定义好的scroll盒子
      const SELECTDOWN_DOM = el.querySelector(
        '.el-select-dropdown .el-select-dropdown__wrap'
      )
      SELECTDOWN_DOM.addEventListener('scroll', function () {
        const CONDITION =
          this.scrollHeight - this.scrollTop <= this.clientHeight
        if (CONDITION) {
          binding.value()
        }
      })
    },
  })
}

代码说明:

  • document.querySelector:querySelector() 方法仅仅返回匹配指定选择器的第一个元素。
  • Element.scrollHeight:在不使用滚动条的情况下为了适应视口中所用内容所需的最小高度(只读)
  • Element.scrollTop:获取或设置一个元素的内容垂直滚动的像素数。
  • Element.clientHeight:读取元素的可见高度(只读)。
  • 元素滚动到底,下面等式返回true,没有则返回false。
  • 警告: 在使用显示比例缩放的系统上,scrollTop可能会提供一个小数。

2.在 mian.js 引入封装好的自定义指令

在项目中全局注册v-loadmore指令

import loadMore from './plugins/select'
Vue.use(loadMore)

3.在组件中进行使用

最后在组件el-select中使用该指令

  • html部分
<el-form-item label="关联案件:">
  <el-select
    v-model="searchParams.caseCode"
    v-loadmore="handleScroll"
    filterable
    remote
    :remote-method="remoteMethod"
  >
    <el-option
      v-for="item in ajList"
      :key="item.caseCode"
      :label="item.caseName"
      :value="item.caseCode"
    >
    </el-option>
  </el-select>
</el-form-item>
  • js部分
export default {
  data() {
    return {
      slectloading: false, //搜索下拉菜单
      ajList: [], //案件数据
      total: 0, //案件所有总数(接口返回)
      dqajtotal: 0, //当前案件总数(每次存储的长度)
    }
  },
  created() {
    this.getajnewlist() //获取案件
  },
  methods: {
    handleScroll() {
      console.log('触底了')
      console.log(this.dqajtotal, this.ajtotal)
      if (this.ajList.length < this.ajtotal) {
        this.slectloading = true
        this.getajnewlist() //获取案件方法
        this.slectloading = false
      }
    },
    // 获取案件
    getajnewlist() {
      this.selectfy.page = this.selectfy.page + 1
      console.log('页码', this.selectfy.page)
      this.$axios({
        url: 'case/list',
        method: 'GET',
        params: this.selectfy,
      }).then((res) => {
        if (res.code === 2000 && res.data) {
          console.log('获取成功')
          this.ajtotal = res.data.total
          if (res.data.records && res.data.records.length > 0) {
            res.data.records.forEach((ele) => {
              var idx = this.ajList.findIndex((item) => {
                return item.caseId == ele.caseId
              })
              if (idx == -1) {
                this.ajList.push(ele)
              }
            })
          }
        } else {
          console.log(res.resultStr)
        }
        console.log(res)
      })
    },
    // 关联案件下拉菜单远程搜索
    remoteMethod(val) {
      console.log('远程搜索', val)
      if (val && val.length > 0) {
        // 有内容
        this.slectloading = true
        this.$axios({
          url: 'case/list',
          method: 'GET',
          params: {
            size: 10,
            caseName: val,
          },
        }).then((res) => {
          console.log('远程搜索', res)
          this.ajList = res.data.records //案件信息
          this.slectloading = false
        })
      } else {
        this.slectloading = true
        this.$axios({
          url: 'case/list',
          method: 'GET',
          params: {
            size: 10,
          },
        }).then((res) => {
          console.log(res)
          console.log('远程搜索', res)
          this.ajList = res.data.records //案件信息
          this.slectloading = false
        })
      }
    },
  },
}

4.注意

  • 传入的数组个数必须大于或者等于8个选项时才能让el-select组件出现下拉滚动。
  • 列表里不存在滚动时,无法触发传入指令的函数。
    未对 el-select 的其他参数做过多支持,如需支持,在不影响已有实例的使用的情况下,请直接修改组件源码增加可选的 prop 参数即可
    当然,在项目中遇到某些固定的加载请求时,我们也可以对该组件进行再次封装,具体可以根据自身的业务需求进行修改。

总结

如果这篇【文章】有帮助到你💖,希望可以给我点个赞👍,创作不易,如果有对前端或者对python感兴趣的朋友,请多多关注💖💖💖,咱们一起探讨和努力!!!
👨‍🔧 个人主页 : 前端初见文章来源地址https://www.toymoban.com/news/detail-619275.html

到了这里,关于el-select 触底分页+远程搜索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Element】el-select下拉选择器搜索选项,自定义搜索方法,结合后端接口远程搜索

    当我们有多个选项时,我们一般会使用下拉选择器 el-select 展示选项,选项不多的情况下,我们可以进行手动下拉选择。 那当选项有100个,甚至1000个的时候,需要一个个找选项,手动下拉选择就太累了,这时候我们可以利用搜索功能快速查找选项 可以利用搜索功能快速查找

    2024年02月06日
    浏览(34)
  • element plus封装el-select添加后缀图标并添加远程搜索和对话框功能

    当提交的表单Form需要填某个实体的外键ID时,当然不可能使用el-input组件,这个适合提交字符串,然后用户又不可能记住某个引用的外键ID,这时候使用el-select还是必要的。 el-select组件一般都作为下拉选择框使用,但仅在数据量少时,比较实用,比如性别的选择:男女。 但当

    2024年02月07日
    浏览(35)
  • element-plus的el-select实现触底加载更多(新版本报错踩坑)

    element-plus新版增加了一个属性,且默认为true,使得下拉菜单被插入到了body元素下。即.el-select下默认不包含.el-select-dropdown了。 当依旧按照之前的方式,封装自定义指令,实现滚动到el-select下拉菜单的底部,加载更多数据的功能时就会报错。 原逻辑:  报错 原因也就是前言中

    2024年02月08日
    浏览(26)
  • el-select 分页加载

    针对数据量大的选择器,需要分页从后端接口获取数据,前端监听选择器下拉框的滚动事件,当往下滚动至底部一定位置时,调接口

    2024年02月14日
    浏览(25)
  • elementUI中el-select数据分页懒加载实现

    工作中使用elementUI框架时, 会经常用到下拉框展示数据,如果数据量很大会影响页面的渲染加载速度。遇到这种情况,通常后端代码会将数据做成分页查询,前端下拉框组件也要支持滑动到底部会自动加载下一页数据。话不多说,直接上代码。 这样子组件下拉框就实现了检索、

    2024年02月12日
    浏览(37)
  • el-select加上搜索查询时,限制开头空格输入

    **1、注释:**结构中的ref和@input.native很重要 2、js中限制开头为空格时重新赋值为空

    2024年02月22日
    浏览(24)
  • el-select数据过多的解决(纯前端)

    el-select数据过多这个问题应该很多人都遇到过,在生产环境中数据几百、几千条是比较常见的。当数据过多时,就会造成浏览器卡顿,如果客户电脑性能不行,浏览器直接卡死也有可能。 先说一下现在项目中遇到的两种解决方案: 添加分页条 这种方案好像有点问题,具体什

    2024年02月09日
    浏览(30)
  • 使用element-ui el-select 做下拉 全选+搜索 功能

    使用element-ui el-select 做下拉 全选+搜索 功能 有时候,需要用到下拉列表 全选和搜索,并且鼠标放入的时候有下拉列表展示。以前的做法是 check + el-input搜索结合做个组件,现在这个方法直接使用el-select 就能做到这个需求功能:有搜索+有全选+有取消+有确认请求+有鼠标移入自

    2024年02月11日
    浏览(42)
  • Element-UI实现的下拉搜索树组件(el-select、el-input、el-tree组合使用)

    1、子组件封装 注意使用:正常使用 // 子组件使用 父组件调用

    2024年02月11日
    浏览(63)
  • 【前端】Element-ui el-select 绑定 v-model 不生效问题汇总

    1、 v-model 绑定的值与下拉选项的值类型不一致。 2、绑定的值未声明。 如上所示,需要具体声明。 3、value 前 需要加 冒号  : 

    2024年02月03日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包