element-ui +vue实现行数据自动勾选——toggleRowSelection

  1. 业务需求
    主数据table展开依次渲染子数据,(通过@expand-change控制),当全选子数据时,默认勾选对应行的主数据,非全选时取消勾选主数据行。

  2. 截图展示
    全选
    在这里插入图片描述
    非全选(包括有禁用)

在这里插入图片描述

  1. 代码部分
    业务代码已删除,仅保留处理逻辑。
    (1)给需要控制添加自动勾选的el-table加上ref属性
 <el-table
    ref="mutipleTable"
    :data="tableData"
    height="87vh"
    style="width: 100%"
    stripe
    :row-key="getRowKey"
    :expand-row-keys="expands"
    :default-sort = "{prop: 'owner'}"
    @expand-change="expandChange"
    @filter-change="handleFilterChange"
    @selection-change="handleSelectBundleJob"
    v-loading="isloading">

(2) 给子数据的选择属性绑定处理函数 —— @selection-change

      <el-table 
        ref="multipleChildrenTable"
        :data="childrenData"
        row-key="jobid"
        :default-sort = "{prop: 'status', order: 'descending'}"
        @selection-change="handleSelectJob">

(3) 保存选择的数据用于后续的业务逻辑操作,判断是否为全选

  handleSelectJob(val: any) {
    this.selectedJobs = val.map((ele: any) => {
      return ele.jobid;
    });
    if (this.selectedJobs.length !== this.childrenData.length) {
      this.handleBundleRowSelection(false);
    } else {
      this.handleBundleRowSelection(true);
    }
  }

(4) 核心部分——handleBundleRowSelection
a. 利用该函数进行主数据行的勾选去取消, 在展开行数据的时候保存下当前展开行

// 控制单行展开并且传入子数据的方法
  expandChange(row: any, expandedRows: any) {
    this.currentRowJobName = row.jobname;
    // 传入对于jobname的数组;
  .....
    });
    // 控制每次展开一行
    this.expands = [];
    if (expandedRows.length) {
      row ? this.expands.push(row.jobname) : '';
    }
  }

b.通过当前展开行是否为子数据对应行,(如果不进行匹配会影响其他非相关的行数据的勾选)
利用indexOf()返回当前数据所在的tableData的序号

  handleBundleRowSelection(flag: boolean) {
    let index = 0;
    this.tableData.map((val: any) => {
      if (val.jobname === this.currentRowJobName) {
        index = this.tableData.indexOf(val);
      }
    });
    (this.$refs.mutipleTable as ElTable).toggleRowSelection(this.tableData[index], flag);
  }

this.$refs.mutipleTable as ElTable).toggleRowSelection(this.tableData[index], flag) ,控制对应序号的该行数据,flag 为true时是勾选,false是取消勾选,true和false控制在(3)

日常记录踩坑点,如果有更好的办法欢迎大家分享!


版权声明:本文为weixin_42404174原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。