解决el-select后台一次返回大数据量渲染慢导致页面卡顿的问题

场景一 解决了一次性渲染大量数据问题

业务场景是后台一次返回10万多条数据需要在下拉框中展示,直接渲染会导致页面卡顿且需要很长时间等待,用户体验极差,所以我把这个改造了一下,直接上代码, 里面注释写的很清楚了就不解释了.

<template><div class="content"><el-select v-model="choose" size="small" v-el-select-loadmore:rangeNumber="loadMore(rangeNumber)"><el-optionv-for="(item, index) in list.slice(0, rangeNumber)" :key="index":label="item.label":value="item.value"></el-option></el-select></div>
</template><script>
import Vue from "vue";
Vue.directive('el-select-loadmore', {bind(el, binding) {let self = this// 获取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:* ele.scrollHeight - ele.scrollTop === ele.clientHeight;*/const condition = this.scrollHeight - this.scrollTop <= this.clientHeight;if (condition) binding.value()});}}
)
export default {data() {return {list: [],choose: "",rangeNumber: 10,}},created(){this.getList()},methods: {getList(){for(let i = 0; i < 100000; i++){this.list.push({label: "menu",value: "menu"})}//测试数据10万条数据, 这里数据多少条无所谓,list.slice(0, rangeNumber)方法只会默认加载初始的10条数据},loadMore(n){//n是默认初始展示的条数会在渲染的时候就可以获取,具体可以打log查看//if(n < 8) this.rangeNumber = 10 //elementui下拉超过7条才会出滚动条,如果初始不出滚动条无法触发loadMore方法return () => this.rangeNumber += 5 //每次滚动到底部可以新增条数  可自定义},}
}
</script><style lang="less" scoped>
.content{padding: 24px 24px;.el-input{width: 400px;margin: 20px;}
}
</style>

在这里插入图片描述

场景二 10万条数据客户不可能一直滚动下去找自己想要数据,这时候就需要搜索解决

下面代码没有用el-select搜索是因为在使用过程中发现模糊查询不能满足自己,所以自己就写了一个input框,使用watch监听,详情见代码

<template><div class="content"><el-select v-model="choose" size="small" v-el-select-loadmore:rangeNumber="loadMore(rangeNumber)"><el-input v-model="search" size="small" placeholder="请输入搜索内容"></el-input><el-optionv-for="(item, index) in list.slice(0, rangeNumber)" :key="index":label="item.label":value="item.value"></el-option></el-select></div>
</template><script>
import Vue from "vue";
Vue.directive('el-select-loadmore', {bind(el, binding) {let self = this// 获取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:* ele.scrollHeight - ele.scrollTop === ele.clientHeight;*/const condition = this.scrollHeight - this.scrollTop <= this.clientHeight;if (condition) binding.value()});}}
)
export default {data() {return {list: [],choose: "",rangeNumber: 10,stashList: [],search: ""}},created(){this.getList()},watch: {search(newVal, oldVal){if(newVal){this.list = this.stashListthis.list = this.list.filter(item => {if(item.label.includes(newVal)){return item}})}else{this.list = this.stashList}}},methods: {getList(){for(let i = 0; i < 100000; i++){this.list.push({label: "menu" + i,value: "menu" + i})}//测试数据10万条数据, 这里数据多少条无所谓,list.slice(0, rangeNumber)方法只会默认加载初始的10条数据this.stashList = this.list},loadMore(n){//n是默认初始展示的条数会在渲染的时候就可以获取,具体可以打log查看//if(n < 8) this.rangeNumber = 10 //elementui下拉超过7条才会出滚动条,如果初始不出滚动条无法触发loadMore方法return () => this.rangeNumber += 5 //每次滚动到底部可以新增条数  可自定义},}
}
</script><style lang="less" scoped>
.content{padding: 24px 24px;.el-input{width: 400px;margin: 20px;}
}
</style>

文章写至此数据量大的问题已经基本解决,在写的过程中突然觉得,slice方法还是怪怪的, 这里还可以用别的方法,关于slice方法就写到这里了.

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

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

相关文章

c++ primer 笔记 (二)

第二章笔记 &#xff08;貌似记得有点多&#xff09; 把负值赋给unsigned对象时完全合法的&#xff0c;其结果是该负数对该类型的取值个数求模后的值 -1 &#xff08;对265求模&#xff09; 255float型只能保证6位有效数字&#xff0c;而double型至少可以保证10位有效数…

c#按ESC退出 或者接受其他键盘消息

From: http://blog.csdn.net/chenshizero/article/details/2173443 先将窗口的KeyPreview设置为true,然后再在窗口的KeyPressUp事件中写代码就可以了 private void Form1_KeyUp(object sender, KeyEventArgs e){if(e.KeyValue 27)//if (e.KeyData Keys.Escape)Application.Ex…

在诺基亚S60v3上运行.NET程序

诺基亚手机采用的几乎都是Symbian OS操作系统。而.NET Framework则是Windows平台的专利&#xff0c;因此.NET程序只能运行在使用Windows Mobile系统的手机上。那么Symbian OS是否就没法运行.NET程序了呢&#xff1f; 答案是否定的。RedFiveLabs一直致力于在Symbian OS上实现.NE…

React开发(162):React关于 this.props.children 总结

this.props.children 的值有三种可能&#xff1a; 如果当前组件没有子节点&#xff0c;它就是 undefined ; 如果有一个子节点&#xff0c;数据类型是 Object&#xff1b; 如果有多个子节点&#xff0c;数据类型就是 Array。

GIT提交的时候出现 ! [rejected] master -> master (non-fast-forward)错误

搜了好久&#xff0c;才找到一个能用的&#xff0c;上面的大概意思是本地库和远程库没有同步导致无法提交合并&#xff0c;那么找到原因了就好办了&#xff0c;只要将本地库和远程库同步就可以了。 git pull origin master --allow-unrelated-histories 或 git pull origin re…

响应式布局---菜单

一个简单的响应式菜单,仅使用media query实现. 上图的作用就是将普通的菜单在缩小浏览器屏幕到一定宽度,或者是在移动设备上的显示效果.现在分步进行实现: 第一步:先构建一个普通的菜单,具体显示如图: 结构如下: <nav class"nav"><ul><li class"…

C# 窗口全屏 隐藏任务栏 (代码)

From: http://blog.csdn.net/mask_of_zorro/article/details/2351091 为了解决C# Windows应用程序全屏显示&#xff0c;在网上找了很多解决方法。当然其中也有成功的方法&#xff0c;但看起来复杂且对我等菜鸟级的人来说更难于理解。其中发现以下几行代码实现真正的全屏显示&a…

Linux管理磁盘配额

&#xff21;、磁盘配额作用限制普通用户使用磁盘空间&#xff0c;不至于因为个别人的浪费而影响到其它人的正常使用&#xff1b;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />&#xff22;、需要内核的支持&#xff1b;&…

Element el-row el-col 布局组件详解

本文目录 背景分栏布局分栏间隔分栏偏移对齐方式响应式布局小结 1. 背景 element的布局方式与bootstrap原理是一样的&#xff0c;将网页划分成若干行&#xff0c;然后每行等分为若干列&#xff0c;基于这样的方式进行布局&#xff0c;形象的成为栅栏布局。 区别是element可…

sql数据库监控语句

--查找被阻塞进程 Select * from master..sysprocesses where dbid9 and blocked > 0--查找阻塞头进程 select * from master..sysprocesses p where dbid9 and blocked<0 and exists (select 1 from master..sysprocesses where blocked p.spid)--查找等待时间长的进程…

C# WinForm 中Label自动换行 解决方法

From: http://hi.baidu.com/tewuapple/blog/item/74070a2451cbcc7c36a80f76.html 在TableLayoutPannel中放着一些Label 如果把Label的AutoSize属性设成True的话&#xff0c;文字超过label长度时就会自动增加&#xff0c;直到后面的字出窗体以外 设置成False时&#xff0c;一旦…

厂家官网常用链接

<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />1、 IBM develperWorks 中国http://www.ibm.com/developerworks/cn/特点&#xff1a;归档清晰&#xff0c;文档专业质量高&#xff0c;多名家作品&#xff1b;2、 DELL中文官…

axios (get post请求、头部参数添加)傻瓜式入门axios

傻瓜式入门&#xff0c;简单粗暴说用法 通过cdn引入js文件 <script src"https://unpkg.com/axios/dist/axios.min.js"></script>get请求&#xff0c;默认’Content-Type’: ‘application/json’&#xff0c;可在头部参数中&#xff0c;修改Content-Ty…

项目最终复审报告

“北航学堂”项目最终复审报告 一、团队成员简介 Sevens团队在M1和M2阶段都是一共有七名队员&#xff0c;M1阶段我们的团队成员有&#xff1a;陈少杰&#xff0c;金鑫&#xff0c;高孟烨&#xff0c;雷元勇&#xff0c;王迪&#xff0c;邓亚梅&#xff0c;郑培蕾&#xff1b;在…

按ESC关闭当前窗口

在WinForm中经常会需要实现这样的功能&#xff1a;按ESC关闭当前窗口&#xff0c;或者按不同的键&#xff0c;实现不同的功能。 下文以实现按ESC关闭当前窗口为例&#xff1a; protected override bool ProcessCmdKey(ref Message msg, Keys keyData){/*C:\Program Files\Micro…

旁门左道也谈cacti安装

cacti作为一个优秀的流量监控软件&#xff0c;很多人都在用它&#xff0c;很多人也很想使用它。但是后面的这很多人&#xff0c;确没有能用上它。为啥呢&#xff1f;有句话说&#xff1a;“今天很难过&#xff0c;明天很难熬&#xff0c;后天很美好&#xff0c;但是很多人在明天…

js二进制流转Blob对象。Blob对象再转File对象

JavaScript 二进制转文件 使用js将blob对象转file对象 前端处理后端返回的二进制流文件 js中Blob对象一般用法 js中关于Blob对象的介绍与使用 上传的文件对象 完整代码实例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8…

Taro+react开发(61) 一条虚线

.companyIntroDetail_sep{width: 100%;height: 1px;background-color: #F3F3F3 }