iview select组件在大数据情况下虚拟加载处理方式

select 组件在几千上万条数据的时候特别卡,调试发现option组件渲染太多,导致整个页面都卡,通过调研发现可以通过虚拟加载的方式动态渲染option,亲测上万数据一点都不卡,废话不说,上代码

虚拟加载用的是 vue-virtual-scroller 具体怎么安装和使用,这就不介绍,网上一大把,下面是select结合 vue-virtual-scroller 的代码,由于option上包了一成代码,会导致select选中的样式不会自动加上,需要手动在option上加上选中样式

html 复制代码
 <Select v-model="nodeData.fileUniqueList" multiple filterable filter-by-label
          ref="select"
          @on-query-change="fileQueryChange"
          style="width:100%">
          <recycle-scroller
            class="virtual-list"
            :buffer="200"
            :prerender="10"
            style="height: 180px"
            :item-size="30"
            key-field="value"
            :items="fileList">
            <template v-slot="{ item, index }">
              <Option
                :class="{'ivu-select-item selected':nodeData.fileUniqueList.includes(item.value)}"
                :value="item.value" :key="item.value" :label="item.fileName">{{ item.fileName }}
              </Option>
            </template>
          </recycle-scroller>
        </Select>

在 mounted 中把select的自动过滤方法重写,这一步很关键,没这一步会导致搜索的option被强制重写,这样永远都渲染不出来数据

javascript 复制代码
 this.$nextTick(() => {
      // 替换过滤函数
      this.$refs.select.validateOption = () => true;
    });

然后就是自定义查询方法,通过 on-query-change事件自己写过滤方法,我这是先把查出来的数据备份了一份,然后在备份的数据里面查找在深度拷贝给对象

javascript 复制代码
fileQueryChange(v) {
      if (v) {
        let data = deepClone(this.fileListBak.filter(f => f.fileName.indexOf(v) >= 0))
        this.fileList = data
      } else {
        this.fileList = deepClone(this.fileListBak)
      }
    },

最后就是返现问题,由于动态渲染不会把所有的option都渲染出来,导致不能返现,调试了下发现多选的时候,select组件是在values里面plus值,所以在数据返回后,循环以前选中的,然后查找,最后给values赋值,这是多选的方式,单选应该也是大同小异,如果不行,去调试一下看单选是怎么赋值的

javascript 复制代码
    this.$refs.select.values = []
    this.nodeData.fileUniqueList.forEach(f => {
         let data = this.fileList.find(d => d.value == f)
         this.$refs.select.values.push({
            label: data.fileName,
            tag: undefined,
            value: f
         })
     })
相关推荐
是梦终空1 天前
计算机毕业设计263—基于Springboot+Vue的影视推荐和评分系统(源代码+数据库)
spring boot·vue·毕业设计·课程设计·协同过滤算法·影评系统·影视推荐系统
EstherNi1 天前
小程序中,下拉多选的组件,有写死的三级下拉,样式需要修改
javascript·小程序·vue
青春男大2 天前
已有后端基础学习前端简单页面交互
前端·javascript·学习·typescript·vue
shejizuopin2 天前
基于Spring Boot的高校科研管理系统的设计与实现(毕业论文)
java·spring boot·vue·毕业设计·论文·毕业论文·高校科研管理系统的设计与实现
皮卡穆2 天前
Vue3 + Swiper.js 实现无缝轮播图组件
前端·javascript·vue
泰勒疯狂展开3 天前
Vue3研学-组件的生命周期
开发语言·前端·vue
千寻技术帮3 天前
10392_基于SpringBoot的大学迎新系统
mysql·vue·源码·springboot·代码·新生报到
总爱写点小BUG4 天前
VU-Icons:打造极致体验的 Vue3 & UniApp 双端 SVG 图标库
uni-app·vue·组件库·图标组件库
换日线°5 天前
微信小程序对接位置服务(腾讯、高德)完成路径规划
前端·微信小程序·vue
攻城狮7号5 天前
不懂代码也能造?TRAE+GLM-4.6 手把手教你搭心理咨询智能客服小程序
python·小程序·uni-app·vue·trae·glm我的编程搭子·glm-4.6