element ui树形表格数据懒加载

本文介绍了在处理大量数据时,前端如何使用懒加载优化用户体验。通过设置row-key作为表格唯一标识,利用data属性加载初始数据,并在load方法中按需加载子数据。当用户点击展开图标时,根据触发事件的数据id调用接口获取子数据,更新hasChildren属性,再由resolve返回,实现数据的动态加载。

参考这篇博客

在项目实战中,我们经常会遇到数据量大的情况,假如一次性从后端接口中获取所有的数据,无疑给了服务端很大的压力。响应时间过长导致用户的体验也不好,这个时候我们经常使用懒加载的方法来获取列表数据。

在这里插入图片描述
row-key是这个表格必须要的 key就是唯一标识 这个有id的话肯定是用id的
然后就是data属性 这个通常做第一层数据的来源
load方法就是每次点击展开时出发的方法。

先要在第一个生命周期中请求最顶级的数据 并给和表格data属性绑定的tableData赋值item.hasChildren属性为true 这条数据的前面就会出现那个表示可以展开的小箭头 为false 则不展示。
在这里插入图片描述
然后我们来编写load对应的函数
在这里插入图片描述
这个函数时在当某一条数据前面的展开小箭头被点击时触发的
接收三个参数
第一个是触发这个事件的那条数据
第二个我们不需要使用
第三个是返回给他的子数据
这里我们通过第一个参数就是触发事件的那条数据的id去调接口
然后判断接口返回的数据如果不是空的 则将他的子集循环 将他们的hasChildren 也赋为true 表示数据项是可以接着展开的
然后将调出来的子数据扔给resolve 这样他就会出现成为触发事件数据的子集。

在使用 Element UI 的 `el-table` 组件展示树形数据并实现懒加载功能时,刷新数据可能会遇到一些问题。这是由于 `el-table` 在懒加载模式下,会缓存已加载的子节点数据。如果直接对数据进行修改,表格可能不会自动刷新显示。 ### 刷新懒加载数据的解决方案 1. **手动更新 `lazyTreeNodeMap`** 当懒加载数据为空时,`el-table` 不会自动刷新,因为其内部逻辑中只有在数据长度不为 0 时才会触发更新。此时可以通过手动更新 `lazyTreeNodeMap` 来实现刷新。 ```javascript async load(tree, treeNode, resolve) { const { data } = await errorCodeApi.getSubErrorCode({ parentCode: tree.errorCode, ...this.searchForm, }); if (!data) { // 手动设置 lazyTreeNodeMap 中的值为空数组 this.$set(this.$refs.table.store.states.lazyTreeNodeMap, tree.id, []); } else { resolve(data); } // 记录节点信息 this.maps.set(tree.errorCode, { tree, treeNode, resolve }); } ``` 2. **删除子节点后刷新** 如果需要在删除子节点后刷新数据,可以直接操作 `lazyTreeNodeMap`,找到父节点并更新其子节点数组。 ```javascript deleteLazyTableItem(item) { const store = this.$refs.table.store; if (item.parent != -1) { let parentRow = store.states.data.find(child => child.id == item.parent); if (!parentRow) { const keys = Object.keys(store.states.lazyTreeNodeMap); for (let i = 0; i < keys.length; i++) { parentRow = store.states.lazyTreeNodeMap[keys[i]].find(child => child.id == item.parent); if (parentRow) { break; } } } parentRow.childrenCount--; const parent = store.states.lazyTreeNodeMap[item.parent]; const index = parent.findIndex(child => child.id == item.id); parent.splice(index, 1); } else { const parent = store.states.data; const index = parent.findIndex(child => child.id == item.id); parent.splice(index, 1); } } ``` 3. **强制刷新整个表格** 如果需要刷新整个表格数据,可以重新加载根节点数据,并清空 `lazyTreeNodeMap`,以确保所有子节点数据都会重新加载。 ```javascript refreshTable() { this.$refs.table.store.states.lazyTreeNodeMap = {}; this.loadData(); // 重新加载根节点数据 } ``` ### 优化建议 - **使用 `map` 存储节点信息** 在懒加载过程中,可以使用 `map` 存储每个节点的信息,以便在需要刷新时快速找到对应的节点和数据。 - **避免不必要的刷新** 在刷新数据时,应尽量避免对整个表格进行刷新,而是只刷新受影响的部分数据,以提高性能。 - **结合后端接口重新获取数据** 在某些情况下,直接调用后端接口重新获取数据并更新 `lazyTreeNodeMap` 是更可靠的方式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值