在使用 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…