vue实现el-select 触底分页+远程搜索的示例

 更新时间:2023年12月19日 11:10:33   作者:前端初见  
有的时候数据量比较大,比如几千甚至上万条的时候,如果直接赋值,整个页面的 dom 会被撑爆,本文主要介绍了vue实现el-select 触底分页+远程搜索的示例,具有一定的参考价值,感兴趣的可以了解一下

前言

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

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

    在这里插入图片描述

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

触底分页

在这里插入图片描述

远程搜索

在这里插入图片描述

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 参数即可
    当然,在项目中遇到某些固定的加载请求时,我们也可以对该组件进行再次封装,具体可以根据自身的业务需求进行修改。

总结

到此这篇关于vue实现el-select 触底分页+远程搜索的示例的文章就介绍到这了,更多相关vue el-select 触底分页+远程搜索内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Vue.js之初始化el以及数据的绑定说明

    浅谈Vue.js之初始化el以及数据的绑定说明

    今天小编就为大家分享一篇浅谈Vue.js之初始化el以及数据的绑定说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • 使用vNode实现给列表字段打标签

    使用vNode实现给列表字段打标签

    这篇文章主要为大家介绍了使用vNode实现给列表字段打标签示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 使用iView Upload 组件实现手动上传图片的示例代码

    使用iView Upload 组件实现手动上传图片的示例代码

    这篇文章主要介绍了使用iView Upload 组件实现手动上传图片的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • 解决Vue不能检测数组或对象变动的问题

    解决Vue不能检测数组或对象变动的问题

    下面小编就为大家分享一篇解决Vue不能检测数组或对象变动的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • vue升级之路之vue-router的使用教程

    vue升级之路之vue-router的使用教程

    自动安装的vue-router,会在src 文件夹下有个一个 router -> index.js 文件 在 index.js 中创建 routers 对象,引入所需的组件并配置路径。这篇文章主要介绍了vue-router的使用,需要的朋友可以参考下
    2018-08-08
  • vue中table实现真正的跨越全选

    vue中table实现真正的跨越全选

    本文主要介绍了vue中table实现真正的跨越全选,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Vue组件之间的参数传递与方法调用的实例详解

    Vue组件之间的参数传递与方法调用的实例详解

    这篇文章主要介绍了Vue组件之间的参数传递与方法调用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • vue elementui 实现图片上传后拖拽排序功能示例代码

    vue elementui 实现图片上传后拖拽排序功能示例代码

    这篇文章主要介绍了vue elementui 实现图片上传后拖拽排序功能,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • 解决vue3.0运行项目warning Insert `·` prettier/prettier问题

    解决vue3.0运行项目warning Insert `·` prettier/pret

    这篇文章主要介绍了解决vue3.0运行项目warning Insert `·` prettier/prettier问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 结合Vue控制字符和字节的显示个数的示例

    结合Vue控制字符和字节的显示个数的示例

    这篇文章主要介绍了结合Vue控制字符和字节的显示个数的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05

最新评论