我用Vue创建了一个SPA(类似于云盘),使用Element.ui tree组件来显示文件夹树形结构。问题在于这个树形结构并不会一次性加载全部内容,而是通过lazy修饰符逐步加载。
服务器部分采用mongoose + mongoose-path-tree。使用mongoose-path-tree意味着数据库中的树形存储方案如下:每个节点不知道其子节点,但子节点存储其到根元素的完整路径:
#root_id #subroot_id # ... #parent_id #this_id
问题在于,如果用户对树进行更改(加载文件、创建新文件夹等),并且服务器接受了这些更改,那么如何通知树需要加载新数据。Element 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)
}