当前位置: 首页 > news >正文

完美解决ElementUI中树形结构table勾选问题

完美解决ElementUI中树形结构table勾选问题

  • 实现功能
  • 效果图
    • 全选
    • 取消全选
    • 取消父节点
    • 取消某个子节点
  • 关键代码

实现功能

1. 全选/取消全选,更新所有节点勾选状态
2. 勾选父/子节点,子/父节点状态和全选框状态更新

效果图

全选

在这里插入图片描述

取消全选

在这里插入图片描述

取消父节点

在这里插入图片描述

取消某个子节点

在这里插入图片描述

关键代码

这里是vue2写法,不管什么写法逻辑是一样滴!

<template>
  <el-table
    ref="multipleTable"
    v-loading="loading"
    row-key="id"
    :data="tableList"
    :tree-props="{ children: 'children' }"
    @select-all="selectAll"
    @select="handleSelect"
  >
    <el-table-column type="selection" width="55"> </el-table-column>
  </el-table>
</template>
<script>
export default {
  methods: {
    // 递归设置子节点的勾选状态
    setChildrenSelection(children, selected) {
      if (!children || children.length === 0) return;
      children.forEach((child) => {
        this.$refs.multipleTable.toggleRowSelection(child, selected);
        this.setChildrenSelection(child.children, selected);
      });
    },
    // 更新父节点的勾选状态
    updateParentSelection(node) {
      if (!node || !node.pid) return; // 如果没有父节点,递归终止

      const parent = this.findNodeById(node.pid);
      if (!parent) return; // 如果父节点不存在,退出

      // 检查父节点的所有子节点是否都被勾选
      const allChildrenSelected = parent.children.every((child) =>
        this.$refs.multipleTable.selection.some((item) => item.id === child.id)
      );

      // 根据子节点的勾选状态更新父节点的勾选状态
      this.$refs.multipleTable.toggleRowSelection(parent, allChildrenSelected);

      // 递归更新父节点的父节点
      this.updateParentSelection(parent);
    },
    // 根据 ID 查找节点
    findNodeById(id) {
      const stack = [...this.tableList];
      while (stack.length) {
        const node = stack.pop();
        if (node.id === id) return node;
        if (node.children && node.children.length) {
          stack.push(...node.children);
        }
      }
      return null;
    },
    // 勾选事件处理
    handleSelect(selection, row) {
      if (row.children && row.children.length) {
        // 如果当前节点有子节点,递归设置子节点的勾选状态
        const isCurrentSelected = selection.some((item) => item.id === row.id);
        this.setChildrenSelection(row.children, isCurrentSelected);
      }

      // 更新父节点的勾选状态
      this.updateParentSelection(row);
    },

    // 全选事件处理
    selectAll(selection) {
      this.tableList.forEach((row) => {
        const isRowSelected = selection.some((item) => item.id === row.id);
        this.$refs.multipleTable.toggleRowSelection(row, isRowSelected);

        // 递归设置子节点的勾选状态
        this.setChildrenSelection(row.children, isRowSelected);
      });
    },
  },
};
</script>

// 若想要获取表格选中的数据
const selectedRows = this.$refs.multipleTable.selection;

相关文章:

  • k8s环境部署
  • 算法每日一练 (10)
  • ai智能语音机器人对我们生活有什么影响
  • OpenAI智能体初探:使用 OpenAI Responses API 在 PDF 中实现检索增强生成(RAG)
  • 自然语言处理:文本聚类
  • 202250311-WINDOWS本地4G显存Docker运行vLLM
  • 垂起固定翼+多旋翼+自组网:无人机中低空一体化组网技术详解
  • 平时作业
  • 头歌java课程实验(Java面向对象 - 封装、继承和多态的综合练习)
  • C/C++都有哪些开源的Web框架?
  • 【软件】免费的PDF全文翻译软件,能保留公式图表的样式
  • 鲸鱼算法WOA对风电场风电机组一次二次调频参数进行全局最优辨识,二次调频参数辩识matlab/simulink,也可进一步修改成一次调频参数辩识
  • Nginx 限流功能:原理、配置与应用
  • talib编译whl文件通不过问题
  • i18n的替换处理
  • 【从零开始学习计算机科学】数据库系统(十一)云数据库、NoSQL 与 NewSQL
  • 智能化水利监管:无人机视频在违章行为识别中的应用
  • 基于java(springboot+mybatis)汽车信息管理系统设计和实现以及文档
  • 5秒学会excel中序号列自动增加,不是拖动,图解加说明,解决序号自增多了手拖太累
  • 手写一些常见算法
  • 推动粒子治疗更加可及可享!龚正调研上海市质子重离子医院
  • 俄乌刚谈完美国便筹划与俄乌领导人通话,目的几何?
  • 原核试验基地司令员范如玉逝世,从事核试验研究超40年
  • 国家统计局向多省份反馈统计督察意见
  • 长期吃太饱,身体会发生什么变化?
  • 1至4月全国铁路发送旅客14.6亿人次,创同期历史新高