在使用此类树形列表时,懒加载数据时会遇到数据无法实时刷新的问题,需要手动刷新才能正常显示,这时可以使用下面的方法:
1.首先在data return中加入一个map来用于存取数据
data() {
return {
maps: new Map()
}
}
2.在el-tree或树形列表组件加载子级的方法中,用map存下每次被加载的父节点
async loadChildren(tree, treeNode, resolve) {
this.maps.set(tree.id, { tree, treeNode, resolve }) //储存数据
const listQuery = {
page: 0,
size: 200,
parentId: tree.id
}
const resp = await this.getChildren(listQuery)
resolve(resp.data)
},
3.封装一个refreshLoadTree方法,每次增删改查操作后都调用一下,以此达到实时刷新目的
refreshLoadTree(lazyTreeNodeMap, maps, parentId) {
if (maps.get(parentId)) {
const { tree, treeNode, resolve } = maps.get(parentId)
this.$set(lazyTreeNodeMap, parentId, [])
if (tree) { // 重新执行父节点加载子级操作
this.loadChildren(tree, treeNode, resolve)
if (tree.parentId) { // 若存在爷爷结点,则执行爷爷节点加载子级操作,防止最后一个子节点被删除后父节点不显示删除按钮
const a = maps.get(tree.parentId)
this.loadChildren(a.tree, a.treeNode, a.resolve)
}
}
}
}
这里传入的三个参数分别是:组件懒加载数据的节点,data return的map,以及被操作的节点的父节点
this.refreshLoadTree(this.$refs.table.store.states.lazyTreeNodeMap, this.maps, this.temp.parentId)
方法调用时首先从map中取出刚刚加载过子级的节点的数据,再用this.$set清空对应父节点的数据,实现了视图的实时刷新,再通过取出的数据重新加载父节点数据。
记得对组件加上命名
<el-table
ref="table"
>
在增加,删除,编辑,加载子级操作的方法中调用这个方法,可以发现数据已经能实时刷新了。
好了,结束了。