el-table树形数据量过大,导致页面卡顿问题及解决

 更新时间:2024年04月25日 09:34:28   作者:青云ovo  
这篇文章主要介绍了el-table树形数据量过大,导致页面卡顿问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

el-table树形数据量过大,导致页面卡顿问题

需求

  • el-table的 树状表格
  • 当层级和数据过多的时候会出现点击展开和折叠的时候卡顿
  • 数据量大,页面异常卡顿

解决

  • 采取 懒加载 的方式,将数据 一层层加上去。
  • 可以在点击展开的时候像后端请求,也可以从备份的全量数据里面找到对应层级。
  • 这种处理方式会在展开过多时慢慢变得卡顿。

注意在模板里添加

lazy
:load=“load”
:tree-props=“{children: ‘children', hasChildren: ‘hasChildren'}”
// 模板
<el-table 
  	  row-key="planId" 
	  ref="table" 
	  :data="tableData" 
	  lazy
	  :load="load"
	  :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
	  @selection-change="selectionChange" 
	>
	<el-table-column type="selection" align="center" />
    <el-table-column label="检查明细" prop="inspectDetails" />
</table>
// 数据
data: () => ({ tableData: [], list: [], ids: []}),
//方法
mounted() {
	this.search()
}
// 获取数据
async search() {
	// 这儿是将懒加载数据清除,防止调用方法出现页面不更新的情况
	this.$set(this.$refs.table.store.states, "lazyTreeNodeMap", {});
	this.$set(this.$refs.table.store.states, "treeData", {});
	const { rows } = await API_APPRAISE.APR_EXE_OS_R({
		projectId: this.$route.query.id,
	});
	// 我这块是将数据需要分组,进行了分组 ,不需要的可以跳过这儿,比如从后端获取到的直接是树形数据 就可以是
	// this.list = rows
	// this.tableData = JSON.parse(JSON.stringify(this.list)).map(item => ({
		// ..item,
		// hasChildren: item.children && item.children.length > 0,
		// children: null,
		// idList: [item.planId],
	// }))
	let group = this.groupBy(rows, 'testOrgan');
	// 备份数据,全部数据
	this.list = group.map(item => ({
		id: item.id,
		planId: item.id,
		children: this.handleTree(item.children)
	}));
	// 展示数据
	this.tableData = JSON.parse(JSON.stringify(this.list)).map(item => ({
		...item,
		// 这儿的ids 是每个节点的所有子节点及自己节点的planId, 我后续需要将它传到后端处理,不需要可以删除
		ids: this.getTreeNodes(item),
		// hasChildren 表示需要展示一个箭头图标
		hasChildren: item.children && item.children.length > 0,
		// 只展示一层
		children: null,
		// 记住层级关系
		idList: [item.planId],
	}))
},
// 分组函数
groupBy(array, key) {
	const groupedData = new Map();
	for (const item of array) {
		const group = item[key];
		if (!groupedData.has(group)) {
			groupedData.set(group, []);
		}
		groupedData.get(group).push(item);
	}
	return Array.from(groupedData, ([id, children]) => ({
		id, children
	}));
},
// 懒加载方法, 在点击下拉时会调用
load (tree, treeNode, resolve) {
	// 层级关系备份
	const idCopy = JSON.parse(JSON.stringify(tree.idList))
	// 查找下一层数据
	let resolveArr = this.list
	for (const planId of tree.idList) {
		const tarItem = resolveArr.find((item) => item.planId === planId);
		if (!tarItem) break;
		resolveArr = tarItem.children || [];
	}
	// 处理下一层数据的属性
	resolveArr = JSON.parse(JSON.stringify(resolveArr))
	resolveArr.forEach(item => {
		item.ids = this.getTreeNodes(item)
		item.hasChildren = item.children && item.children.length > 0
		item.children = null
		item.idList = [...idCopy, item.planId]
	})
	// 渲染子节点
	resolve(resolveArr)
	// 如果需要勾选 那么需要将每一个children重新挂载回去,再调用勾选的方法 
	this.$nextTick(() => {
		tree.children = resolveArr
		if (this.selectIds.includes(tree.paperId)) {
			this.setChildrenSelect(tree.children, true)
		}
	})
},
/**
* getTreeNodes 递归函数,用于遍历树形结构
* @param {Object} node - 节点对象
* @returns {Array} - 返回包含节点 planId 的数组
*/
getTreeNodes(node) {
	const result = [];

	// 遍历当前节点,获取 planId
	if (node.planId) {
		result.push(node.planId);
	}

	// 遍历子节点
	if (node.children && node.children.length > 0) {
		for (const child of node.children) {
			// 递归调用,获取子节点的 planId
			const childIds = this.getTreeNodes(child);
			result.push(...childIds);
		}
	}
	return result;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue3系列教程之插槽slot详解

    Vue3系列教程之插槽slot详解

    插槽(slot)可以说在一个 Vue 项目里面处处都有它的身影,比如我们使用一些UI 组件库的时候,我们通常可以使用插槽来自定义我们的内容,今天通过本文给大家介绍vue3插槽slot的相关知识,感兴趣的朋友一起看看吧
    2022-08-08
  • Vue 日期获取的示例代码

    Vue 日期获取的示例代码

    moment.js是一款现在对时间处理的强大的函数,这篇文章主要介绍了Vue 日期获取的示例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • 解决Vite无法分析出动态import的类型,控制台出警告的问题

    解决Vite无法分析出动态import的类型,控制台出警告的问题

    这篇文章主要介绍了解决Vite无法分析出动态import的类型,控制台出警告的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Vue scoped及deep使用方法解析

    Vue scoped及deep使用方法解析

    这篇文章主要介绍了Vue scoped及deep使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 谈谈因Vue.js引发关于getter和setter的思考

    谈谈因Vue.js引发关于getter和setter的思考

    最近因为公司的新项目决定使用Vue.js来做,但在使用的过程中发现了一个有趣的事情,因为发现的这个事情展开了一些对于getter和setter的思考,具体是什么下面通过这篇文章来一起看看吧,有需要的朋友们可以参考学习。
    2016-12-12
  • vue+iview使用树形控件的具体使用

    vue+iview使用树形控件的具体使用

    这篇文章主要介绍了vue+iview使用树形控件的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • vue项目webpack中配置src路径别名及使用方式

    vue项目webpack中配置src路径别名及使用方式

    这篇文章主要介绍了vue项目webpack中配置src路径别名及使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 图文讲解vue的v-if使用方法

    图文讲解vue的v-if使用方法

    在本篇文章里我们给大家分享了关于vue的v-if使用方法的相关知识点,有兴趣的朋友们跟着学习下。
    2019-02-02
  • 一文详解如何在Vue3+Vite中使用JSX

    一文详解如何在Vue3+Vite中使用JSX

    vite是一个由vue作者尤雨溪专门为vue打造的开发利器,其目的是使 vue项目的开发更加简单和快速,下面这篇文章主要给大家介绍了关于如何在Vue3+Vite中使用JSX的相关资料,需要的朋友可以参考下
    2023-02-02
  • vue项目element UI 版本升级过程遇到的问题及解决方案

    vue项目element UI 版本升级过程遇到的问题及解决方案

    这篇文章主要介绍了vue项目element UI 版本升级过程遇到的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01

最新评论