vue3+element Plus 左右树形结构之互搏

需求:选择左侧树形,右侧树形显示选择后的数据,右侧点击复选框后取消选择数据消失,且左侧取消勾选状态。

实现代码

<template>
  <div>
    <el-row>
      <el-col :span="12">
        <!-- 树形控件1 -->
        <el-tree ref="tree" :data="treeData1" :props="defaultProps" :default-checked-keys="defaultCheckedKeys" show-checkbox @check="handleCheckChange" node-key="id" default-expand-all></el-tree>
      </el-col>
      <el-col :span="12"> <!-- 树形控件2 -->
        <el-tree ref="tree2" :data="treeData2" :props="defaultProps" :default-checked-keys="defaultCheckedKeys" @check-change="handleCheckChange2" show-checkbox node-key="id" default-expand-all></el-tree>
      </el-col>
    </el-row>

  </div>
</template>

<script setup>
import { nextTick, ref } from 'vue';
import { ElTree } from 'element-plus';
const treeData1 = ref([
  { label: 'Node1', id: 1, children: [{ label: 'Child1', id: 2 }] },
  { label: 'Node2', id: 11, children: [{ label: 'Child2', id: 22 }] },
  {
    label: 'Node3',
    id: 111,
    children: [
      { label: 'Child3', id: 222 },
      { label: 'Child31', id: 223 },
    ],
  },
]);
const treeData2 = ref([]);
const tree = ref([]);
const tree2 = ref([]);
const defaultCheckedKeys = [222,223];
const defaultProps = {
  children: 'children',
  label: 'label',
};

const handleCheckChange = (data, checked, indeterminate) => {
  //重新获取树形控件2的选中数据
  treeData2.value = getCheckedNodes();
  // 树形控件2选中设置
  tree2.value.setCheckedKeys(tree.value.getCheckedKeys());
};
//树形控件2选中取消事件
const cancelCheck = (data, checked) => {
    // 遍历目标树形控件的所有节点,如果节点label与node相同,则取消选中
  const cancelNode = nodes => {
    nodes.forEach(node => {
      if (node.label === data.label) {
        //判断取消选中后,修改树形控件1的选中状态
        if (!checked) {
          tree.value.setChecked(node, false, false);
        }
      }
      if (node.children && node.children.length) {
        cancelNode(node.children);
      }
    });
  };
  cancelNode(treeData1.value);
};
//重新获取树形控件2的选中数据
const getCheckedNodes = function () {
  // 获取树形1的选中的节点
  const checkedNodes = tree.value.getCheckedNodes();
  const getTreeData = (nodes, checked) => {
    return nodes
      .map(node => ({
        ...node,
        children: getTreeData(node.children || [], checked),
      }))
      .filter(node => checked.includes(node.id) || (node.children && node.children.length));
  };
  const checkedTreeData = getTreeData(
    treeData1.value,
    checkedNodes.map(node => node.id)
  );
  return checkedTreeData;
};

// 树形控件2选中事件
const handleCheckChange2 = (data, checked, indeterminate) => {
  cancelCheck(data, checked);
  //点击取消后,重新设置树形控件2的数据,并通过树形1的选中状态设置树形2的选中状态
  nextTick(() => {
    treeData2.value = getCheckedNodes();
    tree2.value.setCheckedKeys(tree.value.getCheckedKeys());
  });
};
</script>

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值