给 el-tree添加lazy属性和load属性,load属性的值是加载数据的方法。
<el-tree
ref="tree"
node-key="id"
:load="loadNode"
lazy>
</el-tree>
async loadNode(node, resolve) {
//不同层级,选择不同处理数据的方式
if (node.level === 0) {
//为了刷新跟节点数据,记录node和resolve方法
this.rootNode = node
this.rootResolve = resolve
//获取数据的方法
let res = await this.getGroupTree()
//只要调用resolve方法,那么改节点就加载完成,方法的参数就是该节点下的数据,
//相当于非懒加载数据的children,return是为了提高性能,不会执行后续的代码
return resolve(res.map(i => ({ ...i, label: i.name, icon: "fenzu" })));
}
if (node.level >= 1) {
try {
let res = await this.getMetaDataTree(node.data)
//请求数据
return resolve(res.map(i => {
let icon = i.id.indexOf("_") > -1 ? "fenzu" : i.icon
return { ...i, label: i.name, icon }
}));
} catch (err) {
return resolve([])
}
}
},
刷新根节点数据,使用上面记录的根节点node和根节点加载的resolve方法,调用上面的方法即可
async refreshRoot() {
this.rootNode.childNodes = []
this.loadNode(this.rootNode, this.rootResolve)
}
刷新指定节点下的数据,可以和刷新根节点一样,记录每个层级的resolve方法,然后根据node节点调用load方法即可;
还有一种方法,获取指定节点,主动调用节点展开方法
async refreshNode(guid, isEdit) {
let node = this.$refs.tree.getNode(guid)
if (node && node.loaded) {
node.loaded = false
node.expand() // 主动调用展开节点方法,重新查询该节点下的所有子节点
}
},