解决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.rhkb.cn/news/485009.html

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

相关文章

计算机网络 第5章 运输层

计算机网络 &#xff08;第8版&#xff09; 第 5 章 传输层5.4 可靠传输的原理5.4.1 停止等待协议5.4.2 连续ARQ协议 5.5 TCP报文段的首部格式5.6 TCP可靠传输的实现5.6.1 以字节为单位的滑动窗口5.6.2 超时重传时间的选择 5.7 TCP的流量控制5.7.1 利用滑动窗口实现流量控制 5.…

【PyTorch】(基础三)---- 图像读取和展示

图像读取和展示 pytorch本身并不提供图像的读取和展示功能&#xff0c;利用pytorch执行计算机视觉任务的时候&#xff0c;通常是利用opencv等工具先进行图像处理&#xff0c;然后将结果转化成tensor类型传递给pytorch&#xff0c;在pytorch执行之后&#xff0c;也可以将tensor…

Java课程设计项目-servlet+jsp美食系统、菜品管理系统

文章目录 Java课程设计项目-servletjsp美食系统一、项目介绍二、技术介绍2.1 环境需要2.2 技术栈 环境需要三、功能实现3.1登录注册3.2首页菜品展示、轮播图3.3美食菜品分类、查询3.4作品动态、个人简介、菜品收藏3.5创建菜谱、添加步骤 四、系统代码展示4.1项目架构&#xff0…

使用Unity脚本模拟绳索、布料(碰撞)

效果演示&#xff1a; 脚本如下&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;namespace PhysicsLab {public class RopeSolver : MonoBehaviour {public Transform ParticlePrefab;public int Count 3;public int Space 1;…

Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo)

Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo) 目录 Python 【图像分类】之 PyTorch 进行猫狗分类功能的实现(Swanlab训练可视化/ Gradio 实现猫狗分类 Demo) 一、简单介绍 二、PyTorch 三、CNN 1、神经网络 2、卷…

【Python网络爬虫笔记】8- (BeautifulSoup)抓取电影天堂2024年最新电影,并保存所有电影名称和链接

目录 一. BeautifulSoup的作用二. 核心方法介绍2.1 构造函数2.2 find()方法2.3 find_all()方法2.4 select()方法 三. 网络爬虫中使用BeautifulSoup四、案例爬取结果 一. BeautifulSoup的作用 解析HTML/XML文档&#xff1a;它可以将复杂的HTML或XML文本转换为易于操作的树形结构…

ZLMediaKit+wvp (ffmpeg+obs)推拉流测试

这里使用了两种方式: ffmpeg命令和 OBS OBS推流在网上找了些基本没有说明白的, 在ZLMediaKit的issues中看到了一个好大哥的提问在此记录一下 使用OBS推流&#xff0c;rtmp&#xff0c;报鉴权失败 推流 1. ffmpeg命令推流 官方说明文档地址: 推流规则 rtsp://192.168.1.4:10554…

Linux入门攻坚——40、Linux集群系统入门-lvs(1)

Cluster&#xff0c;集群&#xff0c;为了解决某个特定问题将多台计算机组合起来形成的单个系统。 这个单个集群系统可以扩展&#xff0c;系统扩展的方式&#xff1a;scale up&#xff0c;向上扩展&#xff0c;更换更好的主机&#xff1b;scale out&#xff0c;向外扩展&…

威胁驱动的网络安全方法论

本文主要内容取自洛克希德马丁公司的论文&#xff1a;A Threat-Driven Approach to Cyber Security&#xff0c;想要全面准确了解论文内容的朋友建议阅读原文。希望能够抛砖引玉&#xff0c;为相关领域的相关工作人员带来一点不同的思路或启发&#xff0c;从而更好地维护企业/组…

【Verilog】实验三 数码管实验

目录 一、实验目的&#xff1a; 二、实验内容: 三、实验要求&#xff1a; 四、实验步骤: 一、实验目的&#xff1a; 进一步熟悉Modelsim和VIVADO工具&#xff1b;掌握7段数码管显示译码器&#xff1b;掌握7段数码管数码管动态输出显示的方法。 二、实验内容: 实现按动开关…

Spring Cloud + MyBatis Plus + GraphQL 完整示例

