element plus 的樹形控件,如何根據后臺返回的節點key數組,獲取節點key對應的node節點

在使用 Element Plus 的?el-tree?組件時,如果后端返回的節點?key?數組中包含了部分選中的父級節點的?key,可能會導致該父級節點下的所有子節點也被默認選中。這是因為?el-tree?的默認行為是:如果一個父節點被選中,那么其所有子節點也會被選中。

為了解決這個問題,你需要在設置默認選中項時,手動檢查每個節點的狀態,確保只有指定的節點被選中,而其父節點和未指定的子節點不會被錯誤地選中。

以下是詳細的解決方案和代碼示例:

解決方案步驟

  1. 獲取樹形控件的引用:通過?ref?獲取?el-tree?實例,以便調用其方法。
  2. 處理后端返回的?key?數組:遍歷?key?數組,逐個設置節點的選中狀態。
  3. 手動設置節點的選中狀態:使用?setChecked?方法為每個節點單獨設置選中狀態,而不是依賴?default-checked-keys?屬性。這可以避免父節點被自動選中導致子節點全部選中的問題。
  4. 確保數據加載完成后再設置選中狀態:如果樹形控件的數據是異步加載的,確保在數據加載完成后再進行選中狀態的設置。

詳細代碼示例

<template><div><!-- 樹形控件 --><el-treeref="tree":data="treeData":props="defaultProps"node-key="id"show-checkboxdefault-expand-all@check="onCheckChange"></el-tree><!-- 按鈕觸發設置默認選中 --><button @click="setDefaultCheckedKeys">設置默認選中</button></div>
</template><script>
import { defineComponent, ref, onMounted } from 'vue';
import { ElTree, ElMessage } from 'element-plus';export default defineComponent({components: {ElTree},setup() {// 樹形控件的引用const tree = ref(null);// 樹形控件的數據(假設從后端獲取)const treeData = ref([{id: 1,label: '一級 1',children: [{ id: 4, label: '二級 1-1', children: [{ id: 9, label: '三級 1-1-1' }] },{ id: 5, label: '二級 1-2' }]},{id: 2,label: '一級 2',children: [{ id: 6, label: '二級 2-1' }]},{ id: 3, label: '一級 3', children: [] }]);// 樹形控件的配置const defaultProps = {children: 'children',label: 'label'};// 后端返回的節點 key 數組(包含部分選中的父級節點)const backendCheckedKeys = [1, 4, 6]; // 例如:選中了一級 1、二級 1-1 和二級 2-1// 存儲最終需要選中的節點 keyconst finalCheckedKeys = ref([]);// 監聽樹形控件的選中變化(可選,用于調試或進一步處理)const onCheckChange = (checkedKeys, checkedNodes, halfCheckedKeys, halfCheckedNodes) => {console.log('選中的 keys:', checkedKeys);console.log('半選中的 keys:', halfCheckedKeys);};// 設置默認選中項的方法const setDefaultCheckedKeys = () => {if (!tree.value) {ElMessage.error('樹形控件未加載完成');return;}// 清空之前的選中狀態tree.value.setCheckedKeys([]);// 遍歷后端返回的 key 數組,逐個設置選中狀態backendCheckedKeys.forEach(key => {const node = tree.value.getNode(key);if (node) {// 僅選中當前節點,不影響父節點和子節點node.setChecked(true, false); // 第二個參數為 false,表示不改變子節點的選中狀態finalCheckedKeys.value.push(key); // 記錄最終選中的 keyElMessage.success(`節點 ${node.label} 已選中`);} else {ElMessage.error(`未找到 key 為 ${key} 的節點`);}});};// 確保在樹形控件數據加載完成后再設置選中狀態onMounted(() => {// 如果數據是異步加載的,可以在這里調用 setDefaultCheckedKeys// 例如,通過 API 請求獲取數據后調用setDefaultCheckedKeys();});return {tree,treeData,defaultProps,setDefaultCheckedKeys,onCheckChange,finalCheckedKeys};}
});
</script>

代碼解析

  1. 模板部分 (<template>)

    • el-tree?組件設置了?ref="tree",用于后續獲取樹形控件的實例。
    • node-key="id"?指定了每個節點的唯一標識符為?id
    • show-checkbox?顯示復選框。
    • default-expand-all?默認展開所有節點。
    • 一個按鈕用于觸發設置默認選中項的操作。
  2. 腳本部分 (<script>)

    • 數據定義
      • treeData:樹形控件的數據結構,通常從后端獲取。這里為了示例,直接在前端定義。
      • defaultProps:配置樹形控件的屬性映射。
      • backendCheckedKeys:模擬后端返回的需要默認選中的節點?key?數組。注意,這個數組中包含了父級節點的?key(如?1),但只希望部分子節點被選中。
    • 方法定義
      • setDefaultCheckedKeys:主要方法,用于根據?backendCheckedKeys?設置默認選中項。它通過遍歷?backendCheckedKeys,使用?getNode?方法獲取對應的節點對象,然后調用?setChecked(true, false)?來僅選中當前節點,而不改變其子節點的選中狀態。這樣可以避免父節點被選中導致所有子節點被選中的問題。
      • onCheckChange:可選的監聽器,用于監聽樹形控件的選中狀態變化,便于調試或進一步處理。
    • 生命周期鉤子
      • onMounted:確保在組件掛載后調用?setDefaultCheckedKeys,特別是在數據是異步加載的情況下。
    • 響應式變量
      • finalCheckedKeys:用于記錄最終被選中的節點?key,可以在其他地方使用或展示。
  3. 關鍵邏輯

    • 避免父節點被自動選中:通過調用?node.setChecked(true, false),僅將當前節點設置為選中狀態,而不影響其子節點。這意味著即使某個父節點在?backendCheckedKeys?中,也只會選中該節點本身,而不會遞歸選中其所有子節點。
    • 清空之前的選中狀態:在設置新的默認選中項之前,先調用?tree.value.setCheckedKeys([])?清空所有選中狀態,確保不會有殘留的選中項影響結果。
    • 錯誤處理:如果某個?key?沒有對應的節點,會通過?ElMessage.error?提示用戶。

運行效果

當點擊“設置默認選中”按鈕時,樹形控件會根據?backendCheckedKeys?數組中的?key?設置相應的節點為選中狀態。由于使用了?setChecked(true, false),只有指定的節點會被選中,而其父節點和未指定的子節點不會被錯誤地選中。例如:

  • 如果?backendCheckedKeys?包含?1(一級 1)、4(二級 1-1)和?6(二級 2-1):
    • 一級 1 會被選中,但其子節點(如二級 1-2)不會被選中。
    • 二級 1-1 會被選中,且其子節點(如三級 1-1-1)不會被選中。
    • 二級 2-1 會被選中。

注意事項

  1. 確保?node-key?唯一node-key?屬性指定的字段值必須在樹形控件中是唯一的,否則可能導致意外的行為。
  2. 異步數據加載:如果樹形控件的數據是通過異步請求獲取的,確保在數據加載完成后再調用?setDefaultCheckedKeys。可以通過監聽數據加載完成的事件或使用?this.$nextTick?來實現。
  3. 性能優化:對于非常大的樹形控件,頻繁調用?getNode?和?setChecked?可能會影響性能。可以考慮優化數據結構或減少不必要的操作。
  4. 用戶體驗:在實際應用中,可能需要更復雜的邏輯來處理用戶的交互,例如允許用戶手動選擇或取消選擇某些節點,同時保持默認選中的邏輯。根據具體需求進行調整。

通過以上方法,你可以精確地控制樹形控件中哪些節點被默認選中,避免因父節點被選中而導致所有子節點被錯誤地選中的問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/86003.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/86003.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/86003.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是Sentinel

什么是 Sentinel? 在分布式系統中,服務間的依賴關系錯綜復雜。一個服務的故障,很可能像多米諾骨牌一樣,迅速蔓延并導致整個系統崩潰,這就是我們常說的“雪崩效應”。為了避免這種災難性后果,我們需要一種強大的機制來保護我們的系統,而 Sentinel 正是為此而生。 Senti…

AWS 使用圖形化界面創建 EKS 集群(零基礎教程)

無需命令行&#xff01;通過 AWS 控制臺圖形化操作&#xff0c;輕松創建 Kubernetes 集群。 文章目錄 文章簡介 一、準備工作&#xff1a;登錄 AWS 控制臺 二、創建 EKS 集群&#xff08;控制面&#xff09; 1. 創建 EKS 集群 2. 設置集群基本信息 3. 配置網絡設置 三、添加…

[C#] Winform - 進程間通信(SendMessage篇)

一、發送端 // 窗體&#xff1a;發送端 public partial class SendForm : Form {public SendForm(){InitializeComponent();}// 按鈕&#xff1a;發送private void btnSend_Click(object sender, System.EventArgs e){IntPtr hwnd User32Helper.FindWindow(null, "接收端…

鋰電池保護板測試儀:守護電池安全的幕后保障

在電動汽車、儲能電站和便攜式電子設備中&#xff0c;鋰電池作為核心動力源&#xff0c;其能量密度與安全性始終是行業關注的焦點。鋰電池在過充、過放、短路等異常情況下可能引發起火甚至爆炸&#xff0c;而鋰電池保護板正是解決這一問題的關鍵組件。為確保保護板性能可靠&…

Qemu搭建RISC-V,運行opensbi+u-boot+img

?1.先下載一個Ubuntu鏡像 https://cdimage.ubuntu.com/releases/24.04/release/ 我這里下載的是這個RISC-V的 &#x1f31f;1.2.解壓鏡像 xz -d ubuntu-24.04.2-preinstalled-server-riscv64.img.xz ?2.準備RISC-V的QEMU 打開qemu官網https://www.qemu.org/&#xff0c…

【實戰手冊】銀河麒麟服務器系統進入單用戶模式修改密碼(root)指南

目錄 前言 一、銀河麒麟單用戶模式簡介 二、進入單用戶模式修改密碼 三、登錄驗證新密碼 結語 前言 在日常服務器運維工作中&#xff0c;忘記root密碼是系統管理員偶爾會遇到的問題。作為國產操作系統的優秀代表&#xff0c;銀河麒麟服務器系統提供了通過單用戶模式重置r…

偏微分方程通解求解2

題目 求下列方程的通解: { u x y = u x u y u ? 1 ; u x y = u x u y ; u x y = u x u y u u 2 + 1 ; \begin{cases} u_{xy} = u_x u_y u^{-1}; \\ u_{xy} = u_x u_y; \\ u_{xy} = \dfrac{u_x u_y u}{u^2 + 1}; \end{cases} ????????uxy?=ux?uy?u?1;uxy?=ux?…

用于算法性能預測的 GNN 框架

大家讀完覺得有幫助記得關注和點贊&#xff01;&#xff01;&#xff01; 抽象。 數值黑盒優化中的自動算法性能預測通常依賴于問題特征&#xff0c;例如探索性景觀分析特征。這些特征通常用作機器學習模型的輸入&#xff0c;并以表格格式表示。然而&#xff0c;這種方法往往忽…

拯救海量數據:PostgreSQL分區表性能優化實戰手冊(附壓測對比)

1 分區表核心原理與生產痛點 物理存儲結構決定性能邊界 PostgreSQL分區表的本質是繼承表路由規則的邏輯封裝。當父表被查詢時&#xff0c;查詢優化器通過CHECK約束快速定位子表&#xff0c;其性能核心取決于&#xff1a; -- 關鍵系統視圖 SELECT relname, relkind, relpages …

【Wi-Fi天氣時鐘】網絡授時

文章目錄 1 網絡授時概述1.1 什么是網絡授時1.2 為什么要使用網絡授時2 API概述2.1 什么是API2.2 如何使用API3 淘寶時間API簡介4 網絡授時流程和AT指令5 網絡授時程序設計5.1 API返回信息解析5.2 RTC初始化5.3 必要的后續操作6 結語1 網絡授時概述 1.1 什么是網絡授時 首先我…

騰訊云IM即時通訊:開啟實時通信新時代

一、引言 在當今數字化浪潮席卷全球的時代&#xff0c;即時通訊已然成為互聯網世界中不可或缺的關鍵元素。無論是個人日常生活中的社交互動&#xff0c;還是企業運營里的高效協作&#xff0c;即時通訊都發揮著舉足輕重的作用&#xff0c;已然滲透到人們生活與工作的每一個角落…

js邏輯:【增量更新機制】

增量更新機制&#xff1a;在數據發生變化時&#xff0c;只對變化的部分進行更新的策略&#xff0c;而不是每次都重新處理全部數據&#xff0c;即&#xff1a;在數據發生變化時&#xff0c;只對變化的部分進行更新的策略&#xff0c;而不是每次都重新處理全部數據 watch: {base…

詳解Redis的LUA腳本、管道 (Pipelining)、事務事務 (Transactions)

1. 管道 (Pipelining) 網絡延遲 (Round-Trip Time - RTT) 瓶頸。 在傳統模式下&#xff0c;客戶端發送一個命令 -> 等待 Redis 服務器處理并返回結果 -> 再發送下一個命令。如果客戶端需要執行大量命令&#xff08;例如設置或獲取多個鍵&#xff09;&#xff0c;每個命令…

SIP 協議中的定時器

SIP&#xff08;Session Initiation Protocol&#xff09; 是一種信令協議&#xff0c;廣泛用于建立、維持和終止多媒體會話&#xff08;如VoIP通話&#xff09;。作為基于UDP等不可靠傳輸的協議&#xff0c;SIP 通過多個定時器機制來確保消息的可靠傳輸和狀態機的正常運行。 …

【機器學習深度學習】偏置項(Bias)概念

目錄 前言 一、先說結論&#xff1a;偏置項是“默認起點” 二、類比理解 類比 1&#xff1a;老師給學生的“基礎分” 類比 2&#xff1a;預測房價時的“固定成本” 三、沒有偏置項的模型&#xff0c;會有什么問題&#xff1f; 四、在神經網絡中&#xff0c;偏置項是神經…

使用數組 海選女主角

問題描述 面試那天&#xff0c;剛好來了m * n個MM&#xff0c;站成一個m * n的隊列&#xff0c;副導演Fe(OH)2為每個MM打了分數&#xff0c;分數都是32位有符號整數。 一開始我很納悶&#xff1a;分數怎么還有負的&#xff1f;Fe(OH)2解釋說&#xff0c;根據選拔規則&#xff…

從0開始學習R語言--Day29--社交網絡分析

在探尋數據之間的關系時&#xff0c;由于數據類型的限制&#xff0c;很多時候我們可以從數據的現實角度出發去選擇方法&#xff0c;而不是一昧地從頭嘗試不同方法去分類。假如我們用的是傳染病在市面上的傳播路徑數據&#xff0c;亦或是病毒對于基因的感染模塊&#xff0c;就可…

一款基于 React 的開源酷炫動畫庫

React Bits 是一個開源的交互式 React 組件庫&#xff0c;包含一系列動畫化、交互式且完全可定制的 React 組件&#xff0c;用于構建令人驚艷且難忘的用戶界面&#xff0c;可幫助開發者在 React 應用中輕松實現各種動畫效果。它提供了超過70種動畫組件&#xff0c;分為文本動畫…

深入理解前端理念bundleless

Bundleless 是一種新興的前端開發趨勢,它的核心思想是減少或完全去除傳統的打包步驟,直接利用瀏覽器對現代 JavaScript 特性(尤其是 ES 模塊)的原生支持。這一趨勢背后的推動力包括現代瀏覽器的進步、開發者對更快開發反饋的需求以及更簡單的開發流程。以下是對 bundleless…

馬斯克YC技術核彈全拆解:Neuralink信號編譯器架構·星艦著陸AI代碼·AGI防御協議(附可復現算法核心/開源替代方案/中國技術對標路徑)

一、Neuralink技術棧深度剖析 ? 神經信號編譯架構&#xff08;基于已公開專利US20220369936&#xff09; 關鍵算法實現&#xff1a; # 運動意圖解碼核心&#xff08;簡化版&#xff09; import numpy as np from sklearn.ensemble import RandomForestClassifierclass Neura…