当前位置: 首页 > news >正文

el-tree多个树进行节点同步联动(完整版)

2024.1.11今天我学习了如何对多个el-tree树进行相同节点的联动效果,如图:

这边有两棵树,我们发现第一个树和第二个树之间会有重复的指标,当我们选中第一个树的指标,我们希望第二个树如果也有重复的指标也能进行勾选上,反之也是。

一、难点:

(1)要让父节点变成半选状态

这个组件比较复杂的地方是要通过选中的子节点,拿到另外一个树对应的父节点,直接通过getHalfCheckedKeys是不行的,因为你当前不是在另外一个树做操作,获取不到当前的父节点,所以只能通过递归子节点,拿到对应的父节点。

(2)要拿到选中的所有子节点数据

setCheckedKeys(data,check)的data是拿到当前选中的子节点数据,如果当前子节点数据含有children数据,我们也需要通过递归的方法拿到所有的子节点数据。

二、重点方法:

setCheckedKeys(data,check)//data为当前选中节点的数据   check为所有选中节点的数据

三、关键步骤如下:

(1)第一个树选中的节点数据赋值给第二个树回显。

(2)第二个树选中的节点拼接第一个树选中的节点并过滤第二个树去掉的节点。

四、完整代码如下:

<template><div><el-treestyle="height: 30vh;overflow-y: scroll"node-key="id"ref="tree1":default-expand-all="true":props="defaultProps":data="tree_demo1"@check="tree_check1"show-checkbox><span slot-scope="{ node, data }">【{{ data.id }}】{{ data.label }}</span></el-tree><hr/><el-treenode-key="id"ref="tree2"style="height: 30vh;overflow-y: scroll":default-expand-all="true":props="defaultProps":data="tree_demo2"@check="tree_check2"show-checkbox><span slot-scope="{ node, data }">【{{ data.id }}】{{ data.label }}</span></el-tree></div>
</template>
<script>
export default {data() {return {tree_demo1: [],tree_demo2: [],default_data: [],defaultProps: {label: 'label',children: 'children'}}},created() {this.getList()},methods: {getList() {let demo = [{"children": [{"children": [{"id": "001","label": "指标一","parent_id": 100,},{"id": "002","label": "指标二","parent_id": 100,},{"id": "003","label": "指标三","parent_id": 100,},{"id": "004","label": "指标四","parent_id": 100,},{"id": "005","label": "指标五","parent_id": 100,},{"id": "006","label": "指标六","parent_id": 100,},{"id": "007","label": "指标七","parent_id": 100,},{"id": "008","label": "指标八","parent_id": 100,},{"id": "009","label": "指标九","parent_id": 100,},{"id": "010","label": "指标十","parent_id": 100,},{"id": "011","label": "指标十一","parent_id": 100,},{"id": "012","label": "指标十二","parent_id": 100,},{"id": "013","label": "指标十三","parent_id": 100,},{"id": "014","label": "指标十四","parent_id": 100,},{"id": "015","label": "指标十五","parent_id": 100,},{"id": "016","label": "指标十六","parent_id": 100,},{"id": "017","label": "指标十七","parent_id": 100,},{"id": "018","label": "指标十八","parent_id": 100,},{"id": "019","label": "指标十九","parent_id": 100,},{"id": "020","label": "指标二十","parent_id": 100,},{"id": "021","label": "指标二十一","parent_id": 100,},{"id": "022","label": "指标二十二","parent_id": 100,},{"id": "023","label": "指标二十三","parent_id": 100,},{"id": "024","label": "指标二十四","parent_id": 100,},{"id": "025","label": "指标二十五","parent_id": 100,}],"id": "100","label": "指标分类1-1","parent_id": 1,},{"children": [{"id": "026","label": "指标二十六","parent_id": 101,},{"id": "027","label": "指标二十七","parent_id": 101,},{"id": "028","label": "指标二十八","parent_id": 101,},{"id": "029","label": "指标二十九","parent_id": 101,},{"id": "030","label": "指标三十","parent_id": 101,},{"id": "031","label": "指标三十一","parent_id": 101,},{"id": "032","label": "指标三十二","parent_id": 101,},{"id": "033","label": "指标三十三","parent_id": 101,},{"id": "034","label": "指标三十四","parent_id": 101,},{"id": "035","label": "指标三十五","parent_id": 101,},{"id": "036","label": "指标三十六","parent_id": 101,},{"id": "037","label": "指标三十七","parent_id": 101,},{"id": "038","label": "指标三十八","parent_id": 101,},{"id": "039","label": "指标三十九","parent_id": 101,},{"id": "040","label": "指标四十","parent_id": 101,}],"id": "101","label": "指标分类1-2","parent_id": 1,},],"id": "1","label": "指标分类一","parent_id": 0,"status": 1},{"children": [{"id": "005","label": "指标五"},{"id": "010","label": "指标十"},{"id": "011","label": "指标十一"},{"id": "016","label": "指标十六"},{"id": "020","label": "指标二十"},{"id": "030","label": "指标三十"},{"id": "034","label": "指标三十四"},{"id": "033","label": "指标三十三"},{"id": "031","label": "指标三十一"},{"id": "021","label": "指标二十一"},{"id": "050","label": "指标五十"},{"id": "060","label": "指标六十"},{"id": "066","label": "指标六十六"},{"id": "068","label": "指标六十八"},{"id": "070","label": "指标七十"},],"id": "2","label": "指标分类二"}]this.tree_demo1 = [demo[0]]//第一棵树数据this.tree_demo2 = [demo[1]]//第二棵树数据},// 第一棵树选中节点数据tree_check1(data, check) {this.component_check_data_method(data, check, 'tree2', 'tree_demo2')},// 第二棵树选中节点数据tree_check2(data, check) {this.component_check_data_method(data, check, 'tree1', 'tree_demo1')},//递归拿到选中所有的子节点数据findChildrenIds(data) {let all_ids = [data.id]if (data.children && data.children.length > 0) {for (let child of data.children) {all_ids = all_ids.concat(this.findChildrenIds(child));//判断是否含有children数据,如果有就递归继续拼接}}return all_ids},// 递归拿到对应所有的父节点数据findParentIds(id, data) {const parentIds = [];function findNode(node, parentId) {if (node.id === id) {parentIds.push(parentId);return true;}if (node.children) {for (const child of node.children) {if (findNode(child, node.id)) {parentIds.push(parentId);return true;}}}return false;}for (const node of data) {if (findNode(node, null)) {break;}}return parentIds.reverse(); // 反转数组,让根节点id在最前面},// 通用选中节点获取数据的方法component_check_data_method(data, check, other_tree_ref, other_tree_data) {let first_data = this.$refs[other_tree_ref].getCheckedKeys()//获取另外一棵树的节点数据let all_nodes = []for (const nodeId of this.findChildrenIds(data)) {const parentIds = this.findParentIds(nodeId, this[other_tree_data])all_nodes.push(...parentIds)//拿到当前子节点对应的所有父节点}const filteredArr = [...new Set(all_nodes.filter(item => item !== null))]//去重和过滤nulllet select_all_data = [...filteredArr, ...this.findChildrenIds(data)]//拼接所有父节点和所有选中的子节点first_data = first_data.filter(item => !select_all_data.includes(item));//如果包含当前子节点就过滤this.$refs[other_tree_ref].setCheckedKeys([...first_data, ...check.checkedKeys])}}
}
</script>

可以直接复制demo查看效果。大家如果有不懂的地方或是更好的方法可以分享到评论区,谢谢!

相关文章:

el-tree多个树进行节点同步联动(完整版)

2024.1.11今天我学习了如何对多个el-tree树进行相同节点的联动效果&#xff0c;如图&#xff1a; 这边有两棵树&#xff0c;我们发现第一个树和第二个树之间会有重复的指标&#xff0c;当我们选中第一个树的指标&#xff0c;我们希望第二个树如果也有重复的指标也能进行勾选上&…...

python两个字典合并,两个list合并

1.两个字典&#xff1a; a{‘a’:1,‘b’:2,‘c’:3} b {‘aa’:11,‘bb’:22,‘cc’:33} 合并1&#xff1a;dict(a, **b) 结果&#xff1a;{‘a’: 1,‘aa’: 11,‘c’: 3,‘b’: 2,‘bb’: 22,‘cc’: 33} 合并2&#xff1a;dict(a.items()b.items()) 结果&#xff1a;{‘…...

搜维尔科技:【简报】元宇宙数字人赛道,《全息影像技术应用》!

期待着看展的主角来到今天要参观的全息影像展&#xff0c;平时就喜欢看展的她对于所谓的全息影像非常好奇&#xff0c;于是她带着期待的心情进入展内。进入展内的主角看到的是与之前完全不同的画展&#xff0c;每幅画看起来就像真的一样&#xff0c;充满好奇的她在展览的各处游…...

SparkSQL和Hive语法差异

SparkSQL和Hive语法差异 1、仅支持Hive SparkSQL关联条件on不支持函数rand()创建零时表时&#xff0c;Spark不支持直接赋值nullSpark无法读取字段类型为void的表SparkSQL中如果表达式没有指定别名&#xff0c;SparkSQL会将整个表达式作为别名&#xff0c;如果表达式中包含特殊…...

XCODE IOS 静态链接库替换升级

XCODE 版本15.2. 一个很久需求没更新的IOS 应用&#xff0c;近来有新需求要开发。 拉下代码运行&#xff0c;出现了个BAD_ACCESS错误。出错的位置位于一个调用的第三方的.a静态库内部。因为调用代码并没有修改&#xff0c;很容易想到可能XCODE相关升级&#xff0c;导致的问题。…...

API设计:从基础到优秀实践

在这次深入探讨中&#xff0c;我们将深入了解API设计&#xff0c;从基础知识开始&#xff0c;逐步进阶到定义出色API的最佳实践。 作为开发者&#xff0c;你可能对许多这些概念很熟悉&#xff0c;但我将提供详细的解释&#xff0c;以加深你的理解。 API设计&#xff1a;电子商…...

路由的安装顺序

安装前端路由的顺序通常如下&#xff1a; 安装前端框架&#xff1a;选择并安装适合你的项目的前端框架&#xff0c;如React、Vue或Angular等。 创建路由配置文件&#xff1a;在项目根目录下创建一个路由配置文件&#xff0c;比如router.js或routes.js等&#xff0c;用于定义路…...

华为OD机试真题-围棋的气--Java-OD统一考试(C卷)

题目描述: 围棋棋盘由纵横各19条线垂直相交组成,棋盘上一共19x19=361个交点,对弈双方一方执白棋,一方执黑棋,落子时只能将棋子置于交点上。 “气”是围棋中很重要的一个概念,某个棋子有几口气,是指其上下左右方向四个相邻的交叉点中,有几个交叉点没有棋子,由此可知: …...

CANFD数据记录仪在新能源汽车复杂路测下的应用

CANFD数据记录仪在新能源汽车复杂路测下的应用 汽车制造商在生产预批量阶段的耐久性测试中,为了检测潜在故障,必须让车辆在严酷的路况和环境下接受测试。为确保能回溯故障发生的现场情况,我们需要对测试数据精准记录与储存。这些数据是新车型优化迭代的关键,也是确保产品质量的…...

java: 5-6 break

文章目录 1. break1.1 介绍1.2 语法和流程图1.3 入门练习1.4 细节说明1.5 练习 【老韩视频p137-】 1. break 看个需求&#xff1a;随机生成 1-100 的一个数&#xff0c;直到生成了 97 这个数&#xff0c;看看你一共用了几次? 【思路分析:循环&#xff0c;但是循环的次数不知道…...

如何使用Imagewheel搭建一个简单的的私人图床无公网ip也能访问

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…...

响应式编程Reactor API大全(上)

Reactor 是一个基于响应式编程的库&#xff0c;主要用于构建异步和事件驱动的应用程序。Reactor 提供了丰富的 API&#xff0c;包括创建、转换、过滤、组合等操作符&#xff0c;用于处理异步数据流。以下是一些 Reactor 的主要 API 示例&#xff1a; pom依赖 <dependencyMan…...

vue3自定义指令

一个自定义指令由一个包含类似组件生命周期钩子的对象来定义。钩子函数会接收到指令所绑定元素作为其参数。 页面内创建自定义指令 下面是一个自定义指令的例子&#xff0c;当一个 input 元素被 Vue 插入到 DOM 中后&#xff0c;它会被自动聚焦&#xff1a; <script setu…...

ECharts 多季度连续显示到一个图中。

效果图 二.相关option 以下option可以复制到 echarts的编辑器 进行查看修改 const site test1; const site2 test2;const qtrlyOption function (data: any, titleText: string): any {//获取最大值 。最大最小值的目的是&#xff1a;使左右里边的所有bar使用同一个指标let …...

【Microsoft Copilot】手机端发布 ——GPT-4, DALL-E3 免费用

Microsoft Copilot 关于Microsoft CopilotMicrosoft Copilot 的特点1. 可以在手机端使用&#xff1a;2. 可以免费使用GPT-4。3. 可以无限制地使用GPT-4。4. 可以使用DALL-E3生成图片。5. 搜索功能6. 图像识别 Microsoft Copilot的缺点和注意事项1. 非常容易报错2. 不支持长篇聊…...

[蓝桥杯 2013 省 AB] 错误票据

题目背景 某涉密单位下发了某种票据&#xff0c;并要在年终全部收回。 题目描述 每张票据有唯一的 ID 号&#xff0c;全年所有票据的 ID 号是连续的&#xff0c;但 ID 的开始数码是随机选定的。因为工作人员疏忽&#xff0c;在录入 ID 号的时候发生了一处错误&#xff0c;造…...

IDEA GitHub令牌原理(Personal Access Token)

1.IDEA的add github account 是什么原理&#xff1f; 在IntelliJ IDEA中添加GitHub账户&#xff0c;主要是为了让IDEA能够与GitHub进行交互&#xff0c;如克隆GitHub上的仓库&#xff0c;提交代码到GitHub等。其基本原理如下&#xff1a; 用户在IDEA中输入GitHub的用户名和密…...

[开发语言][python][c++]:C++中的this指针和Python中的Self -- 26岁生日

C中的this指针和Python中的Self 1. python中的Self2. C中的this指针3. C中的this指针和Python中self的异同点&#xff1a; 以朋友的新岁祝福开篇&#xff0c;祝笔者也祝大家☺️&#xff1a; 一岁一礼 一寸欢喜且喜且乐 且以永日​ From VardoZ癸卯年十一月廿六(兔年)之…...

Android Traceview 定位卡顿问题

Traceview 是一个 Android 性能分析工具&#xff0c;用于时间性能分析&#xff0c;主要帮助开发者了解应用程序中各个方法的执行时间和调用关系。Traceview 可以通过图形化界面查看应用程序的代码执行细节&#xff0c;包括每个方法的调用次数、方法调用的时间消耗、方法调用堆栈…...

第三方 Cookie 被禁用?企业该如何实现用户精准运营和管理?

从 1 月 4 日开始&#xff0c;谷歌 Chrome 浏览器将逐步禁用第三方 Cookie 。作为全球最大的浏览器之一&#xff0c;Chrome 的这一动作无疑将引发行业内的重大变革。一直以来&#xff0c;第三方 Cookie 都是网络营销和广告的重要工具。然而&#xff0c;随着人们对隐私保护的日益…...

从“玩概念”到“真落地”:AI智能体三大场景的突围之路

当行业不再为“大模型参数”狂欢&#xff0c;真正的价值开始浮现——客服自动化、内部知识库、办公Agent&#xff0c;正在成为AI智能体最先跑通商业闭环的三大场景。而决定成败的关键&#xff0c;已经从模型能力转向上下文设计、工具调用与反馈迭代。 2026年&#xff0c;大模型…...

如何构建高效离线OCR解决方案:从引擎选型到性能优化的完整指南

如何构建高效离线OCR解决方案&#xff1a;从引擎选型到性能优化的完整指南 【免费下载链接】Umi-OCR_plugins Umi-OCR 插件库 项目地址: https://gitcode.com/gh_mirrors/um/Umi-OCR_plugins 在数字化办公与信息处理中&#xff0c;文字识别&#xff08;OCR&#xff09;技…...

拯救你的RStudio Server:除了点‘Terminate R’,你还可以试试这几招(附原理)

拯救你的RStudio Server&#xff1a;除了点‘Terminate R’&#xff0c;你还可以试试这几招&#xff08;附原理&#xff09; 当你盯着RStudio Server界面上那个转个不停的加载图标&#xff0c;看着"R is taking longer to start than usual"的提示&#xff0c;内心可…...

别再手动调参了!用C#和Halcon的HSmartWindow控件,5分钟搞定ROI绘制与参数提取

工业视觉开发革命&#xff1a;用C#封装Halcon ROI的智能实践 在半导体检测、精密零件测量等工业场景中&#xff0c;区域兴趣&#xff08;ROI&#xff09;的精准定义直接影响着算法效果。传统开发模式下&#xff0c;工程师需要反复在Halcon脚本与C#界面代码间切换&#xff0c;手…...

Piping Server开发者指南:如何基于流传输构建自己的应用

Piping Server开发者指南&#xff1a;如何基于流传输构建自己的应用 【免费下载链接】piping-server Infinitely transfer between every device over pure HTTP with pipes or browsers 项目地址: https://gitcode.com/gh_mirrors/pi/piping-server Piping Server是一个…...

GLM-4V-9B GPU高效利用:通过dtype对齐+4-bit量化实现A10G 24GB满载运行

GLM-4V-9B GPU高效利用&#xff1a;通过dtype对齐4-bit量化实现A10G 24GB满载运行 1. 引言 最近在折腾多模态大模型本地部署的朋友&#xff0c;可能都遇到过类似的问题&#xff1a;模型参数动辄几十上百亿&#xff0c;显存要求高得吓人&#xff0c;好不容易找到个能在消费级显…...

荣耀XD21路由器IPTV设置指南:不用VLAN交换机实现单线复用

荣耀XD21路由器单线复用实战&#xff1a;无需VLAN交换机实现IPTV与网络并行传输 客厅弱电箱仅预留单根网线却需要同时承载IPTV和无线网络信号——这是许多家庭网络改造中遇到的典型难题。传统方案往往依赖价格不菲的VLAN交换机实现单线复用&#xff0c;但通过荣耀XD21路由器的隐…...

PS软件插件开发思维:为视频编辑流程注入AI字幕能力

PS软件插件开发思维&#xff1a;为视频编辑流程注入AI字幕能力 不知道你有没有过这样的经历&#xff1a;辛辛苦苦剪完一个视频&#xff0c;到了加字幕这一步&#xff0c;整个人都蔫了。要么是手动敲字敲到手抽筋&#xff0c;要么是自动生成的字幕时间轴对不上&#xff0c;还得…...

STM32F103精英板实战:手把手教你移植开源Modbus主机库,实现稳定主从通信

STM32F103精英板实战&#xff1a;手把手教你移植开源Modbus主机库&#xff0c;实现稳定主从通信 Modbus协议作为工业自动化领域最常用的通信协议之一&#xff0c;其简单可靠的特性使其在各种嵌入式设备中广泛应用。对于使用STM32F103系列开发板的工程师来说&#xff0c;如何快速…...

OpenClaw+GLM-4.7-Flash:自动化代码审查

OpenClawGLM-4.7-Flash&#xff1a;自动化代码审查 1. 为什么需要自动化代码审查 作为一个独立开发者&#xff0c;我经常面临一个尴尬局面&#xff1a;在深夜写完代码后直接提交&#xff0c;第二天醒来发现代码中存在明显的逻辑漏洞或风格问题。传统解决方案要么依赖昂贵的Sa…...