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

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

2024-08-19 22:08:28 前端知识 前端哥 82 304 我要收藏

文章目录

    • 概要
    • 实现代码
    • 效果展示

概要

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>

效果展示

在这里插入图片描述

转载请注明出处或者链接地址:https://www.qianduange.cn//article/16196.html
标签
评论
发布的文章

php保存

2024-08-27 16:08:00

jQuery NiceScroll 插件

2024-08-27 09:08:49

vue echart4.0 按需引入

2024-08-27 09:08:28

Taro3 Vue3使用echarts

2024-08-27 09:08:49

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!