Element嵌套表格复选框无法选中的问题

2024-04-24
1分钟阅读时长

近日遇到一个需求,需要使用 element ui 的 el-table 组件展示带层级关系的表格数据,并且支持层级数据的选中。过程中遇到了一些全选时,子表格复选框无法选中的问题,记录分析一下。

由于项目使用的是老版本的 element(2.4.11), 所以嵌套表格是通过展开行的插槽实现。

问题描述

对父级表格进行全选时,期望通过遍历每行嵌套的子表格(通过动态绑定的 ref)进行全选。

思路是没问题的,但是发现只有最后一个子表格的复选框被选中。

解决方案

遍历每个子表格 ref 时,通过设置不同时长的定时器,可以解决该问题。

关键代码

el-table 的关键实现

<!-- 父表格 -->
<el-table :data="tableData" @select-all="handleSelectAll">
  <el-table-column type="selection" width="55" />
  <!-- 子表格 -->
  <el-table-column type="expand">
    <template slot-scope="{ row }">
      <el-table :data="row.children" :ref="`sub${row.id}`">
        <el-table-column type="selection" width="55" />
        <el-table-column prop="name" label="name" />
        <el-table-column prop="age" label="age" />
      </el-table>
    </template>
  </el-table-column>

  <el-table-column prop="name" label="name" />
  <el-table-column prop="age" label="age" />
</el-table>
data() {
  return {
    tableData: [
      {
        id: 1,
        name: 'John',
        age: 30,
        children: [
          { id: 2, name: 'Jim', age: 10 },
          { id: 3, name: 'Jane', age: 9 },
        ],
      },
      {
        id: 4,
        name: 'Tom',
        age: 40,
        children: [
          { id: 5, name: 'Tony', age: 15 },
          { id: 6, name: 'Tina', age: 13 },
        ],
      },
    ],
  };
},
methods: {
  handleSelectAll(selection) {
    // 处理全选逻辑
    selection.forEach((row, index) => {
      // 遍历每个子表格 ref
      const subTable = this.$refs[`sub${row.id}`];
      // 设置不同时长的定时器
      setTimeout(() => {
        subTable.toggleAllSelection();
      }, index * 20);
      // 其中 index * 20 是重点,如果时长一致,会导致只选中最后一个子表格的复选框
    });
  },
},