詳解如何實現Element樹形控件Tree在懶加載模式下的動態(tài)更新
Element提供的Tree樹形控件,可以用清晰的層級結構展示信息,還可以展開或折疊。Tree支持兩種加載模式:一次性加載全部樹節(jié)點和懶加載模式。所謂懶加載模式,是指當需要展開父節(jié)點時才渲染子節(jié)點。懶加載模式的應用場景適合樹節(jié)點數據量大的情形,在一定程度上可以優(yōu)化圖形用戶界面的響應效率以及提升用戶體驗。但是,懶加載模式對數據動態(tài)刷新應用需求的支持不盡如意。樹形控件節(jié)點一旦展開就緩存在本地,后續(xù)不會再繼續(xù)更新和刷新節(jié)點數據。本文將介紹如何實現Element樹形控件Tree在懶加載模式下的動態(tài)更新。具體需求如下圖所示:
動態(tài)更新需求
當Select選擇器選擇箱變、逆變器、匯流箱或組串等類型時,Tree樹形控件會動態(tài)刷新顯示相應類型的設備名稱。我們知道在懶加載模式下,Tree樹形控件節(jié)點一旦展開,就不再重新加載節(jié)點數據。那么如何實現在選擇不同類型時動態(tài)刷新樹形控件節(jié)點數據顯示呢?一種實現思路是在Select選擇器發(fā)生變化時,在change事件中清空Tree樹形控件的全部子節(jié)點,然后再重新加載樹形控件節(jié)點數據。關鍵代碼如下圖所示:
清空樹形控件節(jié)點
首先,通過樹形控件的父節(jié)點清空所有子節(jié)點數據,然后調用loadNode1方法重新構建樹形控件懶加載數據。loadNode1是樹形控件load屬性指定的加載樹的方法,該方法在加載樹或者展開某個節(jié)點時會被自動調用。
我們可以看到,傳遞給loadNode1方法有兩個參數,this.node和this.resolve,這兩個參數都是樹形控件頂層節(jié)點屬性數值。那么,是如何獲取到這兩個參數數值的呢?具體方法是:首先,申明node和reslove兩個變量用于保存頂層節(jié)點的node和reslove數值。然后,在樹形控件加載時將node.level===0情況下的node和reslove數值保存。如下圖所示:
獲取頂層節(jié)點
loadNode1內部是通過reslove方法,將數據逐級推至樹形控件數據結構中的。先執(zhí)行reslove方法的數據是父節(jié)點,后執(zhí)行reslove方法的數據是子節(jié)點,在無子節(jié)點的情況下通過調用reslove([])實現。
結束語:至此,實現了Element的Tree樹形控件懶加載模式下的節(jié)點數據動態(tài)更新。在子節(jié)點數據量大的情況下,懶加載和動態(tài)更新機制,在一定程度上解決了響應效率問題,也提升了用戶體驗。
補充:element ui 懶加載樹節(jié)點內子項的動態(tài)更新
<el-tree :props="props1" :load="loadNode1" lazy show-checkbox> </el-tree> <script> export default { data() { return { props1: { label: 'name', children: 'zones', isLeaf: 'leaf' }, }; }, methods: { loadNode1(node, resolve) { if (node.level === 0) { return resolve([{ name: 'region' }]); } if (node.level > 1) return resolve([]); setTimeout(() => { const data = [{ name: 'leaf', leaf: true }, { name: 'zone' }]; resolve(data); }, 500); } } }; </script>
上面代碼是element ui官方樹懶加載的實例。實現就是添加lazy,綁定一個load屬性,點擊節(jié)點的時候,就會觸發(fā)loadNode1的方法,將數據刷到點擊的節(jié)點里面。
這里的問題是:如果該節(jié)點load過數據,再次點擊是不會觸發(fā)loadNode1這個方法的,但是這個節(jié)點下的子節(jié)點也許會動態(tài)增加或者刪除
解決的思路是:
1、得到選中的節(jié)點
2、將選中節(jié)點的子節(jié)點全部刪除
3、將選中節(jié)點的子節(jié)點數據手動刷到該節(jié)點內
我查過element ui源碼,這里用到源碼內的方法,所以我們實現下來很方便,只要三行代碼
function refreshLazyTree(node, children) { var theChildren = node.childNodes theChildren.splice(0, theChildren.length) node.doCreateChildren(children) }
1、node就是選中的的節(jié)點(也就是點擊展開的節(jié)點),你可以通過element ui里的getNode方法獲得,也可以直接監(jiān)聽@node-click事件直接獲取選中的節(jié)點。
2、children就是node這個節(jié)點的子項
3、通過splice方法刪除node節(jié)點下的所有子項
4、調用doCreateChildren創(chuàng)建子項就ok了
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
vue element el-form 多級嵌套驗證的實現示例
本文主要介紹了vue element el-form 多級嵌套驗證的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08