問題:el-tree點擊某節點的復選框由半選狀態更改為全選狀態以后,點擊該節點展開,懶加載出來子節點數據以后,該節點又變為半選狀態

具體問題場景:
用戶點擊父節點復選框將其從半選變為全選(此時子節點尚未加載)。
點擊節點展開觸發懶加載,加載子節點。
子節點加載后,組件重新計算父節點狀態,發現并非所有子節點被選中,因此父節點恢復半選狀態

解決方案:
核心思路:手動維護狀態一致性
在父節點被手動全選時,即使子節點未加載,仍需保證:
當子節點加載后,自動選中所有子節點
強制更新父節點狀態

1. 記錄用戶手動全選操作
2. 在復選框勾選事件中捕獲全選操作
3. 在懶加載子節點后強制選中子節點
4. 清理狀態記錄(在節點折疊時清理狀態記錄,避免殘留狀態影響后續操作)

代碼:

<template><el-treeref="tree":data="treeData"lazy:load="loadNode"show-checkboxnode-key="menuId"@check="handleCheck"@node-collapse="handleNodeCollapse"></el-tree>
</template><script>
export default {data() {return {treeData: [],forcedFullCheckedNodes: new Set()};},methods: {async loadNode(node, resolve) {try {// 1. 加載子節點const children = await this.fetchChildren(node.data.menuId);// 2. 如果父節點曾被強制全選,標記子節點為選中if (this.forcedFullCheckedNodes.has(node.data.menuId)) {children.forEach(child => {child.checked = true;child.indeterminate = false;});}resolve(children);// 3. 強制刷新父節點狀態this.$nextTick(() => {this.$refs.tree.updateNode(node);});} catch (error) {resolve([]);}},handleCheck(checkedNode) {// 檢測是否是手動全選操作const isManualFullCheck = !checkedNode.children && //節點沒有子節點(或子節點未加載)checkedNode.indeterminate && //節點之前處于半選狀態this.$refs.tree.getCheckedKeys().includes(checkedNode.menuId);//節點當前已全選if (isManualFullCheck) {this.forcedFullCheckedNodes.add(e.menuId);}},handleNodeCollapse(collapsedNode) {// 節點折疊時清除狀態記錄this.forcedFullCheckedNodes.delete(collapsedNode.menuId);}}
};
</script>

data中定義數據為什么使用forcedFullCheckedNodes: new Set()?

用`Set`來跟蹤那些被強制全選的節點,以確保即使子節點加載后,父節點的狀態仍保持正確。
Set是JavaScript中的一種數據結構,可以自動保證存儲的節點 ID 唯一,避免重復添加相同節點。用forcedFullCheckedNodes來記錄那些被用戶手動全選的節點ID,這樣在加載子節點時,可以檢查父節點是否在這個Set中,如果是,就強制其子節點為全選狀態,從而保持父節點的全選狀態。

為什么選擇new Set()而不是其他數據結構,比如數組。Set提供了高效的查找和添加操作,因為Set的has和add方法的時間復雜度接近O(1),而數組的includes和push可能需要遍歷,效率較低。尤其是當節點數量較多時,使用Set會更高效。


在節點折疊時清理狀態(如從 forcedFullCheckedNodes 中移除節點 ID)的原因主要有以下幾點:

1. 避免狀態殘留干擾后續操作
場景:用戶手動全選父節點 → 展開節點加載子節點并強制全選 → 折疊節點(子節點可能被銷毀或隱藏)。
風險:若保留父節點的強制全選標記,當用戶再次展開時,會重新觸發懶加載,此時如果父節點仍在 forcedFullCheckedNodes 中,會重復強制全選子節點,導致以下問題:
若用戶之前已手動取消某些子節點,重復強制全選會覆蓋用戶操作。
若數據已通過其他方式(如后端保存的 checkedKeys)初始化,強制標記會引發狀態沖突。


2. 符合用戶直覺
用戶預期:折疊操作通常意味著“暫時不再關注該節點”,此時清理臨時狀態更符合直覺。
示例:用戶手動全選父節點 → 展開處理子節點 → 折疊節點(視為操作完成)。后續再次展開時,父節點應基于當前實際子節點的選中狀態(如從后端獲取的最新狀態)決定顯示全選/選,而非依賴臨時標記。


3. 性能優化
內存管理:動態樹結構可能有大量節點,及時清理不再需要跟蹤的節點,避免 forcedFullCheckedNodes 集合無限膨脹。
響應式開銷:在 Vue 中,若使用數組或普通對象存儲標記,頻繁操作可能觸發不必要的響應式更新。而 Set 雖高效,但需手動維護。


4. 與數據持久化配合
正確流程:
用戶手動全選父節點 → 立即將所有子孫節點的選中狀態提交后端保存。
折疊節點 → 清理 forcedFullCheckedNodes 中的臨時標記。
再次展開時 → 通過后端返回的完整 checkedKeys 初始化選中狀態,而非依賴內存中的臨時標記。
優勢:確保父子節點狀態始終基于持久化數據,而非臨時內存狀態,避免數據不一致。

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

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

相關文章

FastGPT安裝前,系統環境準備工作?

1.啟用適用于 Linux 的 Windows 子系統 方法一&#xff1a;打開控制面板 -> 程序 -> 啟用或關閉Windows功能->勾選 “適用于Linux的Vindows子系統” 方法二&#xff1a;以管理員身份打開 PowerShell&#xff08;“開始”菜單 >“PowerShell” >單擊右鍵 >“…

網頁端調用本地應用打開本地文件(PDF、Word、excel、PPT)

一、背景原因 根據瀏覽器的安全策略&#xff0c;在網頁端無法直接打開本地文件&#xff0c;所以需要開發者曲線救國。 二、實現步驟 前期準備&#xff1a; 確保已安裝好可以打開文件的應用軟件&#xff0c;如&#xff0c;WPS&#xff1b; 把要打開的文件統一放在一個文件夾&am…

EnlightenGAN:低照度圖像增強

簡介 簡介:記錄如何使用EnlightenGAN來做低照度圖像增強。該論文主要是提供了一個高效無監督的生成對抗網絡,通過全球局部歧視器結構,一種自我調節的感知損失融合,以及注意機制來得到無需匹配的圖像增強效果。 論文題目:EnlightenGAN: Deep Light Enhancement Without P…

010數論——算法備賽

數論 模運算 一般求余都是對正整數的操作&#xff0c;如果對負數&#xff0c;不同編程語言結果可能不同。 C/javapythona>m,0<a%m<m-1 a<m,a%ma~5%32~-5%3 -21(-5)%(-3) -2~5%(-3)2-1正數&#xff1a;&#xff08;ab&#xff09;%m((a%m)(b%m))%m~正數&#xff…

初識Redis · C++客戶端string

目錄 前言&#xff1a; string的API使用 set get&#xff1a; expire: NX XX: mset,mget&#xff1a; getrange setrange: incr decr 前言&#xff1a; 在前文&#xff0c;我們已經學習了Redis的定制化客戶端怎么來的&#xff0c;以及如何配置好Redis定制化客戶端&…

GoogleCodeUtil.java

Google動態驗證碼實現 GoogleCodeUtil.java package zwf;import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.security.SecureRandom;/** https://mvnrepository.com/artifact/commons-codec/…

【Leetcode 每日一題】2176. 統計數組中相等且可以被整除的數對

問題背景 給你一個下標從 0 0 0 開始長度為 n n n 的整數數組 n u m s nums nums 和一個整數 k k k&#xff0c;請你返回滿足 0 ≤ i < j < n 0 \le i < j < n 0≤i<j<n&#xff0c; n u m s [ i ] n u m s [ j ] nums[i] nums[j] nums[i]nums[j] 且…

如何校驗一個字符串是否是可以正確序列化的JSON字符串呢?

方法1&#xff1a;先給一個比較暴力的方法 try {JSONObject o new JSONObject(yourString); } catch (JSONException e) {LOGGER.error("No valid json"); } 方法2&#xff1a; Object json new cn.hutool.json.JSONTokener("[{\"name\":\"t…

【路由交換方向IE認證】BGP選路原則之AS-Path屬性

文章目錄 一、路由器BGP路由的處理過程控制平面和轉發平面選路工具 二、BGP的選路順序選路的前提選路順序 三、AS-Path屬性選路原則AS-Path屬性特性AS-Path管進還是管出呢&#xff1f;使用AS-Path對進本AS的路由進行選路驗證AS-Path不接收帶本AS號的路由 四、BGP鄰居建立配置 一…

2025年熱門項目管理軟件對比:20款工具詳解

本文主要盤點的工具有&#xff1a;1. PingCode; 2. Worktile; 3. Jira; 4. Trello; 5. TAPD; 6. Monday.com; 7. 進度貓; 8. 豬齒魚; 9. 簡道云; 10. Tita項目管理等等20款項目管理軟件&#xff08;含免費&#xff09;。 在如今競爭激烈的商業環境中&#xff0c;項目管理軟件已…

yaffs_write_new_chunk()函數解析

yaffs_write_new_chunk() 是 YAFFS&#xff08;Yet Another Flash File System&#xff09;文件系統中用于將數據寫入新物理塊&#xff08;chunk&#xff09;的關鍵函數。以下是其詳細解析&#xff1a; 函數原型 int yaffs_write_new_chunk(struct yaffs_dev *dev, const u8 *…

網絡安全-Burp Suite基礎篇

聲明 本文主要用做技術分享&#xff0c;所有內容僅供參考。任何使用或者依賴于本文信息所造成的法律后果均與本人無關。請讀者自行判斷風險&#xff0c;并遵循相關法律法規。 1 Burp Suite功能介紹 1.1 Burp Suite 簡介 Burp Suite 是一款極為強大且廣受歡迎的集成化 …

網絡編程 - 2

目錄 UDP 數據報套接字編程 API 介紹 DatagramSocket DatagramPacket 補充&#xff1a; 代碼示例 - 回顯服務器 服務器端&#xff1a; 客戶端&#xff1a; 補充&#xff1a; 代碼演示 梳理代碼&#xff1a; 下面是一個大概的流程圖~ 文字解釋&#xff1a; 圖文并…

【C++深入系列】:模版詳解(上)

&#x1f525; 本文專欄&#xff1a;c &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 你不需要很厲害才能開始&#xff0c;但你需要開始才能很厲害。 ★★★ 本文前置知識&#xff1a; 類和對象&#xff08;上&#xff09; …

java 設計模式之策略模式

簡介 策略模式&#xff1a;策略模式可以定制目標對象的行為&#xff0c;它通過傳入不同的策略實現&#xff0c;來配置目標對象的行為。使用策略模式&#xff0c;就是為了定制目標對象在某個關鍵點的行為。 策略模式中的角色&#xff1a; 上下文類&#xff1a;持有一個策略類…

Perf學習

重要的能解決的問題是這些&#xff1a; perf_events is an event-oriented observability tool, which can help you solve advanced performance and troubleshooting functions. Questions that can be answered include: Why is the kernel on-CPU so much? What code-pa…

「倉頡編程語言」Demo

倉頡編程語言」Demo python 1)# 倉頡語言寫字樓管理系統示例&#xff08;虛構語法&#xff09;# 語法規則&#xff1a;中文關鍵詞 類Python邏輯定義 寫字樓管理系統屬性:租戶庫 列表.新建()報修隊列 列表.新建()費用單價 5 # 元/平方米方法 添加租戶(名稱, 樓層, 面積):…

鎖(Mutex)、信號量(Semaphore)與條件量(Condition Variable)

一、同步機制的核心意義 在多線程/多進程編程中&#xff0c;當多個執行流共享資源&#xff08;如變量、內存、文件&#xff09;時&#xff0c;可能因操作順序不確定導致數據競爭&#xff08;Data Race&#xff09;。同步機制的作用是&#xff1a; 保證原子性&#xff1a;確保…

前端基礎之《Vue(6)—組件基礎(2)》

接上一篇。 七、v-model深入學習 <html> <head><title>組件基礎-4</title><style>.score {display: inline-block;}.score>span {display: inline-block;width: 25px;height: 25px;background: url(./assets/star.png) center center / 25p…

SQL:聚合函數(Aggregate Functions)

目錄 第一性原理出發思考 ——我們為什么需要聚合函數&#xff1f; 什么是聚合函數&#xff1f; 常見聚合函數 實例講解 &#x1f538; 1. COUNT() —— 計數 &#x1f538; 2. MAX() / MIN() —— 最大 / 最小值 &#x1f538; 3. SUM() —— 求和 &#x1f538; 4. …