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

news2024/11/26 9:36:31

前言

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) * showCount
    showOptions.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 = out
            console.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 += 1
                console.log("滚动到底部了显示下一页")
                loading.value = true
                // 滚动条滚回顶部
                outer.value.scrollTop = 10
                setTimeout(() => {
                    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 = 10
            setTimeout(() => {
                loading.value = false
            }, 500)
        }
    }
    // 更新显示的值
    updateShowOptions()
}

</script>

<style lang="scss" scoped></style>

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

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

相关文章

Activiti基础入门

文章目录 Activiti项目搭建引用依赖项Activiti服务初始化数据库配置配置文件测试demo Activiti功能服务RepositoryService&#xff1a;RuntimeService&#xff1a;TaskService&#xff1a;HistoryService&#xff1a;ManagementService&#xff1a;DynamicBpmnService&#xff…

使用【宝塔+docker】在云服务器上部署基于SpringBoot 和 Dubbo RPC 的项目:踩坑记录

待部署的项目包括&#xff1a;前端front&#xff0c;服务提供者backend&#xff0c;服务消费者gateway&#xff0c;注册中心nacos 服务器信息&#xff1a;腾讯云入门级服务器2核2G&#xff08;后续有对服务器进行升级&#xff09; 部署工具&#xff1a;前端使用宝塔部署&#x…

【python】logging报错KeyError: ‘formatters‘

报错 Traceback (most recent call last):File "E:\Python\lib\runpy.py", line 194, in _run_module_as_main return _run_code(code, main_globals, None, File &qu…

免费电脑清理工具:清除垃圾文件,提升性能表现

当电脑使用一段时间后&#xff0c;许多已安装的应用程序、文件或其他项目会在硬盘上积累起来。这会导致电脑运行速度变慢&#xff0c;或Windows提示你硬盘空间不足。在这个时候&#xff0c;你需要使用电脑清理工具来清理电脑。 电脑清理软件为用户提供了一种简单的方法…

【计组】2.3浮点数表示和运算

一、浮点数的表示 浮点数尾数的规格化 注&#xff1a;进行左规和右规仅移动数值位符号位不变 解释&#xff1a;尾数的最高数值位必须是一个有效位即算术意义上的1 规格化应用&#xff08;与双符号位结合&#xff09; 规格化浮点数的特点&#xff1a; 其中首位为符号位&#…

Linux之autofs自动挂载服务

目录 Linux之autofs自动挂载服务 产生原因 安装 配置文件分析 文件路径 作用 etc/auto.master文件内容格式 挂载参数 案例 案例1 --- 服务器创建共享目录&#xff0c;客户端实现自动挂载 案例2 --- 自动挂载光盘 Linux之autofs自动挂载服务 产生原因 在一般NFS文件系…

算法训练营day42|动态规划 part04(01背包问题基础(两种解决方案)、416.分割等和子集)

文章目录 01背包----二维dp数组01背包----滚动数组416.分割等和子集思路分析背包解法思考总结 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最…

第三方软件检测机构资质要求有哪些?专业测试报告如何申请?

科技信息的快速发展使得人们对于软件产品极度依赖&#xff0c;因此要想保障产品质量&#xff0c;测试必不可少。作为一家合格的软件检测机构&#xff0c;应当严格遵守相关资质要求&#xff0c;保证测试报告的专业性和可信度。 一、第三方软件检测机构需要具备的资质 1. 认证资…

Allegro如何通过当前PCB查看env的路径操作指导

Allegro如何通过当前PCB查看env的路径操作指导 在用Allegro做PCB设计的之前,所有的快捷键都需要定义到ENV文件中。在添加env文件之前需要找到env文件的路径,如下图 不同机器定义env路径是不一样的 下面介绍如何找到env路径,具体操作如下 点击Tools选择Utlities

巨额亏损,股价遭受重创,Polestar极星汽车已陷入困境

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 8月31日&#xff0c;由吉利汽车&#xff08;00175&#xff09;和沃尔沃汽车合资创建的瑞典电动汽车公司Polestar极星汽车&#xff08;PSNY&#xff09;公布了2023年第二季度财报。 这家电动汽车公司在去年通过SPAC上市后&am…

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书南京财经大学图书馆

2023开学礼《乡村振兴战略下传统村落文化旅游设计》许少辉八一新书南京财经大学图书馆

026:vue中el-progress逆向倒计时方式显示

第026个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

【NKeditor】富文本编辑器上传图片

目录 目的&#xff1a; 效果 实现方法&#xff1a; 1、下载NKeditor插件库 2、部署 3、实现 4、自定义工具栏 目的&#xff1a; 使用NKeditor富文本编辑器上传图片&#xff0c;同时上传到七牛云存储上。后端语言使用ThinkPHP。 效果 实现方法&#xff1a; 1、下载NKe…

【构造】CF Edu 12 D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; 这种题一定要从小数据入手&#xff0c;不然很有可能走歪思路 先考虑n 1的情况&#xff0c;直接输出即可 然后是n 2的情况&#xff0c;如果相加是质数&#xff0c;就输出2个&#xff0c;否则就输出一个 然后…

使用 【jacoco】对基于 SpringBoot 和 Dubbo RPC 的项目生成测试覆盖率报告:实践+原理

基于 Dubbo RPC 的项目中有一个提供者项目backend、一个消费者项目gateway、以及注册中心nacos。本篇文章记录在windows本地对该框架的测试过程&#xff0c;以及介绍jacoco的基本原理 测试过程 官网下载安装包解压到本地&#xff0c;https://www.jacoco.org/jacoco/ 只需要用…

Bootstrap的标题类(标题样式h1~h6)

Bootstrap 的标题字体大小通常遵循以下样式规则&#xff1a; h1 标题的字体大小为 2.5rem&#xff08;40像素&#xff09;。h2 标题的字体大小为 2rem&#xff08;32像素&#xff09;。h3 标题的字体大小为 1.75rem&#xff08;28像素&#xff09;。h4 标题的字体大小为 1.5re…

《Python魔法大冒险》008 石像怪的挑战:运算符之旅

小鱼和魔法师继续深入魔法森林。不久&#xff0c;他们来到了一个巨大的魔法石圈旁边。石圈中心有一个闪闪发光的魔法水晶&#xff0c;周围则是一些神秘的符号。但令人意外的是&#xff0c;水晶的旁边还有一个巨大的石像怪&#xff0c;它的眼睛散发着红色的光芒&#xff0c;似乎…

CentOS 安装蒲公英

官方教程链接&#xff1a; https://service.oray.com/question/5063.html 教程使用的是2.3版本&#xff0c;官网下载的最新版是2.4&#xff0c;所以命令会有所不同 安装成功后&#xff0c; 任意路径下执行pgyvisitor&#xff0c;调出交互界面pgyvisitor login&#xff0c;登录…

智汇云舟亮相2023服贸会,全面展示视频孪生技术与产品

9月2日-6日&#xff0c;为期5天的2023年中国国际服务贸易交易会&#xff08;以下简称&#xff1a;服贸会&#xff09;在北京首钢园举办。在电信、计算机和信息服务专题展馆中&#xff0c;智汇云舟有幸作为北京市专精特新和数字孪生企业优秀代表受邀参展&#xff0c;并携视频孪生…

【C语言】——调试技巧

目录 ​编辑 ①前言 1.什么是Bug&#xff1f; 2.什么是调试&#xff1f; 2.1调试的基本步骤 2.2Release与Debug 3.常用快捷键 4.如何写出好的代码 4.1常见的coding技巧 &#x1f449;assert() &#x1f449;const() const修饰指针: ①前言 调试是每个程序员都…