1、效果图
2、实现核心代码
<el-switch
v-model="row.isEnable"
:active-value="2"
:inactive-value="1"
@change="switchChange(row)"
>
</el-switch>
//更改是否启用状态
switchChange(row) {
//有以下几种情况 1、只有自己,没有子级,没有父级
//2、只有子级
//3、只有父级
//4、既有子级已有父级
let ids = "";
let isEnable = "";
if (!this.isHasChildren(row) && !this.isHasParent(row)) {
//只有自己,没有子级,没有父级
ids = row.id;
} else {
//既有子级已有父级
let childIdsArr = [];
let idsArr = [];
let parantArr = [];
if (this.isHasChildren(row)) {
//递归获取子级Id
childIdsArr = this.getChildrenIds(row, childIdsArr);
}
if (this.isHasParent(row)) {
idsArr = [row.id];
isEnable = row.isEnable;
//递归处理祖先元素,从最后一个祖先元素开始处理
//从最后一个开始操作
parantArr = this.setParentEnable(row, parantArr);
}
ids = [...childIdsArr, ...idsArr, ...parantArr].join(',');
}
isEnable = row.isEnable;
this.updateWorkOrderTypeEnableFun(ids, isEnable);
},
//设置父级的enable
setParentEnable(row, parantArr) {
this.getRowById(row.parentId, this.data);
let enable = parentObj.isEnable; //如果没有变化,此时,不用递归去处理父级状态
//判断全部直接子级的状态,如有找到一个enable为开启状态,则为开启状态,否则。为关闭状态
let enableStatus = 1;
parentObj.children.forEach((item) => {
if (item.isEnable == 2) {
enableStatus = 2;
}
});
if (enable != enableStatus) {
parantArr.push(parentObj.id);
parentObj.isEnable = row.isEnable;
//如果还有父级,则递归处理
if (row.parentId != 0) {
this.setParentEnable(parentObj, parantArr);
}
return parantArr;
}
return parantArr;
},
//根据ID,递归找对象
getRowById(id, data) {
for (let i = 0; i < data.length; i++) {
let item = data[i];
if (item.id == id) {
parentObj = item;
break;
} else {
if (this.isHasChildren(item)) {
this.getRowById(id, item.children);
}
}
}
},
getChildrenIds(row, idsArr) {
idsArr.push(row.id);
if (this.isHasChildren(row)) {
row.children.forEach((item) => {
item.isEnable = row.isEnable;
this.getChildrenIds(item, idsArr);
});
}
return idsArr;
},
//判断是否有子级点
isHasChildren(row) {
if (!this.validatenull(row.children) && row.children.length) {
return true;
} else {
return false;
}
},
//判断是否有父节点
isHasParent(row) {
if (!this.validatenull(row.ancestors) && row.ancestors != "0") {
return true;
} else {
return false;
}
},
updateWorkOrderTypeEnableFun(ids, isEnable) {
updateWorkOrderTypeEnable({
ids: ids,
isEnable: isEnable,
});
},