el-select数据过多的解决(纯前端)

前言

el-select数据过多这个问题应该很多人都遇到过,在生产环境中数据几百、几千条是比较常见的。当数据过多时,就会造成浏览器卡顿,如果客户电脑性能不行,浏览器直接卡死也有可能。

解决

先说一下现在项目中遇到的两种解决方案:

原解决方案

添加分页条

这种方案好像有点问题,具体什么问题忘记了,感兴趣的可以看一下:element ui 下拉框分页(下拉框数据过多)

在这里插入图片描述
滚动懒加载

这种方式是我的一个同事写的,代码就不放了。原理就是一开始加载20条数据,当列表滚动到底部的时候,加载下一个20条数据。

先解决方案

最近在思考,卡顿的根本原因就是数据太多了。那么我能否一下子把所有数据都请求过来,但是我每次就显示20条数据,当我向下滚动时我就渲染下一个20条数据。

当然有一些问题是需要解决的:

  • 数据回显的问题。当下拉绑定的值在下拉项里匹配不到时就是显示绑定的值,而不是对应的名称。目前考虑:这20条数据里如果有这个值则不处理;没有这个值,则往数组里添加上。这样会有20条数据和21条数据两种情况
  • 模糊搜索的话,也是每次显示20条数据
  • 数据切换的话打算通过鼠标滑轮事件来实现

示例

肯定会有些问题,但是作为一个demo就懒得处理了,纯粹是提供一种思路

在这里插入图片描述

