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

news2024/11/17 7:37:51

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查看效果。大家如果有不懂的地方或是更好的方法可以分享到评论区,谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是冒泡排序?如何实现?

一、是什么 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff0c;是一种计算机科学领域的较简单的排序算法 冒泡排序的思想就是在每次遍历一遍未排序的数列之后&#xff0c;将一个数据元素浮上去&#xff08;也就是排好了一个数据&#xff09; 如同碳酸饮料中二氧化碳的…

微信小程序的支付流程

面试官&#xff1a;说说微信小程序的支付流程&#xff1f; 一、前言 微信小程序为电商类小程序&#xff0c;提供了非常完善、优秀、安全的支付功能 在小程序内可调用微信的API完成支付功能&#xff0c;方便、快捷 场景如下图所示&#xff1a; 用户通过分享或扫描二维码进入商…

A股风格因子看板 (2024.01第6期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格景 露等。 今日为该因子跟踪第6期&#xff0c;指数组合数据截止日2023-12-31&#xff0c;要点如下 近1年A股风格因子收益走…

NODE笔记 1 http模块

简单的http模块使用 文章目录 前言 node 提供了 http 模块&#xff0c;首先需要简单的介绍http http协议&#xff08;超文本传输协议&#xff09;&#xff0c;在web和网络领域都十分重要。在客户-服务通讯的请求响应中&#xff0c;报文大都是基于http。 可以先新建一个简单的…

springCould中的Stream-从小白开始【12】

&#x1f95a;今日鸡汤&#x1f95a; 见过一些人&#xff0c;他们朝九晚五&#x1f62d;&#xff0c;有时也要加班&#xff0c;却能把生活过得很&#x1f60e;有趣。他们有自己的爱好&#xff0c;不怕独处。他们有自己的坚持&#xff0c;哪怕没人在乎。&#x1f926;‍♂️ 开心…

【Web】CTFSHOW PHP文件包含刷题记录(全)

温故知新。 目录 web78 web79 web80 web81 web82 web83 web84 web85 web86 web87 web88 web78 伪协议base64编码直接读出文件内容就行 ?filephp://filter/convert.base64-encode/resourceflag.php web79 一眼data伪协议包含php脚本 ?filedata://text/plain,<…

rust语言介绍篇

Rust出现就是为了解决C面临的所有问题。Rust是一门系统编程语言 [1]&#xff0c;专注于安全 [2]&#xff0c;尤其是并发安全&#xff0c;支持函数式和命令式以及泛型等编程范式的多范式语言。Rust在语法上和C类似 [3]&#xff0c;设计者想要在保证性能的同时提供更好的内存安全…

【财务数据分析经验分享】如何进行三大报表的年度解读

很快就要到年底了&#xff0c;大家又要开始进行年度经营数据分析了。今天我就用一个例子来演示财务数据分析三张报表的年度分析。 为了更便捷的从年度来分析三大报表&#xff0c;我分别以同样的基本思路对三大报表开发出三张年度分析报表&#xff1a; 1、 按年度来进行筛选分…

windows搭建银河麒麟v10虚拟机

需要用到&#xff1a; 已将安装包放置云盘 自取 VMware Workstation Pro16 https://cloud.189.cn/t/vYZNjqbQ7zUr (访问码:a2pd) 银河麒麟v10镜像 https://cloud.189.cn/t/j6ZNfmnYfYRr (访问码:1icf) 也可以去官网下载&#xff1a;https://www.kylinos.cn 1.安装VM 无…

解密!神奇代码消除 Vue 中 Mac 电脑左滑右滑页面跳转

想知道如何让Mac电脑左滑右滑不再意外跳转页面吗&#xff1f;本文将揭示一个独家秘籍&#xff0c;通过简单的一行代码&#xff0c;让你的用户体验飞速提升&#xff01;别错过这个让你的Vue表格组件更顺畅的宝贵技巧&#xff01; 最近&#xff0c;我在使用 Vue 开发表格组件时遇…

动态pv策略和组件

pv和pvc&#xff0c;存储卷&#xff1a; 存储卷&#xff1a; emptyDir 容器内部&#xff0c;随着pod销毁&#xff0c;emptyDir也会消失 不能做数据持久化 hostPath&#xff1a;持久化存储数据 可以和节点上的目录做挂载。pod被销毁了数据还在 NFS&#xff1a;一台机器&am…

【AI视野·今日NLP 自然语言处理论文速览 第七十四期】Wed, 10 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 10 Jan 2024 Totally 38 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Model Editing Can Hurt General Abilities of Large Language Models Authors Jia Chen Gu, Hao Xiang Xu, J…

轮询定时器 清除 + vue2.0

需求? Gin Vue Element UI框架中, 我的大屏可视化项目, 大屏页面, 里边写了多个轮询定时器. 离开页面需要清理掉, 要不然切换路由还会在后台运行, 页面是自动缓存状态, 也不存在销毁一说了 所以通过路由router配置中, 页面路由监听中, 进行监听路由变化, 但是也没生效 …

支付宝异步验签踩的坑

最近公司要做支付宝小程序 我作为服务端就要给小程序配置下单啊&#xff0c;异步回调同步支付状态等功能 就不可避免的使用到了支付宝异步验签 首先背景是我是PHP语言&#xff0c;然后验签方式是RSA2 一开始写原生验签方法&#xff0c;验签失败&#xff0c;后面又搞sdk 验签…

性能测试很简单-JMeter性能测试实践

最近破费买了一台服务器&#xff0c;准备搭建自己的网站&#xff0c;顺便将自己开发的一些测试小工具部署到服务器上&#xff0c;虽然机器配置一般&#xff0c;还是决定对服务器进行压测一番&#xff0c;看一下服务器性能如何。本次压测选择的工具是JMeter&#xff0c;这个工具…

vue Element Plus Cascader级联选择器点击标签选中复选框

element-plus原功能 element-plus的Cascader级联选择器点击标签时是不会选中复选框的&#xff0c;我们想要实现点击标签时也能选中复选框这个效果&#xff0c;那么就要用到一些原生的方法 实现效果 mounted() {// Cascader 级联选择器: 点击文本就让它自动点击前面的input就可…

在Windows服务器上部署项目【虚拟机版】

一. jdk的安装 1、直接双击jdk应用程序&#xff0c;然后下一步下一步即可。 2、安装完成后&#xff0c;在此电脑➡右键➡属性➡高级系统变量。 3、配置环境变量 新建JAVA_HOMEC:\Program Files\Java\jdk1.8.0_144 编辑pathpath%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 4、测试&am…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票创建页面实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-6 线性控制器设计Linear Controller Design

本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-6 线性控制器设计Linear Controller Design

C++核心编程——类和对象(一)

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…