赞
踩
最近遇到一个要在elemen-ui的el-table放一个树结构的表数据
但是因为数据实在过多,而且列也有四五列,还有操作列
dom操作频繁导致页面非常的卡顿
网上看了很多种方法以及elementui的官方方法
使用lazy和load方法终于解决
对应el-table
<el-table v-if="refreshTable" v-loading="loading" :data="list" row-key="id" lazy :load="load" :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
1、设置一份list展示,为了不全部渲染导致页面卡顿,将list的children数据置空,再设置hasChildren 为true表示有展开数据
2、完全拷贝一份数据 listCopy 保存下来,后面查找子节点
getList() { this.loading = true; //获取后端接口数据 listOrgAll(this.queryParams).then(res => { this.list = res.data this.listCopy = JSON.parse(JSON.stringify(res.data)) // 备份的全量数据 this.list.map(item => { if(item.children.length > 0) { item.hasChildren = true item.children = [] } }) this.loading = false; }); },
递归查找备份的全量数据,找到对应的children数据,将children数据返回
// 树结构获取数据 load(tree, treeNode, resolve) { // 查找子节点数据 function findNodeById (node, id) { // 找到对应id数据 if (node.id === id) { // 拷贝当前节点数据 const newNode = { ...node }; if (newNode.children && newNode.children.length > 0) { // 修改查找到的对应id的children数据,把找到的数据里面的children数据置空,并设置hasChildren newNode.children = newNode.children.map(child => { return { ...child, //id: child.id, //name: child.name, //parentId: child.parentId, // 设置hasChildren判断是否显示展开按钮 hasChildren: child.children.length >0 ? true : false, children: [] // 置空子节点 }; }); } return newNode.children; } // 递归查找每一层的children数据 if (node.children && node.children.length > 0) { for (let i = 0; i < node.children.length; i++) { const result = findNodeById(node.children[i], id); if (result) { return result; } } } return null; } const foundNode = findNodeById(this.listCopy[0], tree.id); console.log(foundNode); resolve(foundNode) },
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。