element-ui tree 非同步樹實現勾選自動展開、指定展開、指定勾選

来源:https://www.cnblogs.com/hdwang/archive/2022/08/11/16578072.html
-Advertisement-
Play Games

背景 項目中用到了vue的element-ui框架,用到了el-tree組件。由於數據量很大,使用了數據懶載入模式,即非同步樹。非同步樹採用覆選框進行結點選擇的時候,沒法自動展開,官方文檔找了半天也沒有找到好的辦法! 找不到相關的配置,或者方法可以使用。 經過調試與閱讀elment-ui源碼才發現有現成 ...


背景

項目中用到了vue的element-ui框架,用到了el-tree組件。由於數據量很大,使用了數據懶載入模式,即非同步樹。非同步樹採用覆選框進行結點選擇的時候,沒法自動展開,官方文檔找了半天也沒有找到好的辦法! 找不到相關的配置,或者方法可以使用。 經過調試與閱讀elment-ui源碼才發現有現成的方法可以進行結點展開。下麵就介紹結點展開的實現!

1.監聽覆選框點擊事件check

<el-tree
        :props="mulprops"
        :load="loadNode"
        lazy
        node-key="id"
        show-checkbox
        accordion
        @current-change="currentChange"
        :filter-node-method="filterNode"
        @check="handleCheck"
        ref="tree"
        :default-checked-keys="defaultCheckedNodes"
        :default-expanded-keys="defaultExpandedNodes"
    >
    </el-tree>

2.手動展開,使用node.expand()方法

handleCheck(nodeData,  treeChecked) {
      let node = this.$refs.tree.getNode(nodeData.id)
      //將選中的未展開的節點進行展開
      if(node.checked && !node.expanded){
        node.expand(function(){
          for(let i=0; i< node.childNodes.length; i++){
            node.childNodes[i].expand()
          }
        })
      }
    }

 

項目中的實現

一、覆選框勾選後能自動展開並選中,先展開再勾選也可以自動展開

1.監聽check-change事件

    <el-tree
        :props="mulprops"
        :load="loadNode"
        lazy
        node-key="id"
        show-checkbox
        accordion
        @check-change="handleCheckChange"
        :filter-node-method="filterNode"
        ref="tree"
        :default-checked-keys="defaultCheckedNodes"
        :default-expanded-keys="defaultExpandedNodes"
    >
    </el-tree>

2.編寫展開勾選結點方法

handleCheckChange(nodeData, nodeSelected) {
      let tree = this.$refs.tree;
      let node = tree.getNode(nodeData.id)

      //展開選中的未展開的節點
      this.expandCheckedNotExpandNodes(node);

      //具體業務實現
      console.log(nodeData, nodeSelected)
    },
    //展開選中的未展開的節點
    expandCheckedNotExpandNodes(node) {
      let tree = this.$refs.tree;
      if (node.checked && !node.expanded && !node.isLeaf) {
        node.expand(function () {
          let childNodes = node.childNodes;
          for (let i = 0; i < childNodes.length; i++) {
            let childNode = childNodes[i];
            //手動觸發check-change事件,事件處理函數中回繼續調用此函數,形成遞歸展開
            tree.$emit('check-change', childNode.data, childNode.checked, childNode.indeterminate);
          }
        })
      }
    },

二、 展開指定結點

   <el-input type="text" v-model='nodeDataIds' placeholder="請輸入結點數據ID(多個以逗號分割)"> ></el-input>
    <el-button type="primary" @click="expandNodes(nodeDataIds.split(','))">展開指定結點</el-button>
   

 

