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

- 代码部分
业务代码已删除,仅保留处理逻辑。
(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版权协议,转载请附上原文出处链接和本声明。