最近在項目中用到了 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) },
這樣就能夠主動刷新節點數據了。若是有更好的辦法或者哪些地方不正確,但願你們指正,謝謝。接口