使用el-table做成樹形結構并解決數(shù)據(jù)驅動視圖問題
el-table做成樹形結構并解決數(shù)據(jù)驅動視圖問題
我們在完成一個樹形表格后,需要對數(shù)據(jù)進行增刪改查動作,同時讓我們保存數(shù)據(jù)渲染到表格上。
這時我們就會發(fā)現(xiàn)一個大大滴問題?。?!
我們在對第一層樹狀結構表格進行增刪改后,再調取刷新列表方法是正常渲染的。但是我們給第一層增加子級時候,或者刪除第二層內數(shù)據(jù),亦或者修改第二層以內數(shù)據(jù)就會發(fā)現(xiàn),調取的刷新列表方法是沒有效果,我們再手動刷新頁面后數(shù)據(jù)才會渲染上去???!
這個問題讓我心里一咯噔,不會吧不會吧?。?!又讓我碰上這該s的難題o(╥﹏╥)o
我在網友博客上找到一種方法:lazyTreeNodeMap 是 el-table 組件中的一個屬性,用于存儲懶加載樹節(jié)點的映射關系。
話不多說,開整!
整體架構流程
第一步:首先我們先把el-table的樹形結構搭出來,如果還沒有做好樹形table表,可以看一下我之前文章有一遍如何搭建的

<el-table
ref="tableRef"
lazy
border
highlight-current-row
height="300"
row-key="listId"
style="width: 100%; margin-bottom: 10px"
:load="load"
:data="list"
:default-expand-all="isExpandAll"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
>第二步:我們在data里面聲明一個map來存儲我們load回調數(shù)據(jù)
maps: new Map(),
第三步:加載子節(jié)點數(shù)據(jù)的函數(shù),lazy 為 true 時生效,函數(shù)第二個參數(shù)包含了節(jié)點的層級信息。
這里獲取子節(jié)點數(shù)據(jù),同時把加載子節(jié)點數(shù)據(jù)存進maps
load(tree, treeNode, resolve) {
this.maps.set(tree.listId, { tree, treeNode, resolve });
getUdmBppjDataList({ listId: tree.listId }).then((res) => {
const childList = res.rows;
// 必要設置,不然沒有下級圖標
childList.forEach((item) => {
(item.hasChildren = true), (item.children = null);
});
setTimeout(() => {
resolve(childList);
}, 200);
});
},第四步:這個是刷新的方法 ,主要是刷新子級列表數(shù)據(jù)的方法,我們在增加、修改、刪除子級時候調用這個方法。如果為你對最外層進行增刪改查不需要調用該方法。
整編文章精髓主要在這段代碼上: this.$refs.tableRef.store.states.lazyTreeNodeMap
refresh(parentId) {
// 根據(jù)父級id取出對應節(jié)點數(shù)據(jù)
const { row, treeNode, resolve } = this.maps.get(parentId);
// 通過接口獲取想要刷新的 父節(jié)點里面所有子節(jié)點數(shù)據(jù)的數(shù)組
getUdmBppjDataList({ listId: parentId }).then((res) => {
res.rows.forEach((item) => {
// 必要設置,不然沒有下級圖標
item.hasChildren = true;
item.children = null;
});
// 這個是刷新的方法 最后一個參數(shù)是最新的子節(jié)點數(shù)據(jù)的數(shù)組--相當于吧新數(shù)組替換舊數(shù)組
this.$set(this.$refs.tableRef.store.states.lazyTreeNodeMap, parentId, res.rows);
});
if (row) {
this.load(row, treeNode, resolve);
}
},第五步:這是我調用上面的我們寫的刷新的方法。
tip:一定要注意執(zhí)行順序,負責會出現(xiàn)線程問題,有時候能增加成功有時候又不行!??!
if (this.titleDialog === '增加同級部件信息') {
postUdmBppjDataList(obj).then((res) => {
this.$message({
message: '增加同級部件信息成功!',
type: 'success',
duration: 1000,
});
this.getList();
// 當table 里面沒有數(shù)據(jù)時候不調用 refresh 和 當點擊第一層時候也不調用
if (this.list.length > 0 && this.list[0].parentListId !== this.rowData.parentListId) {
this.refresh(this.rowData.parentListId);
}
});
} 第六步:去嘗試我們寫的方法吧!

技術名詞解釋
load(tree, treeNode, resolve):
tree:表示當前的樹形數(shù)據(jù)結構,通常是整棵樹的數(shù)據(jù)。在調用load方法時,會傳入當前的樹形數(shù)據(jù)結構,您可以通過該參數(shù)獲取整棵樹的數(shù)據(jù)。treeNode:表示當前需要加載子節(jié)點數(shù)據(jù)的樹節(jié)點對象。在調用load方法時,會傳入需要加載子節(jié)點數(shù)據(jù)的樹節(jié)點對象,您可以通過該參數(shù)獲取該節(jié)點的相關信息,如節(jié)點數(shù)據(jù)、父節(jié)點等。resolve:是一個回調函數(shù),用于在獲取子節(jié)點數(shù)據(jù)后進行回調處理。您需要在load方法中獲取子節(jié)點數(shù)據(jù),并在獲取數(shù)據(jù)后調用resolve函數(shù)并傳入子節(jié)點數(shù)據(jù),以告知el-table組件加載成功并渲染子節(jié)點數(shù)據(jù)。
總結
這里的難點就是不知道有 lazyTreeNodeMap 這個屬性,和使用他的方法!
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
基于VuePress 輕量級靜態(tài)網站生成器的實現(xiàn)方法
VuePress是一個基于Vue的輕量級靜態(tài)網站生成器以及為編寫技術文檔而優(yōu)化的默認主題。這么文章給大家詳細介紹了vuepress 靜態(tài)網站生成器的方法,需要的朋友參考下吧2018-04-04
vue 3 中watch 和watchEffect 的新用法
本篇文章主要通過 Options API 和 Composition API 對比 watch 的使用方法,讓大家快速掌握 vue3 中 watch 新用法,需要的朋友可以參考一下哦,希望對大家有所幫助2021-11-11