<template><div><el-select v-model="selectValue" placeholder="Select" size="large" :loading="loading" filterable-change="handleVisible" :filter-method="myFilter"><el-option v-for="item in showOptions" :key="item.value" :label="item.label" :value="item.value" /></el-select></div>
</template><script lang="ts" setup>
import { ref, onMounted, nextTick } from "vue";// 绑定的值
const selectValue = ref(22);
// 下拉显示的值
const showOptions = ref<Array<any>>([])
// 下拉所有的值
const allOptions = ref<Array<any>>([])
// 每次显示的条数
const showCount = 20
// 当前页
const current = ref(1)
// 总页数
const total = ref(0)
// loading动画
const loading = ref(false)
// 外层容器
const outer = ref()
// 上一次滚动的值
const lastScrollTop = ref(0)
// 用于记录中间值
const tempList = ref<Array<any>>([])onMounted(() => {// 假设下拉值共用100条数据for (let i = 1; i <= 200; i++) {allOptions.value.push({value: i,label: 'Item ' + i})}tempList.value = allOptions.value// 计算总页数total.value = Math.ceil(200 / showCount)updateShowOptions()
})// 更新下拉显示的值
const updateShowOptions = () => {const startIndex = (current.value - 1) * showCountshowOptions.value = tempList.value.slice(startIndex, startIndex + showCount);// 处理一下绑定值的回显handleBindValue()
}// 判断当前绑定值是否在下拉里
const handleBindValue = () => {// 有绑定值但是绑定值不在下拉里if (selectValue.value && !showOptions.value.find(e => e.value == selectValue.value)) {// 找到该值对应的下拉let item = allOptions.value.find(e => e.value == selectValue.value)showOptions.value.push(item)}
}// 自定义搜索
const myFilter = (val) => {// 这一块应该也是固定显示20条数据,但是没想好怎么处理,并且筛选后的数据也会少一些// console.log("搜索:", val)tempList.value = allOptions.value.filter(e => e.label.includes(val))// 重置当前页current.value = 1// 更新总条数total.value = Math.ceil(tempList.value.length / showCount)updateShowOptions()
}// 下拉框显示处理
const handleVisible = (val) => {console.log("显示了:", val)if (val) {// 记录向下滚动的上一次值lastScrollTop.value = 0;nextTick(() => {const out = document.querySelector('.el-select-dropdown .el-select-dropdown__wrap')outer.value = outconsole.log(out, out.clientHeight)const inner = document.querySelector('ul.el-scrollbar__view')console.log(inner, inner.clientHeight)if (inner.clientHeight > out.clientHeight) {// 说明存在滚动条,可以滚动,添加滑轮滚动事件outer.value?.addEventListener('wheel', handleWeel)}})} else {// 重置下拉项current.value = 1// 更新总条数total.value = Math.ceil(tempList.value.length / showCount)tempList.value = allOptions.value}
}// 滚动事件
const handleWeel = event => {if (event.deltaY > 0) {//   console.log('向下滚动', out.scrollTop);if (lastScrollTop.value != outer.value.scrollTop) {// 说明还能往下滚lastScrollTop.value = outer.value.scrollTop} else {// 当不变时,说明滚动底部了,显示下一页的值if (lastScrollTop.value == outer.value.scrollTop && current.value < total.value) {current.value += 1console.log("滚动到底部了显示下一页")loading.value = true// 滚动条滚回顶部outer.value.scrollTop = 10setTimeout(() => {loading.value = false}, 500)}}} else if (event.deltaY < 0) {if (outer.value.scrollTop == 0 && current.value > 1) {// 滚动到0说明到头了,显示上一页的数据current.value -= 1;console.log("滚动到头了加载上一页")loading.value = true// 滚动条滚回顶部outer.value.scrollTop = 10setTimeout(() => {loading.value = false}, 500)}}// 更新显示的值updateShowOptions()
}</script><style lang="scss" scoped></style>

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

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

相关文章

python-爬虫-urllib3

导入模块 import urllib3urllib3&#xff1a;功能强大、条理清晰、用于HTTP客户端的python网络请求库 重要特征 1.线程安全 2.连接池 3.客户端SSL/TLS验证 4.使用分段编码长传文件 5.重试请求和处理HTTP复位的助手 6.支持gzip和deflate编码 7.HTTP和SOCKS的代理支持 8.100%的…

认识网线上的各种参数标号

最近工作需要&#xff0c;接触了很多不同类型的网线&#xff0c;为了能够区分不同型号的网线&#xff0c;特意做一篇笔记用来学习&#xff0c;如有记录有误之处&#xff0c;欢迎大家指正~初步认识网线 常用的网络电缆有三种&#xff1a;双绞线、同轴电缆和光纤电缆&#xff08…

uni-app 之 uni.request 网络请求API接口

uni-app 之 uni.request 网络请求API接口 image.png <template><!-- vue2的<template>里必须要有一个盒子&#xff0c;不能有两个&#xff0c;这里的盒子就是 view--><view>--- uni.request 网络请求API接口 ---<view><!-- 免费的测试接口 --…

Java线上故障排查(CPU、磁盘、内存、网络、GC)+JVM性能调优监控工具+JVM常用参数和命令

CPU/堆/类/线程 根据服务部署和项目架构&#xff0c;从如下几个方面排查&#xff1a; &#xff08;1&#xff09;运用服务器&#xff1a;排查内存&#xff0c;cpu,请求数等&#xff1b; &#xff08;2&#xff09;文件图片服务器&#xff1a;排查内存&#xff0c;cpu,请求数等…

Gateway网关

本章目标 学习目标 1、服务网关 Gateway 2、ServerWebExchange 服务网关Gateway API 网关是一个服务&#xff0c;是系统的唯一入口。从面向对象设计的角度看&#xff0c;它与外观模式类似。API 网关封装了系统内部架构&#xff0c;为每个客户端提供一个定制的 API 。它可能…

docker 方式安装mysql 主从方式keepalived实现高可用

一、环境介绍 二、MySQL安装 在两台服务器上都安装mysql 1、拉取镜像 docker pull mysql:8.0.272、创建挂载目录 mkdir -p /data/mysql/3、运行容器 主节点 docker run \--restartalways \--name master_mysql -p 3306:3306 \-e MYSQL_ROOT_PASSWORD123456 -d \-v /data/m…

FPGA开发

https://www.enclustra.com.cn/?bd_vid11435475462206745180 https://www.monolithicpower.cn/design-tools/design-tools/llc-design-tool.html https://www.elecfans.com/article/88/143/2012/20120718280641_2.html

HTTP协议初识·下篇

介绍 承接上篇&#xff1a;HTTP协议初识中篇_清风玉骨的博客-CSDN博客 本篇内容&#xff1a; 长链接 网络病毒 cookie使用&session介绍 基本工具介绍 postman 模拟客户端请求 fiddler 本地抓包的软件 https介绍 https协议原理 为什么加密 怎么加密 CA证书介绍 数字签名介绍…

阿里后端开发:抽象建模经典案例【文末送书】

文章目录 写作前面1.抽象思维2.软件世界中的抽象3. 经典抽象案例4. 抽象并非一蹴而就&#xff01;需要不断假设、验证、完善5. 推荐一本书 写作末尾 写作前面 在互联网行业&#xff0c;软件工程师面对的产品需求大都是以具象的现实世界事物概念来描述的&#xff0c;遵循的是人…

Tomcat多实例部署和动静分离

一、多实例部署&#xff1a; 多实例&#xff1a;多实例就是在一台服务器上同时开启多个不同的服务端口&#xff0c;同时运行多个服务进程&#xff0c;这些服务进程通过不同的socket监听不同的服务端口来提供服务。 1.前期准备&#xff1a; 1.关闭防火墙&#xff1a;systemctl …

Docker部署Canal监听MySQL binlog

文章目录 概念简述binlogCanal MySQL配置Canal配置创建挂载目录设置权限创建MySQl的Canal账户拉取镜像运行容器简单运行配置文件复制到宿主机修改配置文件删除之前运行的canal容器正式运行Canal容器 查看运行状态排查问题 概念简述 binlog MySQL的二进制日志binlog可以说是My…

揭秘跑腿小程序开发中的5个关键技巧,让你的应用一炮而红

作为专注于跑腿小程序开发多年的领域专家&#xff0c;我深知在如今激烈的市场竞争中&#xff0c;如何打造一个引人注目且成功的跑腿小程序是至关重要的。在本文中&#xff0c;我将为大家揭秘跑腿小程序开发中的5个关键技巧&#xff0c;助你的应用一炮而红。无论你是一个初学者还…

【Fiddler】mac m1 机器上使用 fiddler 抓取接口

mac m1 机器上使用 fiddler 抓取接口&#xff08;非虚拟机模式&#xff09; author: jwensh date:2023.09.12 文章目录 mac m1 机器上使用 fiddler 抓取接口&#xff08;非虚拟机模式&#xff09;1. 环境准备2. 进行配置3. 使用情况 1. 环境准备 想要抓取 mac 上浏览器的接口&a…

快速傅里叶变换

引言 目标 傅里叶变化&#xff08;Fourier transform&#xff09;是一种信号处理技术&#xff0c;它可以将时间信号转换为频率信号&#xff0c;即将一组具有相同数量频率的正弦波叠加在一起&#xff0c;形成一组新的正弦波。如果我们把时间信号从频域转换到时域&#xff0c;那么…

酷开科技打造更好体验服务用户

智能电视以其海量资源、智慧大屏、高清画质等特点在国内快速普及。然而&#xff0c;随着用户量的增加、用户群体的需求多元化&#xff0c;导致消费者对智能电视的应用要求越来越高&#xff0c;不仅希望智能电视内容丰富&#xff0c;最好还能拥有“多合一”的功能。 好在&#…

【unity3D】TimeLine(详细图解)

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇关于unity的TimeLine TimeLine 介绍打开TimeLine面板的方式创建TimeLine创建Track的两种方式Track的详解TimeLine的Track的分类Activation…

【送书活动】借助ChatGPT和Python,轻松实现办公自动化✨

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

tkintter四大按钮:Button,Checkbutton, Radiobutton, Menubutton

文章目录 四大按钮Button连击MenubuttonCheckbuttonRadiobutton tkinter系列&#xff1a; GUI初步&#x1f48e;布局&#x1f48e;绑定变量&#x1f48e;绑定事件&#x1f48e;消息框&#x1f48e;文件对话框控件样式扫雷小游戏&#x1f48e;强行表白神器 四大按钮 tkinter中…

总结987

考研倒计时102天 时间记录&#xff1a; 6:20起床 7:00~7:40早读&#xff0c;13年tex2 7:50~8:20实验室 8:30~8:34列日计划 8:40~11:18进步本回顾&#xff0c;记录 11&#xff1a;20~12:20计算机网络网课 2:10~3:05计网20道选择题 3:07~4:42政治1000题25道选择题纠错 …

第8章_freeRTOS入门与工程实践之内存管理

本教程基于韦东山百问网出的 DShanMCU-F103开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id724601559592 配套资料获取&#xff1a;https://rtos.100ask.net/zh/freeRTOS/DShanMCU-F103 freeRTOS系列教程之freeRTOS入…