解决el-select数据量过大的3种方法

        在准备上线的后台管理系统中,我们发现有两个下拉框(select),其选项数据量超过 1 万条,而在测试环境中这些数据量只有几百条。这导致在页面加载时,浏览器性能出现瓶颈,页面卡顿甚至崩溃。

想了一下,如果接口支持搜索和分页,那直接通过上拉加载就可以了。但后端不太愿意改😄。行吧,前端搞也是可以的。 

这个故事还有个后续
过了一周上线后,发现有一个下拉框的数据有30w+!!!加载都加载不出来,哈哈哈哈,接口直接超时报错了,所以又cuocuocuo改了一遍,最后改成了:

  1. 接口翻页请求
  2. 前端使用自定义指令实现上拉加载更多,搜索直接走的后端接口

方案

通过一顿搜索加联想总结了3种方法,以下方法都需要支持开启filterable支持搜索。

标题具体问题
方案1只展示前100条数据,这个的话配合filter-method每次只返回前100条数据。限制展示的条数可能不全,搜索需要多搜索点内容
方案2分页方式,通过指令实现上拉加载,不断上拉数据展示数据。仅过滤加载出来的数据,需要配合filterMethod过滤数据
方案3options列表采用虚拟列表实现。成本高,需要引入虚拟列表组件或者自己手写。经掘友指点,发现element-plus提供了对应的实现,如果是plus,则可以直接使用select-v2。

方案一、 filterMethod直接过滤数据量

