目前我这边的需求时:当用户的选择,只保留最顶层的选中节点

如果选中了父节点,则移除其所有子孙节点以及它的祖先节点(因为选中父节点代表选中整个分支,所以不需要再显示子节点;同时,如果存在祖先节点,那么祖先节点也会因为当前父节点的选中而变成部分选中,但我们希望只保留当前父节点,移除祖先节点)。
如果只选中了子节点(没有选中任何父节点),则移除这些子节点的所有父节点(即只显示叶子节点)

多层级选中逻辑处理:

  1. 需要同时处理父节点、子节点、祖先节点的复杂选中关系
  2. 当选中父节点时,需要自动移除其所有子节点和祖先节点
  3. 当只选中子节点时,需要移除所有父级节点
  4. 处理节点间的嵌套关系(父子、祖孙等)

性能优化:

  1. 递归遍历子节点时可能遇到深层嵌套数据结构
  2. 需要高效处理大规模节点数据集
  3. 使用Set进行去重和快速查找

状态一致性维护:

  1. 需要确保最终选中的key集合与级联选择器的实际状态一致
  2. 处理Element UI级联选择器返回的选中节点数据结构
  3. 协调flat()展开的选中值和节点树结构的关系

具体代码实现方式:

<template><el-cascaderref="cascaderRef"v-model="selectedOptions":options="options":props="{ multiple: true }"@change="handleChange"></el-cascader>
</template><script>
export default {data() {return {selectedOptions: [],options: [{value: 'parent1',label: 'Parent 1',children: [{ value: 'child1', label: 'Child 1' },{ value: 'child2', label: 'Child 2' }]}{value: 'parent2',label: 'Parent 2',children: [{ value: 'child1', label: 'Child 1' },{ value: 'child2', label: 'Child 2' }]}],selectKeys:[]};},methods: {// 选中handleChange(e) {// 获取当前选中的值(去重)const selectData = [...new Set(e.flat())];// 获取所有选中的节点const checkedNodes = this.$refs.cascaderRef.getCheckedNodes();// 找出所有选中的父节点(非叶子节点)const parentNodes = checkedNodes.filter((node) => node.children && node.children.length > 0);// 找出所有选中的子节点const childrenNodes = checkedNodes.filter((node) => node.children.length == 0);// 只选择了子节点(没有父节点) //  选中了至少一个父节点this.selectKeys =parentNodes.length === 0? this.getChildren(checkedNodes, selectData): this.getParent(parentNodes, selectData, childrenNodes);console.log(this.selectKeys, '========>');},// 处理选中父节点,去除子节点和父节点的父节点getParent(parentNodes, selectAllKey, childrenNodes) {// 创建两个Set用于存储需要移除的节点const nodesToRemove = new Set(); // 所有需要移除的节点const parentValues = new Set(); // 所有选中的父节点值// 处理每个选中的父节点parentNodes.forEach((parentNode) => {// 添加当前父节点到集合parentValues.add(parentNode.value);console.log(parentNode, 'parentNode');// 1. 收集当前父节点的所有上级节点(父节点的父节点)if (parentNode.pathNodes && parentNode.pathNodes.length > 1) {const parentPath = parentNode.pathNodes.filter((item) => !item.checked); // 移除父级节点选中数据(当前节点)parentPath.forEach((path) => nodesToRemove.add(path.value));}// 2. 递归收集所有子节点的值const collectChildrenValues = (children) => {children.forEach((child) => {nodesToRemove.add(child.value);if (child.children) {collectChildrenValues(child.children);}});};collectChildrenValues(parentNode.children);});// 3. 最终选中的值 = 原始选中值 - 需要移除的节点const finalSelected = selectAllKey.filter((value) => !nodesToRemove.has(value));// 获取当前选中的子节点,过滤掉处理过的子节点const childrenList =childrenNodes.filter((item) => !nodesToRemove.has(item.value)).map((item) => item.value) || [];const selectKey = [...new Set([...finalSelected, ...childrenList])];// console.log('处理父节点结果:', selectAllKey, {//   finalSelected,//   selectKey,//   removedNodes: [...nodesToRemove],//   parentNodes: [...parentValues],// });return selectKey;},// 处理只选中子节点的情况(移除父节)getChildren(checkedNodes, selectAllKey) {// 收集所有子节点的父级const parentPaths = [];checkedNodes.forEach((item) => {// 移除当前节点值,保留父级路径if (item.path && item.path.length > 1) {const path = item.path.slice(0, -1); // 移除最后一个元素(当前节点)parentPaths.push(...path);}});// 去重父级const uniqueParentPaths = [...new Set(parentPaths)];// 过滤掉所有父级,只保留子节点const selectKey = selectAllKey.filter((item) => !uniqueParentPaths.includes(item));// console.log('只选择子节点结果:', {//   selectKey, //当前选中//   parentPaths: uniqueParentPaths, //父级节点//   originalSelect: selectData, //所有选中数据(包含父节点)// });return selectKey;},}
};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86459.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86459.shtml
英文地址,请注明出处:http://en.pswp.cn/web/86459.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp实现远程图片下载到手机相册功能

在 UniApp 中实现点击下载图片到相册的功能&#xff0c;需要以下几个步骤&#xff1a; 1. 下载图片到本地&#xff08;uni.downloadFile&#xff09; 2. 将图片保存到相册&#xff08;uni.saveImageToPhotosAlbum&#xff09; 完整代码示例&#xff1a; <template>&l…

【世纪龙科技】吉利博瑞汽车车身诊断与校正仿真教学软件

在汽车产业蓬勃发展的当下&#xff0c;汽车车身诊断与校正技术人才的需求与日俱增。然而&#xff0c;职业院校在汽车车身教学实践中&#xff0c;却面临着学生实训机会稀缺、教学互动匮乏、过程评价缺失、学生技能提升缓慢等诸多难题。江苏世纪龙科技凭借其卓越的技术实力与行业…

极速二刷leetcode hot100

简单题 1.移动0 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 刚开始没看到非零子串的顺序不变&#xff1a; // if(nums.size() 1){// return;// }// //所有 0 移动到数组的末尾//同时保持非零元素的相对顺序。// int n nums.size();// int notZero n-1;////…

技术博客:如何用针孔相机模型理解图像

引言 大家好&#xff01;今天我们来聊聊一个非常有趣的话题——针孔相机模型。这个模型可以帮助我们理解相机是如何捕捉图像的。我们会用一些简单的数学公式来解释这个过程&#xff0c;不用担心&#xff0c;我会尽量让这些内容简单易懂。 什么是针孔相机模型&#xff1f; 针…

Nanonets-OCR:Qwen2.5VL-3B的微调模型 更强大的文档解析能力|附效果实测

一 Nanonets-OCR 简介 Nanonets-OCR不再满足于单纯提取文本&#xff0c;它能智能解析图像中的公式、表格、水印、签名、图表、复选框等复杂结构&#xff0c;并输出格式清晰的 Markdown。 核心功能 ● LaTeX 公式识别&#xff1a;自动将文中数学公式转为标准 LaTeX 格式 ●…

Git下载与使用完全指南:从安装到基础操作详解,附上git的学习网站(很直观)(可以模拟git的全过程)

一、Git简介与下载安装 1.1 Git是什么&#xff1f; Git是目前世界上最先进的分布式版本控制系统&#xff0c;由Linus Torvalds&#xff08;Linux之父&#xff09;开发。它可以高效地处理从小型到大型项目的版本管理&#xff0c;具有以下特点&#xff1a; 分布式架构&#xff…

论分布式设计

20250419-作 题目 分布式是指将一个系统或任务分解成多个子部分&#xff0c;并在多个计算机或服务器之间进行协同工作的方式。每个子部分都可以在不同的计算机节点上运行&#xff0c;彼此之间通过网络进行通信和协调。分布式技术在当今互联网应用中起着重要作用&#xff0c;例…

Vue样式绑定与条件渲染详

一、Vue样式绑定 在Vue中&#xff0c;我们可以通过多种方式动态地绑定样式&#xff0c;让界面根据数据状态变化而自动更新样式。 1. class样式绑定 (1) 字符串写法 适用场景&#xff1a;样式的类名不确定&#xff0c;需要动态指定 <template><div><!-- 绑定…

固态电池火热-美国固态电池企业QuantumScape宣布,产能规模化迈出了重要一步

美国固态电池企业QuantumScape宣布&#xff0c;其先进的Cobra隔膜工艺已成功集成到基线电池生产中&#xff0c;标志着公司生产能力规模化迈出了重要一步。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 600478 科力远 业绩固态电池 | 1.科力远发布20…

Python 商务数据分析—— NumPy 学习笔记Ⅰ

一、NumPy 简介 1.1 NumPy 特性 高性能科学计算库&#xff1a;专为处理多维数组设计&#xff0c;底层用 C 语言实现&#xff0c;运算速度远超 Python 原生列表。 矢量运算&#xff1a;支持批量数据操作&#xff0c;避免显式循环&#xff0c;代码更简洁高效。 广播机制&…

中州养老:搭建环境(第二节)

目录 项目初始工程搭建: 不同项目需要的前后端环境也不同 前端项目搭建: 熟悉模块的方式 代码阅读 如何开发一个接口 Swagger(接口文档) Api注解的说明 ​​​​​​​项目初始工程搭建: 公司项目分两种,新立项目(0-1)和已有项目开发(1-2) 熟悉项目结构,每个模块对应的…

[1-01-01].第78节:Java8新特性 - Lambda表达式

java基础语法大纲 一、Lambda 表达式 1.1.概述&#xff1a; 1.Lambda 是一个匿名函数&#xff0c;我们可以把 Lambda 表达式理解为是一段可以传递的代码&#xff08;将代码像数据一样进行传递&#xff09;2.使用Lambda 表达式可以写出更简洁、更灵活的代码。作为一种更紧凑的…

【2025.6.27 校内 NOI 模拟赛】总结(贪心, 容斥、组合计数, dsu on tree、 虚树)

文章目录 时间安排反思题解[六省联考 2017] 期末考试&#xff08;贪心&#xff0c; 枚举&#xff09;[JSOI2019] 神经网络&#xff08;容斥&#xff0c; 组合计数&#xff0c; 树背包&#xff09;[ZJOI2019] 语言&#xff08;dsu on tree&#xff0c; 虚树&#xff0c; 结论&am…

实际前端开发中,常用指令的封装

实际前端开发中&#xff0c;常用指令的封装 全局指令处理步骤main.ts指令目录结构src/directives/index.ts 一、输入框空格禁止指令1、指令文件clearSpace.ts2、指令使用 全局指令处理步骤 main.ts import { createApp } from "vue"; import App from "./App.…

鸿蒙OH南向开发 轻量系统内核(LiteOS-M)【异常调测】

基本概念 OpenHarmony LiteOS-M提供异常接管调测手段&#xff0c;帮助开发者定位分析问题。异常接管是操作系统对运行期间发生的异常情况进行处理的一系列动作&#xff0c;例如打印异常发生时异常类型、发生异常时的系统状态、当前函数的调用栈信息、CPU现场信息、任务调用堆栈…

算法-堆排序

文章目录 整体架构流程技术细节小结 整体架构流程 大顶推&#xff1a;是构建一个完整的二叉树 大顶推&#xff1a;即父节点的值大于左右子树的值。 循环构建大顶推 在给定的数组&#xff0c;既可以明确树的高度。 在循环的时候&#xff0c;构建树的高度从lgn至0。即从堆低往堆…

【鸿蒙HarmonyOS Next App实战开发】二维码生成技术实现与解析

随着移动应用开发中对便捷交互体验的需求日益增长&#xff0c;二维码作为信息传递的重要载体&#xff0c;其生成与使用变得越来越普遍。本文将基于鸿蒙HarmonyOS应用开发框架&#xff0c;详细介绍如何实现一个功能完备的二维码生成器&#xff0c;并附上完整代码解析。 注意该实…

1 Studying《Is Parallel Programming Hard》6-9

目录 Chapter 6 Partitioning and Synchronization Design 6.1 分区练习 6.2 设计准则 6.3 同步粒度 6.4 并行快速路径 6.5 超越党派分歧 6.6 分区、并行和优化 Chapter 7 Locking 7.1 活命 7.2 锁的类型 7.3 锁定实施问题 7.4 基于锁的存在性保证 7.5 锁定&a…

Java练习题精选16-20

Java练习题精选16-20 一、第十六题二、第十七题三、第十八题四、第十九题五、第二十题一、第十六题 现有一个存放学生成绩的数组{66, 77, 88, 99},要求将该数组正序输出每个下标所对应的元素。 public class Test {public static void main(String[] args) {int<

新能源知识库(68)汽车电镀与蒸汽

汽车电镀是提升零部件耐磨性、抗腐蚀性和美观性的关键工艺&#xff0c;其流程根据基材&#xff08;金属或塑料&#xff09;和部件功能需求有所差异。 汽车电镀是以 基材特性和 功能需求为导向的精密工艺&#xff1a; ​金属件​&#xff1a;核心流程为 ​除油→酸洗→电镀→钝…