概要

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>

效果展示

在这里插入图片描述

GitHub 加速计划 / eleme / element
15
3
下载
A Vue.js 2.0 UI Toolkit for Web
最近提交(Master分支:4 个月前 )
c345bb45 1 年前
a07f3a59 * Update transition.md * Update table.md * Update transition.md * Update table.md * Update transition.md * Update table.md * Update table.md * Update transition.md * Update popover.md 1 年前
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