效果

前情提要:

最近使用element-ui开发的一个页面,在打开的时候占用cpu非常高,有时候都能达到90%↑。在调试时发现其中一个下拉框的接口返回2k↑的数据。本着有问题问百度的精神,看到主要的解决方案有如下两种:

  1. 监听下拉框滚动事件,去服务端请求数据 https://blog.csdn.net/zhangshineng/article/details/89676413?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

  2. 渲染一部分数据,其余部分需要手动筛选 https://www.cnblogs.com/mianbaodaxia/p/11153341.html

方案1:分页获取数据,根据select触发事件去接口获取下一页。方案2:渲染一部分数据,其余数据需手动输入筛选。两种方案的核心都是将数据获取与渲染dom分开(渲染时性能消耗较大),我的数据最多有2K条左右,让后端加一个接口感觉不太合适,参考以上两种方案,本地进行优化

1.前端获所有数据实现本地分页

2.可输入文字筛选待选项

代码 https://github.com/dadademo/demo/blob/main/src/components/select.vue

<template>
<div>
<el-select class="order-cover-select" v-model="selectModel" clearable placeholder="请选择设备名称" filterable multiple collapse-tags v-el-select-loadmore="loadmore" :filter-method="filterVmModel">
<el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id">
</el-option>
</el-select>
</div>
</template> <script>
// select 分页
export default {
name: 'selectDemo',
// 此处详见:https://blog.csdn.net/zhangshineng/article/details/89676413?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
// 文档:https://cn.vuejs.org/v2/guide/custom-directive.html
directives: {
// 计算是否滚动到最下面
'el-select-loadmore': {
bind (el, binding) {
// 获取element-ui定义好的scroll盒子
const SELECTWRAP_DOM = el.querySelector('.el-select-dropdown .el-select-dropdown__wrap');
SELECTWRAP_DOM.addEventListener('scroll', function () {
/**
* scrollHeight 获取元素内容高度(只读)
* scrollTop 获取或者设置元素的偏移值,常用于, 计算滚动条的位置, 当一个元素的容器没有产生垂直方向的滚动条, 那它的scrollTop的值默认为0.
* clientHeight 读取元素的可见高度(只读)
* 如果元素滚动到底, 下面等式返回true, 没有则返回false:
*/
const condition = Math.round(this.scrollHeight - this.scrollTop) <= this.clientHeight;
if (condition) {
binding.value();
}
});
}
}
},
data () {
return {
selectModel: '',// select 选择的数据
optionAll: [], // 全部的数据
options: [], // 分页数据
// 分页参数
query: {
page: 1,
limit: 10
},
filterText: '' // 筛选文本
}
},
created () {
this.initData()
},
methods: {
// 初始化数据
initData () {
// http request....
// 模拟2k条数据
let demoData = []
for (let index = 0; index < 2000; index++) {
demoData.push({ name: `测试${index}`, id: index })
}
this.optionAll = demoData
this.loadmore(true)
},
// 分页方法 详见 directives
loadmore (firstTag) {
// 筛选时下拉不触发分页
if (!this.filterText) {
if (!firstTag) {
this.query.page++
}
// 前端分页简单版本
// 分页开始坐标
const begin = this.query.limit * (this.query.page - 1)
// 分页结束坐标
const end = (this.query.limit * (this.query.page - 1)) + this.query.limit
// 这里使用slice 进行分页
this.options.push(...this.optionAll.slice(begin, end))
}
},
// 筛选方法
// 此处详见:https://www.cnblogs.com/mianbaodaxia/p/11153341.html
filterVmModel (value) {
this.filterText = value
// 筛选数据
if (value) {
this.options = this.optionAll.filter(item => {
if (item.name && item.name.indexOf(value) !== -1) {
return true
} else {
return false
}
})
} else {
// 直接赋值会连续触发 loadmore 分页事件
this.options = []
this.$nextTick(() => {
this.options = this.optionAll.slice(0, this.query.limit * this.query.page)
})
}
},
}
}
</script>

注:参考链接只是在百度搜索到的,有的未找到原文链接,如有问题私信我修改或删除

以上代码还可以优化,在搜索的结果也进行分页(有兴趣的可以搞一下)

