效果

前情提要:

最近使用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. Cisco模拟器配置DNS服务器遇到的问题

    1.使用工具: Cisco-Packet-Tracer(7.0或8.0版本及以上) 2.问题: 原因:安装思科模拟器后进行中文汉化: 过程:配置DNS服务时无法进行域名操作: 解决: 更改为原来的语言 ...

  2. 淘宝商品页面的爬取.py(亲测有效)

    import requests def getHTMLText(url): try: r = requests.get(url,timeout=30) r.raise_for_status() #如果 ...

  3. 第三部分:Spdlog 日志库的实现原理

    ! https://zhuanlan.zhihu.com/p/617432495 Spdlog 是一个快速.异步的 C++ 日志库,被广泛应用于 C++ 项目中.在这篇文章中,我们将探讨 Spdlog ...

  4. rocketMq和kafka对比

    为什么在RocketMQ和kafka中选型 在单机同步发送的场景下,Kafka>RocketMQ,Kafka的吞吐量高达17.3w/s,RocketMQ吞吐量在11.6w/s. kafka高性能 ...

  5. [原创][luogu]P1217 回文质数 真·生成回文的方法

    不多说,直接看代码,都在注释里 // 中心思想: // * 1. 代入数据只想回文的一半和位数的变化 // * 例. 1001 和 101 都存的是10, 但是位数一个是4, 一个是3 // * 2. ...

  6. python入门教程之十三错误和异常

    作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍. Python 有两种错误很容易辨认:语法错误和异常. Python as ...

  7. python获取本地ip地址1

    import socket def get_host_ip(): """ 查询本机ip地址 return: ip """ try: s = ...

  8. vmware中安装windows11系统

    1.官网下载windwos11镜像(点击跳转下载) 2.打开vmware,创建新的虚拟机 3.选择典型方便快捷 4.选择安装程序光盘文件,点击浏览选择刚刚下载好的iso镜像 5.选择windows版本 ...

  9. LeeCode 动态规划(二)

    01背包问题 题目描述 有 n 件物品和容量为 w 的背包,给你两个数组 weights 和 values ,分别表示第 i 件物品的重量和价值,每件物品只能使用一次,求解将哪些物品装入背包可使得物品 ...

  10. FTP FileZilla 425 Can't open data connection for transfer of "/" 错误: 读取目录列表失败

    如图所示: 在谷歌百度搜了很多资料都没有解决,主动被动模式端口入站规则什么能设置的都设置了结果还是不行,尝试换了一个软件用了FTP Rush就直接可以连上了. 具体原因有空再查找吧,目前问题算是解决了 ...