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

前提:前端拿到樹結(jié)構(gòu)的全量數(shù)據(jù),前端自己做懶加載。
需求:編輯時需要默認(rèn)展開到原來選中的那一項。

6000多條數(shù)據(jù)不做懶加載之前卡到頁面點都點不動,前端做了懶加載之后很流暢,這里主要記錄下要默認(rèn)展開某一項時的坑,
懶加載過程不做描述,代碼如下,很好理解:

 <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ù)
//處理第一層級數(shù)據(jù)children為null
this.branchList = JSON.parse(JSON.stringify(this.branchListCopy)).map(item => {
          // hasChildren 表示需要展示一個箭頭圖標(biāo)
          item.hasChildren = item.children && item.children.length > 0
          item.idList = [item.id]
          item.children = null
          return item
        })

點擊加載子節(jié)點:

loadChild(tree, treeNode, resolve){
      // 層級關(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
        // 此處深拷貝,以防各個item的idList混亂
        item.idList = JSON.parse(JSON.stringify(idCopy))
        item.idList.push(item.id)
      })

      // 標(biāo)識已經(jīng)加載子節(jié)點
      tree.loadedChildren = true
      // 渲染子節(jié)點
      resolve(resolveArr)
    },

注意上面會設(shè)置一個hasChildren的屬性,表示如果該節(jié)點下有子節(jié)點,添加可展開的小箭頭。

當(dāng)拿到需要默認(rèn)展開的層級id數(shù)組時,修改一下初始化branchList的地方:


      let selectIdList = 層級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é)點id是否存在于需要默認(rèn)展開的層級id數(shù)組內(nèi),不存在表示不用展開,children設(shè)置為null
          if (!(selectIdList?.length && selectIdList.includes(String(item.id)))){
            item.children = null
          }
          else if(item?.children?.length > 0){
            //如果存在于層級id數(shù)組內(nèi),繼續(xù)遍歷處理下一級children
            item.children = mapChid(item.children, item.idList);
            //?。。。。。。。。。。。。。。。。。?!
            item.hasChildren = false //!?。。。?!請注意此處的hasChildren
          }
          return item
        })
        return list
      }
      this.branchList = JSON.parse(JSON.stringify(this.branchListCopy)).map(item => {
          // hasChildren 表示需要展示一個箭頭圖標(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é)點hasChildren不能設(shè)置為true
          }
          return item
        })

注意上面打了兩排感嘆號的地方,如果要默認(rèn)展開的節(jié)點,hasChildren不能設(shè)置為true!
就是被這里坑了好久?。。?!
也不知道是怎么被我試出來的,本來不想貼代碼,為了引出最后這一點想想還是貼了比較好理解,所以有點亂,如果懶加載那一塊有問題,歡迎評論一起討論。

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

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

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