//展開匹配的結點,根結點預設展開
    expandNodes(nodeDataIds){
        let that = this;
        let tree = this.$refs.tree;
        let rootNode = tree.root;
        //展開一層結點函數
        let expandRootChildren = function(){
            let childNodes = rootNode.childNodes;
            for (let i = 0; i < childNodes.length; i++) {
                let childNode = childNodes[i];
                that.expandNode(childNode,nodeDataIds);
            }
        };
        //根結點未展開進行展開
        if(!rootNode.expanded){
            rootNode.expand(function(){
                //展開根結點的孩子
                expandRootChildren();
            });
        }else{
            //展開根結點的孩子
            expandRootChildren();
        }
    },
    //展開指定結點下匹配的結點
    expandNode(node, nodeDataIds){
        let that = this;
        //當前結點需要展開未展開,則展開
        if(nodeDataIds.indexOf(node.data.id) != -1){
           //孩子結點需要展開未展開,則展開
           let expandChildren = function(){
               let childNodes = node.childNodes;
               for (let i = 0; i < childNodes.length; i++) {
                  let childNode = childNodes[i];
                  //遞歸展開孩子結點
                  that.expandNode(childNode, nodeDataIds);
               }
           }
           if(!node.expanded){
               node.expand(function(){
                    expandChildren();
               });
           }else{
                expandChildren();
           }
        }
    },

 

三. 勾選指定結點

1.非同步樹,需先展開指定結點,然後有數據了才能勾選上(即:展開父結點,子節點有了數據才能勾選上)

  <el-button type="primary" @click="checkNodes(nodeDataIds.split(','))">選中指定結點</el-button>
    
  checkNodes(nodeDataIds){
         let tree = this.$refs.tree;
         tree.setCheckedKeys(nodeDataIds, false)
    }

 2.設置預設勾選的結點,首次展開會自動勾選上,適合寫數據回顯

default-checked-keys=['node001','node002']

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文是深入淺出 ahooks 源碼系列文章的第五篇,該系列已整理成文檔-地址。覺得還不錯,給個 star 支持一下哈,Thanks。 本文來探索一下 ahooks 是怎麼封裝 React 的一些執行“時機”的? Function Component VS Class Component 學習類似 R ...
  • 本文是深入淺出 ahooks 源碼系列文章的第四篇,該系列已整理成文檔-地址。覺得還不錯,給個 star 支持一下哈,Thanks。 本文來探索一下 ahooks 的 useLockFn。並由此討論一個很常見的場景,取消重覆請求。 場景 試想一下,有這麼一個場景,有一個表單,你可能多次提交,就很可能 ...
  • 本文將帶大家簡單實現一個會動的鴻蒙 LOGO。 emmm,寫本文的動機是之前在掘金看到一篇實現鴻蒙 LOGO 的文章 -- 產品經理:鴻蒙那個開場動畫挺帥的 給咱們頁面也整一個唄 鴻蒙的 LOGO 本身是這樣的: 該篇作者最終實現的是一個字母 O 的動畫展開過程: 而本文想嘗試的,是該 LOGO 的 ...
  • 問題: 今天有個小伙伴說我們前端有個頁面異常奇怪,沒有顯示數據。 開發小伙伴進行查詢之後(非專業前端),明明進行了綁定,頁面死活無法渲染,歸屬於靈異事件了,對於這種靈異事件,我總會想著記錄一下 我查看問題的時候,我一度懷疑是這個vue雙向綁定有問題,逐漸開始懷疑人生 我的操作是進入系統,賦予一個空數 ...
  • js mjpeg buffer stream 項目要求使用http和mjpeg在頁面實現實時展示視頻流 基礎知識 流操作:ReadableStream 流操作API中的ReadableStream介面呈現了一個可讀取的二進位流操作。Fetch API 通過Response的body屬性提供了一個具體 ...
  • 緩存實現 背景:有時候介面返回的數據短期內是不會改變的,可以對http介面返回的數據加緩存,即減少了後端請求,又加快了前端性能,真是一舉兩得! 實現原理:用js的Object對象即可實現緩存,{} 表示一個js對象,對象屬性名是唯一的可以作為緩存key,屬性值就是緩存value 例如: //定義緩存 ...
  • js 中 正則表達式使用 創建正則對象和test方法使用 /* 創建正則表達式的對象 語法: var 變數 = new RegExp("正則表達式","匹配模式") 或者 var 變數 = /正則表達式/ 匹配模式: i:忽略大小寫 。 g:全局匹配模式 */ //var reg = new Reg ...
  • vite打包異常,錯誤信息如下: [vite]: Rollup failed to resolve import "element-plus/es/components" from "node_modules/element-plus/es/index.js". This is most likel ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...