<template><el-select v-model="value" clearable filterable :filter-method="filterMethod"><el-optionv-for="(item, index) in options.slice(0, 100)":key="index":label="item.label":value="item.value"></el-option></el-select></template>export default {name: 'Demo',data() {return {options: [],value: ''}},beforeMount() {this.getList();},methods: {// 模拟获取大量数据getList() {for (let i = 0; i < 25000; i++) {this.options.push({label: "选择"+i,value:"选择"+i});} },filterMethod(val) {console.log('filterMethod', val);this.options = this.options.filter(item => item.value.indexOf(val) > -1).slice(0, 100);},visibleChange() {console.log('visibleChange');}}
}

方案二、自定义滚动指令,实现翻页加载

写自定义滚动指令,options列表滚动到底部后,再加载下一页。但这时候筛选出来的是已经滚动出来的值。

这里如果直接使用filterable来搜索,搜索出来的内容是已经滑动出来的内容。如果想筛选全部的,就需要重写filterMethod方法来自定义过滤功能。可以根据情况选择是否要重写filterMethod。

<template><div class="dashboard-editor-container"><el-select v-model="value" clearablefilterable v-el-select-loadmore="loadMore":filter-method="filterMethod"><el-optionv-for="(item, index) in options":key="index":label="item.label":value="item.value"></el-option></el-select></div>
</template>
<script>
export default {name: 'Demo',data() {return {options: [],value: '',pageNo: 0}},beforeMount() {this.getList();},methods: {// 模拟获取大量数据getList() {const data = [];for (let i = 0; i < 25000; i++) {data.push({label: "选择"+i,value:"选择"+i});}this.allData = data;this.data = data;this.getPageList()},getPageList(pageSize = 10) {this.pageNo++;const list = this.data.slice(0, pageSize * (this.pageNo));this.options = list;},loadMore() {this.getPageList();},filterMethod(val) {this.data = val ? this.allData.filter(item => item.label.indexOf(val) > -1) : this.allData;this.getPageList();}},directives:{'el-select-loadmore':(el, binding) => {// 获取element-ui定义好的scroll父元素const wrapEl = el.querySelector(".el-select-dropdown .el-select-dropdown__wrap");if(wrapEl){wrapEl.addEventListener("scroll", function () {/*** scrollHeight 获取元素内容高度(只读)* scrollTop 获取或者设置元素的偏移值,*  常用于:计算滚动条的位置, 当一个元素的容器没有产生垂直方向的滚动条, 那它的scrollTop的值默认为0.* clientHeight 读取元素的可见高度(只读)* 如果元素滚动到底, 下面等式返回true, 没有则返回false:* ele.scrollHeight - ele.scrollTop === ele.clientHeight;*/if (this.scrollTop + this.clientHeight >= this.scrollHeight) {// binding的value就是绑定的loadmore函数binding.value();}});}},},
}
</script>
</script>

方案三、虚拟列表

引入社区的vue-virtual-scroll-list 支持虚拟列表。这里想的自己再实现一遍虚拟列表,后续再写吧。

另外,element-plus提供了对应的实现,如果是使用的是plus,则可以直接使用 select-v2组件

<template><div class="dashboard-editor-container"><el-select v-model="value" clearablefilterable ><virtual-listclass="list"style="height: 360px; overflow-y: auto;":data-key="'value'":data-sources="data":data-component="item":estimate-size="50"/></el-select></div>
</template>
<script>
import VirtualList from 'vue-virtual-scroll-list';
import Item from './item';
export default {name: 'Demo',components: {VirtualList, Item},data() {return {options: [],data: [],value: '',pageNo: 0,item: Item,}},beforeMount() {this.getList();},methods: {// 模拟获取大量数据getList() {const data = [];for (let i = 0; i < 25000; i++) {data.push({label: "选择"+i,value:"选择"+i});}this.allData = data;this.data = data;this.getPageList()},getPageList(pageSize = 10) {this.pageNo++;const list = this.data.slice(0, pageSize * (this.pageNo));this.options = list;},loadMore() {this.getPageList();}}
}
</script>// item组件
<template><el-option :label="source.label" :value="source.value"></el-option>
</template><script>export default {name: 'item',props: {source: {type: Object,default() {return {}}}}}</script><style scoped></style>

 总结

最后我们项目中使用的虚拟列表,为啥,因为忽然发现组件库支持select是虚拟列表,那就直接使用这个啦。

最后的最后 

没有用虚拟列表,因为接口数据量过大(你见过返回30w+的接口吗🙄。。),后端接口改成分页,前端支持自定义指令上拉加载,引用的参数增加了remote、remote-method设置为远端的方法。

<template><div class="dashboard-editor-container"><el-select v-model="value" clearablefilterable v-el-select-loadmore="loadMore"remote:remote-method="remoteMethod"><el-optionv-for="(item, index) in options":key="index":label="item.label":value="item.value"></el-option></el-select></div>
</template>

 参考文章:

  • 解决 Element-ui中 选择器(Select)因options 数据量大导致渲染慢、页面卡顿的问题
  • 对el-select进行二次封装,解决数据量过大造成页面卡顿问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63365.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人大金仓(KingBaseEs)数据库操作手册

人大金仓数据库&#xff08;KingbaseES&#xff09;是由北京人大金仓信息技术股份有限公司&#xff08;简称人大金仓&#xff09;自主研发的、具有自主知识产权的通用关系型数据库管理系统。 官方下载地址&#xff1a;KingbaseES 人大金仓数据库 KES技术文档在线手册&#xf…

MATLAB 最小二乘平面拟合(90)

MATLAB 最小二乘平面拟合(90) 一、算法介绍二、算法实现1.代码2.结果:一、算法介绍 平面方程: ax+by+cz+d = 0 执行任务:读取一组点云(这里用自定义生成的平面模拟点云代替,在其中添加了噪声来模拟真实的数据),使用最小二乘拟合平面,来输出平面参数,并可视化显示拟…

使用Java将PDF文件解析成Excel文件

安装pom依赖 <!-- 解析pdf--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version> <!-- 请检查并使用最新版本 --></dependency>测试读取pdf文件…

新书速览|循序渐进Node.js企业级开发实践

《循序渐进Node.js企业级开发实践》 1 本书内容 《循序渐进Node.js企业级开发实践》结合作者多年一线开发实践&#xff0c;系统地介绍了Node.js技术栈及其在企业级开发中的应用。全书共分5部分&#xff0c;第1部分基础知识&#xff08;第1&#xff5e;3章&#xff09;&#xf…

CDC YAML 在阿里云的最佳实践

摘要&#xff1a;本文投稿自阿里云开源大数据平台数据通道团队&#xff0c;主要介绍了 Flink CDC YAML 在实时计算Flink版的最佳实践。内容分为以下五个部分&#xff1a; CDC YAML 简介CDC YAML 核心能力CDC YAML 应用场景阿里云 Flink CDC 企业级功能十分钟在阿里云免费实现一…

【教程】创建NVIDIA Docker共享使用主机的GPU

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 这套是我跑完整理的。直接上干货&#xff0c;复制粘贴即可&#xff01; # 先安装toolkit sudo apt-get update sudo apt-get install -y ca-certifica…

SpringMVC纯注解快速开发

此文章适合具有一定的java基础的同学看哦&#xff0c;如果有看不懂的基本代码还是先补补java基础哦。 此教程带您不使用xml文件而是纯注解开发&#xff0c;易懂、快捷、迅速&#xff0c;从0开始搭建&#xff0c;很快就能构建起一个SpringMVC项目&#xff0c;能学到两种使用tom…

【计算机网络】期末速成(2)

部分内容来源于网络&#xff0c;侵删~ 第五章 传输层 概述 传输层提供进程和进程之间的逻辑通信&#xff0c;靠**套接字Socket(主机IP地址&#xff0c;端口号)**找到应用进程。 传输层会对收到的报文进行差错检测。 比特流(物理层)-> 数据帧(数据链路层) -> 分组 / I…

多人聊天室 NIO模型实现

NIO编程模型 Selector监听客户端不同的zhuangtai不同客户端触发不同的状态后&#xff0c;交由相应的handles处理Selector和对应的处理handles都是在同一线程上实现的 I/O多路复用 在Java中&#xff0c;I/O多路复用是一种技术&#xff0c;它允许单个线程处理多个输入/输出&…

数据结构——有序二叉树的删除

在上一篇博客中&#xff0c;我们介绍了有序二叉树的构建、遍历、查找。 数据结构——有序二叉树的构建&遍历&查找-CSDN博客文章浏览阅读707次&#xff0c;点赞18次&#xff0c;收藏6次。因为数据的类型决定数据在内存中的存储形式。left right示意为左右节点其类型也为…

威联通-001 手机相册备份

文章目录 前言1.Qfile Pro2.Qsync Pro总结 前言 威联通有两种数据备份手段&#xff1a;1.Qfile Pro和2.Qsync Pro&#xff0c;实践使用中存在一些区别&#xff0c;针对不同备份环境选择是不同。 1.Qfile Pro 用来备份制定目录内容的。 2.Qsync Pro 主要用来查看和操作文…

C语言学习:速通指针(2)

这里要学习的有以下内容 1. const修饰指针 2. 野指针 3. assert断⾔ 4. 指针的使⽤和传址调⽤ 那么从这里开始 1. const 修饰指针 const修饰变量 首先我们知道变量是可以修改的&#xff0c;如果把变量的地址交给⼀个指针变量&#xff0c;通过指针变量的也可以修改这个变…

使用 MATLAB 绘制三维散点图:根据坐标和距离映射点的颜色和大小

在数据可视化中&#xff0c;三维散点图是一种非常直观的方式来展示数据的分布。MATLAB 提供了强大的 scatter3 函数&#xff0c;可以用来绘制三维散点图&#xff0c;而通过调整点的颜色和大小&#xff0c;可以进一步增强图形的表现力。 在本篇博客中&#xff0c;我们将逐步讲解…

卷积神经网络(CNN)的层次结构

卷积神经网络&#xff08;CNN&#xff09;是一种以其处理图像和视频数据的能力而闻名的深度学习模型&#xff0c;其基本结构通常包括以下几个层次&#xff0c;每个层次都有其特定的功能和作用&#xff1a; 1. 输入层&#xff08;Input Layer&#xff09;&#xff1a; 卷积神经网…

【深度学习】四大图像分类网络之ResNet

ResNet网络是在2015年由微软实验室中的何凯明等几位提出&#xff0c;在CVPR 2016发表影响深远的网络模型&#xff0c;由何凯明团队提出来&#xff0c;在ImageNet的分类比赛上将网络深度直接提高到了152层&#xff0c;前一年夺冠的VGG只有19层。斩获当年ImageNet竞赛中分类任务第…

美团一面,有点难度

前几天分享过一篇训练营的朋友在阿里的一面面经&#xff0c;挺简单的她也是很轻松的过了&#xff0c;感兴趣的可以看一下我之前发的文章。 今天要分享的还是她的面经&#xff0c;美团的一面&#xff0c;感觉比阿里的难一些&#xff0c;各位观众老爷你怎么看&#xff1f; 自我介…

Windows电脑伪关机(快速启动模式),怎么真关机

Windows电脑在关机的时候&#xff0c;进入到一个伪关机的状态&#xff0c;也就是并没有真正的关机&#xff0c;但是在一些系统更新、变更了一些设置&#xff0c;进行重启等操作也会进入到真关机状态 这种一般是开启快速启动模式&#xff0c;开启了快速启动模式功能会在关机的时…

计算属性computed

使用 export default 的写法&#xff08;Vue 单文件组件&#xff09;和 使用 new Vue() 的写法&#xff08;实例化 Vue&#xff09;二者之间的区别&#xff1a; 1. 使用 export default 的写法&#xff08;Vue 单文件组件&#xff09; 这种写法常用于 Vue 的单文件组件&#xf…

element Plus中 el-table表头宽度自适应,不换行

在工作中&#xff0c;使用el-table表格进行开发后&#xff0c;遇到了小屏幕显示器上显示表头文字会出现换行展示&#xff0c;比较影响美观&#xff0c;因此需要让表头的宽度变为不换行&#xff0c;且由内容自动撑开。 以下是作为工作记录&#xff0c;用于demo演示教程 先贴个…

三维测量与建模笔记 - 5.3 光束法平差(Bundle Adjustment)

此篇笔记尚未理解&#xff0c;先做笔记。 如上图&#xff0c;在不同位姿下对同一个物体采集到了一系列图像&#xff0c; 例子中有四张图片。物体上某点M&#xff0c;在四幅图像上都能找到其观测点。 上式中的f函数是对使用做投影得到的估计点位置。求解这个方程有几种方法&…