关于Vue中涉及到大量数据的级联菜单树状结构的数据多选勾选页面卡顿卡死问题

项目场景:如题

提示:有个需求,级联菜单树状结构的数据高达3万多条,多选,只需要最后一层级value

原因分析:页面一下子渲染大量数据会导致浏览器内存暴涨100%,导致页面卡死,而且element的el-cascader会监听每项,更是卡死

解决方案:

提示:放弃el-cascader,改用select + tree来实现,放弃element,改用原生tree配合el-select

原生tre引用依赖了vue-tree:

GitHub - wsfe/vue-tree at 2.x(vue2.x)

https://github.com/wsfe/vue-tree (vue3.x)

本人使用的vue2.x,查看文档属性方法,灵活更加需求写逻辑,目标是不卡死页面

具体实现:

// template
<template>
<!--多选-->
<el-selectv-model="showlabel"placeholder="请选择":popper-append-to-body="true"multiplecollapse-tagsclearableclass="tree-cascader"popper-class="virtual-cascader-warp"@change="handleShowLabelChange"@visible-change="handleShowLabelVisible"@clear="handleClearCascader"
><el-option value="" style="height: auto"><CTreeref="ctreeRef"v-model="formData.value":data="modelOptions":nodeClassName="node => handleNodeClassName(node)"checkableclearabletitleField="label"keyField="value"ignore-mode="parents":cascade="true"@checked-change="handleCheckTreeChange"@expand="handleCheckTreeChange":style="{ height: '290px' }"></CTree></el-option>
</el-select>
</tempalte>
// script
<script>
// 引入组件
import CTree from '@wsfe/ctree';// 菜单树状结构通过最后一层id的数组(findPathsByIdArr)获取该id的链式名称, lable 和 value
import { findPathById, findPathsByIdArr } from '@/utils'
// 获取所有的数据列表
import { allSkuTreeApi } from "@/api/activity";export default {components: {CTree,},data() {return {showlabel: [], // 仅用于select展示回显用modelOptions: [],}},methods: {// ctree - 回显,通过最后一层ID搜索全链路名称handleShowLabel() {if (this.showlabel.length) {this.showlabel = findPathsByIdArr(this.modelOptions, this.showlabel)}},// ctree - 给每个层级添加class,便于自定义样式handleNodeClassName(node) {return `node-${node._level}`},// ctree - 打开树状结构、勾选、取消handleCheckTreeChange(checkNode) {if (checkNode.length) {let arrLabel = [];checkNode.forEach((item, index) => {if (!item?.children?.length) {arrLabel.push(item.label);}});this.showlabel = arrLabel;} else {if (!this.formData.value.length) {setTimeout(() => {this.showlabel = [];}, 10);}}},// ctree - select 全部清空,联动去掉勾选handleClearCascader() {this.$refs['ctreeRef'].clearChecked();},// ctree - select选择handleShowLabelChange() {// 过滤 - 空数据,仅展示用this.showlabel = this.showlabel.filter((item) => item !== '');},// ctree - select展开收起handleShowLabelVisible(val) {if (!val) {// 收起时,ctree折叠所有,为了优化下拉必须把勾选的全部展示this.$refs['ctreeRef'].setExpandAll(false)}},// 获取数据列表async handleAllSkuTree() {const { errCode, data } = await allSkuTreeApi(); if (errCode === 0) {this.modelOptions = Object.values(data);}},}
}
</script>

<style lang="scss" scoped>// ctree.tree-cascader {::v-deep {// 层级多的话,尽量把选择框宽度弄大点.el-input {width: 700px!important;}// 隐藏、删除图标,多选都折叠了,不单个删除,如果需求需要另加单个删除逻辑,这里我直接用样式隐藏了单个删除按钮.el-tag.el-tag--info .el-tag__close {display: none;}}}
}
</style>
<style lang="scss">
// cTree组件样式
@import '~@wsfe/ctree/dist/ctree.css';.virtual-cascader-warp {height: 300px;//ctree// 设置滚动样式,高度一致& > .el-scrollbar > .el-select-dropdown__wrap {max-height: 336px;margin:0!important;.el-scrollbar__view {padding: 0;}.el-select-dropdown__item {padding-right: 0;padding-left: 10px;}}// select li的不需要变色&.el-select-dropdown.is-multiple .el-select-dropdown__item.selected {color:#606266;}.ctree-tree__wrapper  {.ctree-tree__scroll-area {& > .ctree-tree__block-area {& > .node-0,  > .node-1 {.ctree-tree-node__node-body {// 这里是需求不需要前面两级勾选,减少卡顿,故而禁止点击勾选框来勾选、全选,可以不加,更加需求灵活变动& > .ctree-tree-node__square:nth-child(2) {//display: none;pointer-events: none;opacity: 0.4;}// 这里是需求不需要前面两级勾选,减少卡顿,禁止点击文本来勾选、全选,可以不加,更加需求灵活变动& > .ctree-tree-node__title {pointer-events: none;}}}}}}
}
</style>
// 另外附上,utils中的方法/*** 菜单树状结构通过最后一层id获取该id的链式名称, lable 和 value* @param treeData 菜单树状结构* @param targetVal 最后一层ID* @param path 链式名称* @returns {*|null|*[]}*/
export function findPathById(treeData, targetVal, path = []) {for (let node of treeData) {if (node.value === targetVal) {return [...path, node.label].join('/');}if (node.children && node.children.length > 0) {let result = findPathById(node.children, targetVal, [...path, node.label]);if (result) {return result;}}}return null;
}/*** 菜单树状结构通过最后一层id的数组获取该id的链式名称, lable 和 value* @param treeData 菜单树状结构* @param targetValArr 最后一层ID数组* @param paths 链式名称* @param currentPath 当前链式名称* @returns {*|null|*[]}*/
export function findPathsByIdArr(treeData, targetValArr, currentPath = [], paths = {}) {for (let node of treeData) {const path = [...currentPath, node.label];if (targetValArr.includes(node.value)) {paths[node.value] = path.join('/');}if (node.children && node.children.length > 0) {findPathsByIdArr(node.children, targetValArr, path, paths);}}return paths ? Object.values(paths) : {};
}

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

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

相关文章

常见Linux目录和配置文件

目录 /boot/&#xff1a;开机配置文件&#xff0c;也是存放核心vmlinuz的地方 /bin/&#xff1a;系统可执行文件目录&#xff0c;CentOS7后合并到/usr/bin中&#xff0c;并链接过去 /sbin/&#xff1a;系统管理员常用指令存放目录&#xff0c;例如开关机、磁盘分区等指令&am…

基于SpringBoot+Vue的广场舞团系统(带1w+文档)

基于SpringBootVue的广场舞团系统(带1w文档) 基于SpringBootVue的广场舞团系统(带1w文档) 广场舞团&#xff0c;为用户随时随地查看广场舞团信息提供了便捷的方法&#xff0c;更重要的是大大的简化了管理员管理广场舞团信息的方式方法&#xff0c;更提供了其他想要了解广场舞团…

基于Trace的类型特化动态语言JIT编译

文章目录 Explain一、简介二、一个跟踪运行的示例三、跟踪树3.1 Traces类型特化&#xff08;Type specialization&#xff09; 3.2 Trace Trees3.3 黑名单&#xff08;Blacklisting&#xff09; 四、嵌套跟踪树4.1 Nesting Algorithm4.2 Blacklisting with Nesting 五、跟踪树优…

Java NIO 面试题及答案整理,最新面试题

Java NIO中的Buffer有哪些主要类型? Java NIO中的Buffer用于与NIO通道进行交互,作为基本的数据容器。主要类型包括: 1、ByteBuffer: 最常用的类型,用于存储字节数据。 2、CharBuffer: 用于存储字符数据。 3、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、Short…

【Pytorch】一文向您详细介绍 torch.randn_like()

&#x1f389;&#x1f525;【Pytorch】一文向您详细介绍 torch.randn_like() &#x1f525;&#x1f389; 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; …

滑动窗口题目

题目描述&#xff1a; 计算两个字符串str1和str2在给定的含有n个元素的字符串数组strs中出现的最短距离。 详细解释&#xff1a; 定义整数变量n&#xff0c;用于存储字符串数组strs的长度。定义一个vector<string>类型的变量strs&#xff0c;用于存储输入的字符串。定义…

破解反爬虫策略 /_guard/auto.js(一) 原理

背景 当用代码或者postman访问一个网站的时候&#xff0c;访问他的任何地址都会返回<script src"/_guard/auto.js"></script>&#xff0c;但是从浏览器中访问显示的页面是正常的&#xff0c;这种就是网站做了反爬虫策略。本文就是带大家来破解这种策略&…

轻松搞定一键切换主题色?分享 1 段优质 CSS 代码片段!

本内容首发于工粽号&#xff1a;程序员大澈&#xff0c;每日分享一段优质代码片段&#xff0c;欢迎关注和投稿&#xff01; 大家好&#xff0c;我是大澈&#xff01; 本文约 800 字&#xff0c;整篇阅读约需 1 分钟。 今天分享一段优质 CSS 代码片段&#xff0c;轻松实现一键切…

4.3 最小二乘近似

一、最小二乘解 A x b A\boldsymbol x\boldsymbol b Axb 经常无解&#xff0c;一般是因为方程太多了。矩阵 A A A 的行比列要多&#xff0c;即方程要多余未知数&#xff08; m > n m>n m>n&#xff09;。 n n n 个列只能张成 m m m 空间的一小部分&#xff0c;除非…

spring中的依赖注入

文章目录 spring中的依赖注入一、Autowired二、Qualifier三、Resource四、总结 spring中的依赖注入 这里主要讲述三个注解装配 一、Autowired 作用&#xff1a;自动按照类型注入。只要容器中唯一的一个bean对象类型和要注入的变量类型匹配&#xff0c;就可以注入成功。 如果i…

MySQL5.7社区版本在CentOS7系统上的安装

MySQL5.7社区版本在CentOS7系统上的安装 1.配合yum仓库 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm 2.使用yum安装MySQL5.7 yum -y install mysql-community-server 3.安装…

面向铁路、地铁旅客信息系统(PIS)的上架型整机,铁路专用M12网络接口,满足欧洲铁路应用标准

上架型整机 2U 19寸上架型整机&#xff0c;采用高性能低功耗处理器&#xff0c;能应用在宽温环境下&#xff0c;并满足欧洲铁路应用标准EN50155关于电磁兼容性&#xff0c;冲击和振动测试试验的要求&#xff0c;是一款面向铁路、地铁旅客信息系统&#xff08;PIS&#xff09;的…

C# 关于 PaddleOCRSharp OCR识别的疲劳测试

目录 关于 PaddleOCRSharp 应用范例演示 ​范例运行环境 疲劳测试 添加组件库 方法设计 调用示例 小结 关于 PaddleOCRSharp PaddleOCRSharp 是百度飞桨封装的.NET版本 OCR dll 类库&#xff0c;OCR&#xff08;Optical Character Recognition&#xff09;工具可以将…

【Java面向对象】抽象类和接口

文章目录 1.抽象类2.常见的抽象类2.1 Number类2.2 Calendar 和GregorianCalendar 3.接口4.常见接口4.1 Comparable 接口4.2 Cloneable 接口4.3 深浅拷贝 5.类的设计原则 1.抽象类 在继承的层次结构中&#xff0c;每个新的子类都使类变得更加明确和具体。如果从一个子类向父类追…

Unty 崩溃问题(Burst 1.8.2)

错误代码&#xff1a; Assertion failed on expression: exception SCRIPTING_NULL UnityEngine.StackTraceUtility:ExtractStackTrace () Unity.Burst.BurstCompiler:SendRawCommandToCompiler (string Unity版本&#xff1a;2021.3.17F1&#xff0c;Burst 1.8.2 表现&…

python安装talib库教程

【talib介绍】 Talib介绍 Talib&#xff0c;全称“Technical Analysis Library”&#xff0c;即技术分析库&#xff0c;是一个广泛应用于金融量化领域的Python库。该库由C语言编写&#xff0c;支持Python调用&#xff0c;为投资者、交易员和数据分析师提供了强大的技术分析工…

酷炫末世意境背景404单页HTML源码

源码介绍 酷炫末世意境背景404单页HTML源码&#xff0c;背景充满着破坏一切的意境&#xff0c;彷佛末世的到来&#xff0c;可以做网站错误页或者丢失页面&#xff0c;将下面的代码放到空白的HTML里面&#xff0c;然后上传到服务器里面&#xff0c;设置好重定向即可 效果预览 …

餐边柜不踩坑的尺寸和做法

大家问餐边柜怎么做好看不踩坑      十做十不做,有尺寸和总结      1,柜子的深度30和35cm就行,低于30太窄放不了东西      高于35餐厅会显得窄,      2,镂空的地方一定要做背板,      3,柜子不用装修反弹器,也不做拉手,一个容易坏,一个不好看      建议…

论文学习——基于自适应选择的动态多目标进化优化有效响应策略

论文题目&#xff1a;Effective response strategies based on adaptive selection for dynamic multi-objective evolutionary optimization 基于自适应选择的动态多目标进化优化有效响应策略&#xff08;Xiaoli Li a,b,c, Anran Cao a,∗, Kang Wang a&#xff09;Applied S…

零基础STM32单片机编程入门(十五) DHT11温湿度传感器模块实战含源码

文章目录 一.概要二.DHT11主要性能参数三.DHT11温度传感器内部框图四.DTH11模块原理图五.DHT11模块跟单片机板子接线和通讯时序1.单片机跟DHT11模块连接示意图2.单片机跟DHT11模块通讯流程与时序 六.STM32单片机DHT11温度传感器实验七.CubeMX工程源代码下载八.小结 一.概要 DH…