最近在项目中用到了 elementUI 的懒加载 tree 组件,由于项目里有新增、修改、删除节点的功能,使用了之后发现不能主动更新 tree 的数据,查阅资料,发现找不到解决的方案,最后尝试了 N 多种方法,最后终于搞定了。html
先上一部分代码前端
html 部分node
<el-tree :load="loadNode" lazy :props="props" ref="tree" node-key="id" :expand-on-click-node="false" style="margin-top: 10px;"> <span slot-scope="{ node, data }"> <span>{{ `课程:${node.label}` }}</span> <span style="margin-left: 100px; font-size: 14px;"> <el-button type="text" size="mini" @click="() => editNode(node, data)"> 修改课程 </el-button> <el-button v-if="node.level === 1" type="text" size="mini" @click="() => addNode(node, data)"> 新增课程 </el-button> <el-button type="text" size="mini" style="color: #fd8076" @click="() => delTree(node, data)"> 删除课程 </el-button> </span> </span> </el-tree>
加载数据的方法app
loadNode (node, resolve) { // 这里是由于1、二级的节点请求的接口不同,因此作一些处理,不用管这个 const url = node.level === 0 ? this.treeUrlHash[node.level] : `${this.treeUrlHash[node.level]}/${node.data.id}` this.$http('get', url) .then(res => { if (res.code === '200') { resolve(res.data) } }) }
下面我用新增节点来讲明:this
添加节点方法url
addNode (node, data) { const nodeData = {name: '新增节点'} this.$refs.tree.append(nodeData, node) },
那么怎么处理呢,能够与后台协商,在添加成功对接口里返回该节点对 ID,而后 append 节点的时候,把此节点的 ID 也添加进去,就 OK 了。spa
加载数据的方法code
loadNode (node, resolve) { // isFirst 为了保证只在第一次加载的时候进行 if (this.isFirst) { this.node = node this.resolve = resolve this.isFirst = false } // 这里是由于 1 2 级的节点请求的接口不同,因此作一些处理 const url = node.level === 0 ? this.treeUrlHash[node.level] : `${this.treeUrlHash[node.level]}/${node.data.id}` this.$http('get', url) .then(res => { if (res.code === '200') { resolve(res.data) } }) }
添加节点方法htm
addNode (node, data) { this.node.childNodes = [] // 这里把子节点清空,是由于再次调用 loadNode 的时候会往 childNodes 里 push 节点,因此会有节点重复的状况。 this.loadNode(this.node, this.resolve) },
这样就能够主动刷新节点数据了。若是有更好的办法或者哪些地方不正确,但愿你们指正,谢谢。接口