elementui 表格樹懶加載默認(rèn)展開某一項(xiàng)的坑

前提:前端拿到樹結(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)論一起討論。

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

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

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