Spring Cloud MyBatis Plus GraphQL 完整示例 1、创建Spring Boot子项目1.1 配置POM&#xff0c;添加必要的依赖1.2 配置MyBatis-Plus 2、集成GraphQL2.1 定义schema.graphqls2.2 添加GraphQL解析器2.3 配置schame文件配置 3、访问测试3.1 查询测试&#xff08;演示&#xff…

MySQL书籍推荐

《高性能MySQL&#xff08;第4版&#xff09;》-西尔维亚博特罗斯 系统层次 Mysql性能优化和高可用架构实践 2020 系统基础 MySQL性能调优与架构设计 系统基础 Mysql技术大全 2021 综合 MySQL数据库应用案例教程 综合实战 从入门到项目实践 综合实战 丰富 超值 MySQ…

MR30分布式IO模块赋能喷水织机

纺织行业作为我国传统支柱产业&#xff0c;历经数千年的演变&#xff0c;如今仍面临着诸多困境&#xff0c;在纺织行业中&#xff0c;每一次技术的飞跃都是对行业边界的勇敢探索。在纺织行业&#xff0c;喷水织机作为关键生产设备&#xff0c;其性能直接影响到产品质量和产能。…

nodejs循环导出多个word表格文档

文章目录 nodejs循环导出多个word表格文档一、文档模板编辑二、安装依赖三、创建导出工具类exportWord.js四、调用五、效果图nodejs循环导出多个word表格文档 结果案例: 一、文档模板编辑 二、安装依赖 // 实现word下载的主要依赖 npm install docxtemplater pizzip --save/…

LabVIEW中“this VI‘s owning library is missing”错误及解决

问题描述 当加载或打开一个VI时&#xff0c;如果其所属的项目库未加载到内存&#xff0c;LabVIEW将提示错误&#xff1a;“this VIs owning library is missing”&#xff08;该VI的所属库不存在&#xff09;。 该问题通常发生在以下情况下&#xff1a; 项目库文件丢失或路径…

LongVU:用于长视频语言理解的空间时间自适应压缩

晚上闲暇时间看到一种用于长视频语言理解的空间时间自适应压缩机制的研究工作LongVU&#xff0c;主要内容包括&#xff1a; 背景与挑战&#xff1a;多模态大语言模型&#xff08;MLLMs&#xff09;在视频理解和分析方面取得了进展&#xff0c;但处理长视频仍受限于LLM的上下文长…

sphinx基本使用

sphix是一个文档生成工具 本文介绍一些基础技能&#xff0c;如果想深入学习&#xff0c;可以查看官方文档 Sphinx官方文档 1.安装虚拟环境 # ubuntu # 使用 venv 创建 .venv虚拟环境 python3 -m venv .venv# 激活虚拟环境 source .venv/bin/activate# windows # 创建虚拟环境…

爬虫第四篇:Xpath 路径表达式全解析:从网页基础到爬取百度贴吧图片实战

简介&#xff1a;本文围绕 Xpath 路径表达式展开讲解&#xff0c;先是介绍了网页相关基础如 html、css、vue 以及前后端分离的概念与示例&#xff0c;包括各部分的结构、作用及简单代码展示&#xff0c;随后详细阐述了 xml 的节点关系、选取节点、谓语等理论知识&#xff0c;最…

HarmonyOS NEXT开发进阶(一):初识 HarmonyOS NEXT开发

文章目录 一、前言二、HarmonyOS NEXT 开发框架三、HarmonyOS NEXT开发指导3.1 Windows环境准备 四、项目拆解4.1 工程目录4.2 全局配置4.2.1 APP全局配置: AppScope层&#xff08;AppScope/app.json5&#xff09;4.2.3 签名全局配置 4.3 APP代码初始化4.4 APP签名文件配置4.5 …

Chrome控制台 网站性能优化指标一览

打开chrome-》f12/右键查看元素-》NetWrok/网络 ctrlF5 刷新网页&#xff0c;可以看到从输入url到页面资源请求并加载网页&#xff0c;用于查看资源加载&#xff0c;接口请求&#xff0c;评估网页、网站性能等&#xff0c;如下图&#xff1a; request、stransferred、resour…