elementplus el-tree树型结构多选,选中全部子节点,父节点也默认选中,但是子节点取消勾选不会影响父节点勾选状态

概要

el-tree树型结构多选:
实现选中父节点后,子节点全部选中,反之也会全部取消选中;
子节点选中时父节点也会选中,子节点取消选中不影响父节点选中状态,
但是子节点全部取消,父节点也会取消

实现代码

<template>
  <el-tree
    ref="treeRef"
    :check-strictly="true"
    :data="menuTreeList"
    show-checkbox
    node-key="id"
    highlight-current
    :default-checked-keys="checkedKeys"
    :props="defaultProps"
    @check="hanleCheck"
    @check-change="checkChange"
  />
</template>

<script lang="ts" setup>
import { onBeforeUpdate, ref } from "vue";

onBeforeUpdate(() => {
    // 清空选择状态
    treeRef.value!.setCheckedKeys([]);
})
const treeRef = ref();
const menuTreeList = ref<any>([]);//列表数组
const checkedKeys = ref<any>([]);//默认选中数组
const defaultProps = ref({});//配置选项
// 监听
const hanleCheck = (data: any, node: any) => {
  // 获取当前节点是否被选中
  const isChecked = treeRef.value!.getNode(data).checked;
  // 如果当前节点被选中,则遍历下级子节点并选中,如果当前节点取消选中,则遍历下级节点并取消
  if (isChecked) {
    // 判断该节点是否有下级节点,如果有那么遍历设置下级节点为选中
    data.children&&
      data.children.length > 0 &&
      setChildreChecked(data.children, true);
  } else {
    // 如果节点取消选中,则取消该节点下的子节点选中
    data.children&&
      data.children.length > 0 &&
      setChildreChecked(data.children, false);
  }
  function setChildreChecked(node: any, isChecked: boolean) {
    node.forEach((item: any) => {
      item.children&&
        item.children.length > 0 &&
        setChildreChecked(item.children, isChecked);
      // // 修改勾选状态
      treeRef.value!.setChecked(item.id, isChecked, false);
    });
  }
  // 获取所有选中的节点 treeRef.value.getCheckedKeys();
};

const checkChange = (data: any, checked: boolean, indeterminate: any) => {
  // console.log(data, checked, indeterminate);
  // 选中全部子节点,父节点也默认选中,但是子节点再次取消勾选或者全部子节点取消勾选也不会影响父节点勾选状态
  let checkNode = treeRef.value!.getNode(data); //获取当前节点
  // 勾选部分子节点,父节点变为全选状态
  if (
    checkNode.parent &&
    checkNode.parent.childNodes.some((ele: any) => ele.checked)
  ) {
    checkNode.parent.checked = true;
    checkNode.parent.indeterminate = false;
  } else {
    checkNode.parent.checked = false;
    checkNode.parent.indeterminate = false;
  }
};
</script>

<style lang="scss" scoped></style>

效果展示

在这里插入图片描述

在 ant design vue 中,当使用异步加载加载树形结构时,可以通过 `loadData` 方法加载子节点数据。如果用户选择了父节点,但是子节点没有展开,可以通过 `node.loadData()` 方法来加载子节点数据,并在 `then` 方法中获取子节点数据。代码示例: ```vue <template> <a-tree :treeData="treeData" :loadData="loadData" @select="handleSelect" /> </template> <script> export default { data() { return { treeData: [ { title: 'Parent 1', key: '0', children: [], isLeaf: false }, { title: 'Parent 2', key: '1', children: [], isLeaf: false } ] } }, methods: { loadData(node) { return new Promise(resolve => { // 模拟异步加载子节点数据 setTimeout(() => { const children = [ { title: 'Child 1', key: `${node.key}-0`, isLeaf: true }, { title: 'Child 2', key: `${node.key}-1`, isLeaf: true } ] resolve(children) }, 1000) }) }, handleSelect(selectedKeys, { node }) { console.log(node) if (!node.isLeaf && node.children.length === 0) { // 如果子节点没有加载过,调用 loadData 方法加载子节点数据 node.loadData().then(children => { // 更新节点的 children 属性 node.children = children }) } } } } </script> ``` 在 `handleSelect` 方法中,判断当前节点是否为叶子节点(即没有子节点),如果不是叶子节点子节点没有加载过,则调用 `loadData` 方法加载子节点数据,并将子节点数据更新到节点的 `children` 属性中。在加载完成后,可以通过 `node.children` 属性获取子节点数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值