前提:前端拿到樹結(jié)構(gòu)的全量數(shù)據(jù),前端自己做懶加載。
需求:編輯時(shí)需要默認(rèn)展開到原來選中的那一項(xiàng)。
6000多條數(shù)據(jù)不做懶加載之前卡到頁(yè)面點(diǎn)都點(diǎn)不動(dòng),前端做了懶加載之后很流暢,這里主要記錄下要默認(rèn)展開某一項(xiàng)時(shí)的坑,
懶加載過程不做描述,代碼如下,很好理解:
<el-table
ref="multipleTable"
:data="branchList"
:row-key="getRowKey"
:expand-row-keys="getExpendKeys()"
border
lazy
:load="loadChild"
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
>
<!--列表內(nèi)容-->
</el-table>
獲取全量數(shù)據(jù):
this.branchListCopy = allData //這里allData表示從后端接口獲取到的樹結(jié)構(gòu)全量數(shù)據(jù)
//處理第一層級(jí)數(shù)據(jù)children為null
this.branchList = JSON.parse(JSON.stringify(this.branchListCopy)).map(item => {
// hasChildren 表示需要展示一個(gè)箭頭圖標(biāo)
item.hasChildren = item.children && item.children.length > 0
item.idList = [item.id]
item.children = null
return item
})
點(diǎn)擊加載子節(jié)點(diǎn):
loadChild(tree, treeNode, resolve){
// 層級(jí)關(guān)系備份
const idCopy = JSON.parse(JSON.stringify(tree.idList))
// 查找下一層數(shù)據(jù)
let resolveArr = this.branchListCopy
let id
//找到最后一層children
while (id= tree.idList.shift()) {
const tarItem = resolveArr.find(item => item.id=== id)
tarItem.loadedChildren = true
resolveArr = tarItem.children
}
// 處理下一層數(shù)據(jù)的屬性
resolveArr = JSON.parse(JSON.stringify(resolveArr))
resolveArr.forEach(item => {
item.hasChildren = item.children && item.children.length > 0
item.children = null
// 此處深拷貝,以防各個(gè)item的idList混亂
item.idList = JSON.parse(JSON.stringify(idCopy))
item.idList.push(item.id)
})
// 標(biāo)識(shí)已經(jīng)加載子節(jié)點(diǎn)
tree.loadedChildren = true
// 渲染子節(jié)點(diǎn)
resolve(resolveArr)
},
注意上面會(huì)設(shè)置一個(gè)hasChildren的屬性,表示如果該節(jié)點(diǎn)下有子節(jié)點(diǎn),添加可展開的小箭頭。
當(dāng)拿到需要默認(rèn)展開的層級(jí)id數(shù)組時(shí),修改一下初始化branchList的地方:
let selectIdList = 層級(jí)id數(shù)組
const mapChid = (list, idList) => {
list?.map((item) => {
item.hasChildren = item.children && item.children.length > 0
let idCopy = JSON.parse(JSON.stringify(idList)) || []
idCopy.push(item.orgId)
this.$set(item, 'idList', idCopy)
//判斷節(jié)點(diǎn)id是否存在于需要默認(rèn)展開的層級(jí)id數(shù)組內(nèi),不存在表示不用展開,children設(shè)置為null
if (!(selectIdList?.length && selectIdList.includes(String(item.id)))){
item.children = null
}
else if(item?.children?.length > 0){
//如果存在于層級(jí)id數(shù)組內(nèi),繼續(xù)遍歷處理下一級(jí)children
item.children = mapChid(item.children, item.idList);
//?。。。。。。。。。。。。。。。。。?!
item.hasChildren = false //?。。。。?!請(qǐng)注意此處的hasChildren
}
return item
})
return list
}
this.branchList = JSON.parse(JSON.stringify(this.branchListCopy)).map(item => {
// hasChildren 表示需要展示一個(gè)箭頭圖標(biāo)
item.hasChildren = item.children && item.children.length > 0
item.idList = [item.orgId]
// item.children = null
item.children = mapChid(item.children, item.idList)
if(selectIdList?.length && selectIdList.includes(String(item.id))){
//!?。。。。。。。。。。。。。。。。。?!
item.hasChildren = false //默認(rèn)要展開的節(jié)點(diǎn)hasChildren不能設(shè)置為true
}
return item
})
注意上面打了兩排感嘆號(hào)的地方,如果要默認(rèn)展開的節(jié)點(diǎn),hasChildren不能設(shè)置為true!
就是被這里坑了好久?。。。?br>
也不知道是怎么被我試出來的,本來不想貼代碼,為了引出最后這一點(diǎn)想想還是貼了比較好理解,所以有點(diǎn)亂,如果懶加載那一塊有問題,歡迎評(píng)論一起討論。