element table树形结构switch 控制子级,子级控制父级

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,
      });
    },
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值