解决element-ui下拉框数据过多,导致页面卡顿问题与本地分页功能实现的更多相关文章

  1. element ui下拉框如何实现默认选择?

    <template> <el-select v-model="value4" clearable placeholder="请选择"> ...

  2. element ui 下拉框绑定对象并且change传多个参数

    废话不说直接上代码说明真相. <template> <div class="hello"> <span>可以设置的属性 value-key=&q ...

  3. layui动态设置下拉框数据,根据后台数据设置选中

    追加下拉框数据: 设置默认选中: 正常的判断这种情况是不行的,因为追加出的数据,在前台显示的并不是同一个下拉框,原来的下拉框被隐藏了 因此需要:根据原来的位置,寻找下一个节点,寻找子节点的方式找到相应 ...

  4. Extjs6 经典版 combo下拉框数据的使用及动态传参

    Extjs的下拉框,在点击的时候会请求一次数据,我们可不可以在点击前就请求好数据,让用户体验更好呢?答案当然是肯定的.如果是公用的下拉框还可以传入不同参数请求不同数据. 第一步: 进入页面前首先加载s ...

  5. easy ui 下拉框绑定数据select控件

    easy ui 中的下拉框控件叫做select,具体代码如下: html代码:①.这是一个公司等级的下拉框 <tr> <td>公司等级:</td> <td&g ...

  6. 巧妙解决element-ui下拉框选项过多的问题

    1. 场景描述 不知道你有没有这样的经历,下拉框的选项很多,上万个选项甚至更多,这个时候如果全部把数据放到下拉框中渲染出来,浏览器会卡死,体验会特别不好 用人会说element-ui的select有一 ...

  7. 关于ComboGrid取值为非下拉框数据是,隐藏面板数据清空

    $('#areaGuid').combogrid({ panelWidth: 300, idField: 'guid', textField: 'name', mode: 'remote', meth ...

  8. 下拉框数据的动态选择,类似级联ajax刷新数据

    简单的两个下拉列表,第二个中的数据与第一个下拉框相关: --------------------var selected = $(this).children('option:selected').v ...

  9. 快速解决js开发下拉框中blur与click冲突

    在开发中我们会经常遇到blur和click冲突的情况.下面叙述了开发中常遇到的"下拉框"的问题,并提供了两种解决方案. 一.blur和click事件简述 blur事件:当元素失去焦 ...

  10. vuetify.js框架 下拉框数据改变DOM原数据未清除

    今天遇到一个奇怪的bug 需求很简单,就是将“引擎能力”下拉框选中的值作为筛选条件传入到“样本类型”下拉框中,默认“样本类型”下拉框显示所有样本类型 看图: 如图所示,功能很简单. 其实还是对vuet ...

随机推荐

  1. DES算法流程

    初始置换IP 表格的使用方法: 将输入的64bit的明文从1开始标号,依次放入到IP初始置换表中数字对应的位置.填充完毕后,按照行优先的顺序从第1行开始依次读取获得输出. 16轮轮结构 整体结构 因为 ...

  2. 钛度守望者旗舰版TSG550鼠标(原相3335芯片)拆解

    鼠标整体外观 鼠标按键支柱,采用的十字形的按键柱,没有采用现在市面上多数鼠标的平面贴片形的按键柱设计,但是耐用性比一字型的按键柱会好很多. 可换微动设计,原装的是凯华GM8.0黑曼巴8000万次微动, ...

  3. 手把手带你从0完成医疗行业影像图像检测三大经典模型InceptionV3-RestNet50-VGG16(附python源代码及数据库)——改变世界经典人工智能项目实战(一)手把手教学迁移学习

    目录 1.迁移学习简介 2.项目简介 3.糖尿病视网膜病变数据集 4.考虑类别不平衡问题 5.定义模型质量 6.定义损失函数 7.预处理图像 8.搭建迁移学习网络 VGG16 迁移学习网络 Incep ...

  4. 刷爆 LeetCode 周赛 339,贪心 / 排序 / 拓扑排序 / 平衡二叉树

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 上周末是 LeetCode 第 339 场周赛,你参加了吗?这场周赛覆盖的知识点比较少, ...

  5. 二进制安装Kubernetes,一键安装脚本

    背景,最近几天闲着研究Kubernetes,发现使用手动二进制安装会有些繁琐.经过突发奇想,就出现这个脚本. 声明,该脚本不及互联网上其他大佬的一件脚本,该脚本仅仅是突发奇想编写的,希望大佬不喜勿喷. ...

  6. [SVN]SVN checkout 功能不可用 右键只看到提交和更新,没有显示checkout[转载]

    不要在受SVN控制的文件夹里点右键,因为这个文件夹已经在SVN控制之下,当然不会允许在里面嵌套另一个SVN版本库 换个不受控的文件夹点右键,比如: D盘根目录 X 参考文献 SVN checkout ...

  7. Semantic Kernel 入门系列:🛸LLM降临的时代

    不论你是否关心,不可否认,AGI的时代即将到来了. 在这个突如其来的时代中,OpenAI的ChatGPT无疑处于浪潮之巅.而在ChatGPT背后,我们不能忽视的是LLM(Large Language ...

  8. Centos7 开机时遇到initramfs-xxx.img not found错误导致虚拟机无法开启问题处理

    1.背景 一台运行在Esxi上面的VM重启后报initramfs-xxx.img not found错误. 按任意键后出现以下错误. 之前在运维Centos7的时候解决过Kernel panic - ...

  9. Mysql中的数据类型注意事项

    整型数据类型 MySQL数据类型 含义(有符号) tinyint 1字节,范围(-128~127) smallint 2字节,范围(-32768~32767) mediumint 3字节,范围(-83 ...

  10. 从原理聊JVM(二):从串行收集器到分区收集开创者G1

    作者:京东科技 康志兴 1 前言 随着Java的进化过程,涌现出各种不同的垃圾回收器,从串行执行到并行执行,从高吞吐到低延迟,终极目标就是让开发人员专注于程序的代码书写而无需关注内存管理. JDK早期 ...