2021-09-06 el-tree 懶加載load 手動觸發(fā)load更新的三種方法

      <el-tree
        ref="tree"
        :props="{ children: 'child', label: 'deptName', isLeaf: 'leaf' }"
        node-key="sysDeptId"
        :expand-on-click-node="true"
        :load="loadNode"
        lazy
        @node-click="handleNodeClick"
      />

有這個懶加載并且刷新需求的老鐵肯定涉及到了節(jié)點中子節(jié)點數(shù)據(jù)的增刪改!??!

方法1

推薦,此方法有效避免直接調(diào)用loadNode(node, resolve)函數(shù),可以間接從組件內(nèi)部觸發(fā)load事件,這樣就不需要緩存resolve這個不好拿到的入?yún)?。省去后續(xù)很多麻煩事,特別是由于懶加載只加載一次導(dǎo)致緩存的數(shù)據(jù)和方法不匹配當(dāng)前點擊的節(jié)點,從而導(dǎo)致增刪改樹結(jié)構(gòu)數(shù)據(jù)時顯示異常的問題,方法2中有詳細(xì)說明。

// 刷新某個樹節(jié)點,重點?。。。?refreshNode(key) {
    // 獲取當(dāng)前節(jié)點,key可以在@node-click和:load綁定函數(shù)的回調(diào)參數(shù)node用變量存儲后有需要刷新的地方取node.key
    let node = this.$refs.tree.getNode(key);
    //  設(shè)置未進(jìn)行懶加載狀態(tài)
    node.loaded = false;
    // 重新展開節(jié)點就會間接重新觸發(fā)load達(dá)到刷新效果
    node.expand();
 },

方法2

可以在第一次懶加載數(shù)據(jù)的時候,把 loadNode 的 2 個參數(shù)保存下來,然后添加節(jié)點的時候,重新調(diào)用一下這個方法就可以了

不推薦,由于loadNode只會針對某個節(jié)點加載一次,后續(xù)再點擊你點過的這個節(jié)點的小箭頭不會再次觸發(fā)loadNode,這容易讓緩存的兩個數(shù)據(jù)this.node和this.resolve與當(dāng)前點擊節(jié)點不匹配(比如你點擊了未懶加載過的小箭頭,再去點已經(jīng)懶加載過的其他小箭頭或者節(jié)點,這時候由于已懶加載的不會再觸發(fā)loadNode函數(shù),而你緩存的this.node和this.resolve卻是上一次的,這種情況下如果你在當(dāng)前點擊的節(jié)點對子節(jié)點進(jìn)行增刪改請求后去手動調(diào)用loadNode傳入this.node和this.resolve刷新樹節(jié)點,由于傳入的數(shù)據(jù)都是上一次的,那么就會出現(xiàn)你請求的新的樹節(jié)點數(shù)據(jù)跑到上一次觸發(fā)懶加載緩存的節(jié)點去的情況,這時樹結(jié)構(gòu)的數(shù)據(jù)就顯示異常了)

// 節(jié)點懶加載事件
loadNode (node, resolve) {
    // loadNode 的 2 個參數(shù)保存下來方便下次手動調(diào)用傳入
    this.node = node
    this.resolve = resolve
    // 你的請求邏輯
    ...
    ...
},
refreshNode () {
    this.node.childNodes = [] // 這里把子節(jié)點清空,是因為再次調(diào)用 loadNode 的時候會往 childNodes 里 push 節(jié)點,所以會有節(jié)點重復(fù)的情況。
    // 把剛剛存的兩個變量手動傳入調(diào)用
    this.loadNode(this.node, this.resolve)
},

解決辦法:繁瑣容易出錯,做過各種嘗試都不太理想,不再深究。

方法3

可使用官方提供的 append 方法,代碼如下,nodeData 就是你新增的數(shù)據(jù)。但是這種方法有一個問題,這只是前臺在添加完成后(接口返回成功),偽造的一條數(shù)據(jù),目的只是讓用戶看到添加成功了一條數(shù)據(jù),并沒有重新請求接口并刷新所有的節(jié)點。

不推薦,如果新增成功以后,不做任何操作(不刷新頁面),去刪除此節(jié)點,會發(fā)現(xiàn)此節(jié)點沒有 ID ,刪除不了,也就是說添加成功后我們前端沒有拿到屬于該節(jié)點的 ID ,所以沒法刪除。

添加節(jié)點方法

addNode (node, data) {
    const nodeData = {name: '新增節(jié)點'}
    this.$refs.tree.append(nodeData, node)
}

解決辦法:可以與后臺協(xié)商,在添加成功對接口里返回該節(jié)點對 ID,然后 append 節(jié)點的時候,把此節(jié)點的 ID 也添加進(jìn)去,就 OK 了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容