前言
element-ui中的懶加載文檔解釋的不算詳細,實際處理時有的需求也是查了半天才實現的
先貼一下我的樹的定義,主要,我這里綁定的ref
是list
,綁定的數據是roomList
,當然lazy
是true
<el-table
ref="list"
:data="roomList"
row-key="id"
size="small"
:lazy="true"
:load="loadChildrenRoom"
:row-class-name="getRowClass"
>
xxxxxx
</el-table
問題1:節點數據更新以后,如何更新子節點數據?
如果只是單純的更新綁定的數據,我這邊嘗試是不能更新節點數據的。
這個在網上能搜到不少,最終我能夠使用的方案,是在重新加載時,清空對應ref
下的這兩個數據:
this.$set(this.$refs["list"].store.states, "lazyTreeNodeMap", {});
this.$set(this.$refs["list"].store.states, "treeData", {});
我嘗試的結果是無論少清除哪一個,都會有問題
問題2,編輯子節點保存以后,樹就收縮了,那么如果在保存完成后,自動再展開到子節點呢?
注:我這里處理的情況都是最多一層子節點,所以代碼只考慮了一層。
這個問題我在網上搜了半天,最接近的就是這篇文章地址,不過很遺憾,我按照這個方式,設置hasChildren
和children
並不能起效。
搗鼓了半天,最后發現,還是需要從上面的lazyTreeNodeMap
和treeData
入手。
通過打印,我發現treeData
實際包含了各個節點信息,其中有一個關鍵屬性是expanded
,就是表示該節點是否展開(當然如果不是雙向綁定可能也是白搭,不過測試發現通過設置這個值確實可以觸發展開)。
而lazyTreeNodeMap
包含了所有待展開葉子節點的數據。
所以最后的解決方案是,在正常加載完第一層節點數據后:
- 獲取需要展開的節點的子節點
- 將子節點設置到需要展開的節點的
children
屬性上,並將hasChildren
屬性設置為false
(如果不設置false,會有小bug,展開的小箭頭狀態與實際展開狀態不對應) - 在
treeData
中設置該節點的expanded
屬性
//treeData[id]中的id就是需要展開節點的table定義的rowkey屬性值
this.$set(
this.$refs["list"].store.states.treeData[id],
"expanded",
true
);