我使用Element.ui tree组件在Vue上创建SPA(类似于云盘),以显示文件夹树。问题是树本身不会立即加载所有内容,而是在惰性修饰符的帮助下顺序加载。
服务器部分是mongoose + mongoose-path-tree。使用mongoose-path-tree意味着数据库中的树存储方案是下一个:每个节点都不知道它的子节点,但子节点存储它们到根元素的完整路径:
#root_id #subroot_id # ... #parent_id #this_id
问题是如果用户对树进行更改(加载文件,创建新文件夹等)并且服务器接受它们,那么如何通知树需要它加载新数据。元文件ui在其文档中没有描述如何捕获事件以重新绘制树。
客户端树模板
<el-tree
:props="defaultProps"
:load="loadNode"
@node-click="handleNodeClick"
:expand-on-click-node="false"
lazy
node-key="id"
ref="tree"
/>
加载新节点
loadNode: async function (node, resolve) {
try {
let firstGeneration = await foldersAPI.get(this.$store.state.user.myDrive);
if (node.level === 0) {
return resolve(firstGeneration.data.folder.children);
} else {
var data;
if (node.data.hasChildren) {
let children = await foldersAPI.get(node.data._id);
console.log(children);
data = children.data.folder.children;
} else {
data = [];
}
resolve(data);
}
} catch (e) {
console.log(e)
}
答案 0 :(得分:4)
我的解决方案是通过将v-if属性添加到树视图然后创建方法来简单地重新渲染树视图
reload() {
this.show = false;
this.$nextTick(() => {
this.show = true
})
}
调用该重载函数然后正确地重新加载树视图
答案 1 :(得分:0)
尝试将计算变量作为树组件的prop传递。计算中的所有更改都将触发树的重新呈现。
答案 2 :(得分:0)
您可以为组件设置一个 key
属性,然后只需更改 key
值,组件将重新渲染。
<el-tree
:props="defaultProps"
:load="loadNode"
@node-click="handleNodeClick"
:expand-on-click-node="false"
lazy
node-key="id"
ref="tree"
:key="myKey"
/>
阅读文档了解更多详情:https://vuejs.org/v2/guide/conditional.html#Controlling-Reusable-Elements-with-key