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-tree
        style="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-tree
        node-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))]//去重和过滤null
      let 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查看效果。大家如果有不懂的地方或是更好的方法可以分享到评论区,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/314893.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙实战基础(ArkTS)-窗口管理

基于窗口能力&#xff0c;实现验证码登录的场景&#xff0c;主要完成以下功能&#xff1a; 登录页面主窗口实现沉浸式。输入用户名和密码后&#xff0c;拉起验证码校验子窗口。验证码校验成功后&#xff0c;主窗口跳转到应用首页。 登录界面实现沉浸式 完成登录界面布局的编…

全面解析微服务

导读 微服务是企业应用及数据变革升级的利器&#xff0c;也是数字化转型及运营不可或缺的助产工具&#xff0c;企业云原生更离不开微服务&#xff0c;同时云原生的既要最大化发挥微服务的价值&#xff0c;也要最大化弥补微服务的缺陷。本文梳理了微服务基础设施组件、服务网格、…

企业数据中台整体介绍及建设方案:文件全文51页,附下载

关键词&#xff1a;数据中台解决方案&#xff0c;数据治理&#xff0c;数据中台技术架构&#xff0c;数据中台建设内容&#xff0c;数据中台核心价值 一、什么是数据中台&#xff1f; 数据中台是指通过数据技术&#xff0c;对海量数据进行采集、计算、存储、加工&#xff0c;…

富唯智能新研发的复合机器人,轻松破解汽车底盘零配件生产中的难题

随着汽车工业的快速发展&#xff0c;对于底盘零配件的需求也日益增长。为了满足市场需求&#xff0c;智能物流解决方案在汽车底盘零配件生产中扮演着越来越重要的角色。如何实现高效、准确的生产和物流管理&#xff0c;以满足市场快速变化的需求&#xff0c;成为了汽车生产商亟…

在加载第三方库过程中,无法加载到库的问题(使用readelf, patchelf命令)

无法加载到库问题 问题及分析过程readelf 命令patchelf命令 问题及分析过程 在开发一个程序过程中&#xff0c;需要加载第三方库iTapTradeAPI, 在CMakeList.txt中已经设置了CMAKE_INSTALL_RPATH&#xff0c;但是发布到生产之后由于目录问题无法加载到libiTapTradeAPI库了 下面…

Vue过滤器详解

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介基本用法多个过滤器的串联过滤器在指令中的应用全局过滤器 ⭐ 本期推荐 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&#xff01;创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习。每…

活动回顾∣“全邻友好,艺术大咖交流会”——员村街开展社区微型养老博览会长者文艺汇演活动

为进一步营造邻里守望&#xff0c;共建美好社区的氛围&#xff0c;促进社区长者参与社区服务&#xff0c;展示社区长者健康、积极向上的精神风貌&#xff0c;2024年1月10日&#xff0c;员村街开展“全邻友好&#xff0c;艺术大咖交流会”——微型养老博览会活动&#xff0c;让长…

电影《艾里甫与赛乃姆》简介

电影《艾里甫与赛乃姆》由天山电影制片厂于1981年摄制&#xff0c;该片由傅杰执导&#xff0c;由买买提祖农司马依、布维古丽、阿布里米提沙迪克、努力曼阿不力孜、买买提依不拉音江、阿不都热合曼艾力等主演。 该片改编自维吾尔族民间爱情叙事长诗《艾里甫与赛乃姆》&#xf…

ModuleNotFoundError: No module named ‘simple_knn‘

【报错】使用 AutoDL 复现 GaussianEditor 时引用 3D Gaussian Splatting 调用simple_knn 时遇到 ModuleNotFoundError: No module named ‘simple_knn‘ 报错&#xff1a; 【原因】 一开始以为是版本问题&#xff0c;于是将所有可能的版本都尝试了 (from versions: 0.1, 0.2…

一套成熟的Spring Cloud智慧工地平台源码,自主版权,支持二次开发!

智慧工地源码&#xff0c;java语言开发的智慧工地源码 智慧工地利用移动互联、物联网、云计算、大数据等新一代信息技术&#xff0c;彻底改变传统施工现场各参建方的交互方式、工作方式和管理模式&#xff0c;为建设集团、施工企业、监理单位、设计单位、政府监管部门等提供一揽…

Android开发基础(三)

Android开发基础&#xff08;三&#xff09; 本篇将介绍Android权限管理。 Android权限管理 Android权限管理主要是为了保护用户的隐私和设备的安全性&#xff1b; 在Android系统中&#xff0c;应用在请求权限时必须进行明确的申请&#xff0c;根据权限的保护级别&#xff0…

NAND Separate Command Address (SCA) 接口数据传输解读

在采用Separate Command Address (SCA) 接口的存储产品中&#xff0c;DQ input burst和DQ output burst又是什么样的策略呢&#xff1f; DQ Input Burst: 在读取操作期间&#xff0c;数据以一种快速并行的方式通过DQ总线传送到控制器。在SCA接口下&#xff0c;虽然命令和地址信…

预约上门按摩系统开发会涉及哪些关键技术

一套完善的预约上门按摩系统的开发是需要考虑很多方面&#xff0c;无论是从用户下单还是技师、订单、财务以及各个方面的管理&#xff0c;涉及的逻辑和技术非常多&#xff0c;今天就以最简单的方式把预约上门按摩系统的技术方面分享一下。 1.移动端应用程序开发技术&#xff1a…

腾讯云COS桶文件上传下载工具类

1&#xff0c;申请key和密钥 2&#xff0c;引入依赖 <dependency><groupId>com.qcloud</groupId><artifactId>cos_api</artifactId><version>5.6.24</version></dependency>3&#xff0c;工具类 package com.example.activi…

Docker基础命令

Docker常用命令 docker run docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -e设置环境变量&#xff1b;-e usernameyjy --name为容器指定一个名称&#xff1b;--nameyjy -p指定端口映射&#xff0c;格式为&#xff1a;主机(宿主)端口:容器端口 -p 80:8080 -t为容器重新分…

WARNING: IPv4 forwarding is disabled. Networking will not work.

今天用docker部署容器&#xff0c;发现一个问题&#xff0c;docker-compose up启动成功&#xff0c;但无法正常访问接口。 查找问题步骤&#xff1a; 1、直接在服务器运行jar包&#xff0c;发现可以正常启动&#xff0c;也能正常访问接口&#xff0c;排除jar包本身问题以及防…

用C#实现简单的线性回归

前言 最近注意到了NumSharp&#xff0c;想学习一下&#xff0c;最好的学习方式就是去实践&#xff0c;因此从github上找了一个用python实现的简单线性回归代码&#xff0c;然后基于NumSharp用C#进行了改写。 NumSharp简介 NumSharp&#xff08;NumPy for C#&#xff09;是一个在…

STM32F103RCT6开发板M3单片机教程07-TIMER1CH1输出 PWM做LED呼吸灯

概述 本教程使用是&#xff08;光明谷SUN_STM32mini开发板&#xff09; 免费开发板 在谷动谷力社区注册用户&#xff0c;打卡&#xff0c;发帖求助都可以获取积分&#xff0c;当然最主要是发原创应用文档奖励更多积分&#xff0e; (可用积分换取&#xff0c;真的不用钱&…

什么是 CAS

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

C语言快速排序——qsort函数

上面的是我们标准C语言库里面对qsort函数的介绍&#xff0c;我们先来从排序说起&#xff1a; 这就不得不提出编程中最最基础的排序算法---冒泡排序 对于一个任意的无序数列&#xff0c;我们如果想要把他排成顺序数列的话&#xff0c;我们就可以让每一项跟后面的一项去比较&…