Element UI 下拉选择树父子脱离关系后仅能选择其中一级

厚颜无耻之徒 / 2023-06-26 / 原文

<el-form-item label="业务类型">
      <el-tree-select
        @check-change="CheckBoxClick"
        v-model="ywdm"
        :data="yjywdmTree"
        :cache-data="defaultShowCode"
        :render-after-expand="false"
        style="width: 100%"
        multiple
        check-strictly="true"
        show-checkbox
        max-collapse-tags="2"
        @change="CallGetYWDM"
      ></el-tree-select>
    </el-form-item>

js代码

<script>
import axios from "@/request/index";
export default {
  name: "AlarmYwdm",
  data() {
    return {
      ywdm: [], //业务代码
      ywmc: "", //业务名称
      defaultShowCode: "",
      WorkTopUrl: this.$root.WorkTopUrl,
      yjywdmTree: [],
      allData: [],
    };
  },
  methods: {
    GetYJYWDMTree() {
      var _thant = this;
      //获取业务类型树的数据
      axios
        .post(`${this.WorkTopUrl}/api/Worktop/GetYJYWDMTree`, {})
        .then(function (res) {
          var rdata = res.data;
          if (rdata.length > 0 && rdata[0].id == "-1") {
            _thant.allData = res.data;
            _thant.yjywdmTree.push({
              label: rdata[0].name,
              value: rdata[0].id,
              pid: rdata[0].pId,
              children: [],
              disabled: false,
              isLeaf: true,
            });

            _thant.GetYJYWDMChild(_thant.yjywdmTree[0]);
            for (var i = 0; i < _thant.yjywdmTree[0].children.length; i++) {
              _thant.GetYJYWDMChild(_thant.yjywdmTree[0].children[i]);
            }
          }
        });
    },
    GetYJYWDMChild(treeObj) {
      if (this.allData.length > 0) {
        for (var i = 0; i < this.allData.length; i++) {
          if (
            treeObj.value == "-1" &&
            this.allData[i].pId == treeObj.pid &&
            this.allData[i].id != "-1"
          ) {
            treeObj.children.push({
              label: this.allData[i].name,
              value: this.allData[i].id,
              pid: this.allData[i].pId,
              disabled: false,
              children: [],
            });
          } else if (
            treeObj.value != "-1" &&
            this.allData[i].pId == treeObj.value
          ) {
            treeObj.children.push({
              label: this.allData[i].name,
              value: this.allData[i].id,
              pid: this.allData[i].pId,
              disabled: false,
              children: [],
            });
          }
        }
      }
    },
    getCheckVal() {//获取当前选中的业务类型,一般用于父页面调取
      return this.ywdm;
    },
    CallGetYWDM() {//发生变更后,通知父页面
      this.$emit("ShowYWDM");
    },
    CheckBoxClick(d1, d2) {
      // var d2 = false;
      // if (checkkey.checkedKeys.length == 0) {
      //   d2 = false;
      // } else {
      //   d2 = true;
      // }

      console.log(d1);
      var trimVal = d1.value.replace(/(0+)$/g, "");
      var Havebrother = 0;
      var HaveParent = 0;
      if (d2 == true) {
        //如果是选中操作
        if (d1.value != "-1") {
          //如果不为顶级节点
          this.yjywdmTree[0].disabled = "true"; //则顶级节点设为禁用

          if (trimVal.length == 3 || trimVal.length == 4) {
            //如果为三级节点
            var thisPid = d1.pid; //当前选中节点的父id
            for (let i = 0; i < this.yjywdmTree[0].children.length; i++) {
              if (this.yjywdmTree[0].children[i].value == thisPid) {
                //如果当前选中节点的父id==二级节点的id,则二级节点禁用
                this.yjywdmTree[0].children[i].disabled = true;
              }
            }
          }
          if (trimVal.length == 2) {
            //如果是勾选二级节点
            for (let i = 0; i < this.yjywdmTree[0].children.length; i++) {
              if (this.yjywdmTree[0].children[i].value == d1.value) {
                //匹配下拉树,当前二级节点下面的三级节点设为禁用。
                for (
                  let j = 0;
                  j < this.yjywdmTree[0].children[i].children.length;
                  j++
                ) {
                  this.yjywdmTree[0].children[i].children[j].disabled = true;
                }
              }
            }
          }
        }
      } else if (d2 == false) {
        //如果是取消勾选
        if (trimVal.length == 3 || trimVal.length == 4) {
          //,操作三级,如果去除后面0后,业务代码长度为3或者4,则判断是否有同级别被选中,如果没有,则自己的父级取消禁用
          var dstrEnd = d1.value.substr(0, 2);
          var thisChildState = 0;
          for (let i = 0; i < this.ywdm.length; i++) {
            var childTrim = this.ywdm[i].substr(0, 2);
            if (dstrEnd == childTrim && d1.value != this.ywdm[i]) {
              thisChildState++;
              Havebrother++;
            }
            if (dstrEnd != childTrim) {
              //如果除了自己父级外,有其他父级被选中,则HaveParent+1,用于判断是否取消顶级节点是否取消禁用。
              HaveParent++;
            }
          }
          if (thisChildState == 0) {
            //如果没有兄弟节点被选中则取消父级禁用状态
            for (let i = 0; i < this.yjywdmTree[0].children.length; i++) {
              if (d1.pid == this.yjywdmTree[0].children[i].value) {
                this.yjywdmTree[0].children[i].disabled = false;
              }
            }
          }
        }
        if (trimVal.length == 2) {
          //如果是操作二级,这把自己子集的禁用选项去除
          for (let i = 0; i < this.yjywdmTree[0].children.length; i++) {
            if (d1.value == this.yjywdmTree[0].children[i].value) {
              for (
                let j = 0;
                j < this.yjywdmTree[0].children[i].children.length;
                j++
              ) {
                this.yjywdmTree[0].children[i].children[j].disabled = false;
              }
            }
          }
          //判断是否存在同为二级的被选中,如果存在除自己外的二级被选中则二级节点标识+1;
          for (let i = 0; i < this.ywdm.length; i++) {
            var parstr = this.ywdm[i].substr(0, 2);
            if (parstr != trimVal) {
              HaveParent++;
            }
          }
        }
      }
      //如果不存在勾选的二级节点,三级节点,并且是取消勾选操作,则去除顶级节点及所有二级节点的禁用属性。
      if (HaveParent == 0 && d2 == false && Havebrother == 0) {
        this.SetParentCheckState();
      }
      console.log(d2);
      console.log(HaveParent);
      console.log(Havebrother);
    },
    SetParentCheckState() {
      this.yjywdmTree[0].disabled = false;
      for (let i = 0; i < this.yjywdmTree[0].children.length; i++) {
        this.yjywdmTree[0].children[i].disabled = false;
      }
    },
  },
  mounted: function () {
    this.GetYJYWDMTree();
  },
};
</script>
<style>
/*使文本框内的选中项在一排显示,不换行*/
.el-select__tags {
  white-space: nowrap;
  overflow: hidden;
}
</style>

数据格式:

 效果:

 

<script>
import axios from "@/request/index";
export default {
  name: "AlarmYwdm",
  data() {
    return {
      ywdm: [], //业务代码
      ywmc: "", //业务名称
      defaultShowCode: "",
      WorkTopUrl: this.$root.WorkTopUrl,
      yjywdmTree: [],
      allData: [],
    };
  },
  methods: {
    GetYJYWDMTree() {
      var _thant = this;
      //获取业务类型树的数据
      axios
        .post(`${this.WorkTopUrl}/api/Worktop/GetYJYWDMTree`, {})
        .then(function (res) {
          var rdata = res.data;
          if (rdata.length > 0 && rdata[0].id == "-1") {
            _thant.allData = res.data;
            _thant.yjywdmTree.push({
              label: rdata[0].name,
              value: rdata[0].id,
              pid: rdata[0].pId,
              children: [],
              disabled: false,
              isLeaf: true,
            });

            _thant.GetYJYWDMChild(_thant.yjywdmTree[0]);
            for (var i = 0; i < _thant.yjywdmTree[0].children.length; i++) {
              _thant.GetYJYWDMChild(_thant.yjywdmTree[0].children[i]);
            }
          }
        });
    },
    GetYJYWDMChild(treeObj) {
      if (this.allData.length > 0) {
        for (var i = 0; i < this.allData.length; i++) {
          if (
            treeObj.value == "-1" &&
            this.allData[i].pId == treeObj.pid &&
            this.allData[i].id != "-1"
          ) {
            treeObj.children.push({
              label: this.allData[i].name,
              value: this.allData[i].id,
              pid: this.allData[i].pId,
              disabled: false,
              children: [],
            });
          } else if (
            treeObj.value != "-1" &&
            this.allData[i].pId == treeObj.value
          ) {
            treeObj.children.push({
              label: this.allData[i].name,
              value: this.allData[i].id,
              pid: this.allData[i].pId,
              disabled: false,
              children: [],
            });
          }
        }
      }
    },
    getCheckVal() {//获取当前选中的业务类型,一般用于父页面调取
      return this.ywdm;
    },
    CallGetYWDM() {//发生变更后,通知父页面
      this.$emit("ShowYWDM");
    },
    CheckBoxClick(d1, d2) {
      // var d2 = false;
      // if (checkkey.checkedKeys.length == 0) {
      //   d2 = false;
      // } else {
      //   d2 = true;
      // }

      console.log(d1);
      var trimVal = d1.value.replace(/(0+)$/g, "");
      var Havebrother = 0;
      var HaveParent = 0;
      if (d2 == true) {
        //如果是选中操作
        if (d1.value != "-1") {
          //如果不为顶级节点
          this.yjywdmTree[0].disabled = "true"; //则顶级节点设为禁用

          if (trimVal.length == 3 || trimVal.length == 4) {
            //如果为三级节点
            var thisPid = d1.pid; //当前选中节点的父id
            for (let i = 0; i < this.yjywdmTree[0].children.length; i++) {
              if (this.yjywdmTree[0].children[i].value == thisPid) {
                //如果当前选中节点的父id==二级节点的id,则二级节点禁用
                this.yjywdmTree[0].children[i].disabled = true;
              }
            }
          }
          if (trimVal.length == 2) {
            //如果是勾选二级节点
            for (let i = 0; i < this.yjywdmTree[0].children.length; i++) {
              if (this.yjywdmTree[0].children[i].value == d1.value) {
                //匹配下拉树,当前二级节点下面的三级节点设为禁用。
                for (
                  let j = 0;
                  j < this.yjywdmTree[0].children[i].children.length;
                  j++
                ) {
                  this.yjywdmTree[0].children[i].children[j].disabled = true;
                }
              }
            }
          }
        }
      } else if (d2 == false) {
        //如果是取消勾选
        if (trimVal.length == 3 || trimVal.length == 4) {
          //,操作三级,如果去除后面0后,业务代码长度为3或者4,则判断是否有同级别被选中,如果没有,则自己的父级取消禁用
          var dstrEnd = d1.value.substr(0, 2);
          var thisChildState = 0;
          for (let i = 0; i < this.ywdm.length; i++) {
            var childTrim = this.ywdm[i].substr(0, 2);
            if (dstrEnd == childTrim && d1.value != this.ywdm[i]) {
              thisChildState++;
              Havebrother++;
            }
            if (dstrEnd != childTrim) {
              //如果除了自己父级外,有其他父级被选中,则HaveParent+1,用于判断是否取消顶级节点是否取消禁用。
              HaveParent++;
            }
          }
          if (thisChildState == 0) {
            //如果没有兄弟节点被选中则取消父级禁用状态
            for (let i = 0; i < this.yjywdmTree[0].children.length; i++) {
              if (d1.pid == this.yjywdmTree[0].children[i].value) {
                this.yjywdmTree[0].children[i].disabled = false;
              }
            }
          }
        }
        if (trimVal.length == 2) {
          //如果是操作二级,这把自己子集的禁用选项去除
          for (let i = 0; i < this.yjywdmTree[0].children.length; i++) {
            if (d1.value == this.yjywdmTree[0].children[i].value) {
              for (
                let j = 0;
                j < this.yjywdmTree[0].children[i].children.length;
                j++
              ) {
                this.yjywdmTree[0].children[i].children[j].disabled = false;
              }
            }
          }
          //判断是否存在同为二级的被选中,如果存在除自己外的二级被选中则二级节点标识+1;
          for (let i = 0; i < this.ywdm.length; i++) {
            var parstr = this.ywdm[i].substr(0, 2);
            if (parstr != trimVal) {
              HaveParent++;
            }
          }
        }
      }
      //如果不存在勾选的二级节点,三级节点,并且是取消勾选操作,则去除顶级节点及所有二级节点的禁用属性。
      if (HaveParent == 0 && d2 == false && Havebrother == 0) {
        this.SetParentCheckState();
      }
      console.log(d2);
      console.log(HaveParent);
      console.log(Havebrother);
    },
    SetParentCheckState() {
      this.yjywdmTree[0].disabled = false;
      for (let i = 0; i < this.yjywdmTree[0].children.length; i++) {
        this.yjywdmTree[0].children[i].disabled = false;
      }
    },
  },
  mounted: function () {
    this.GetYJYWDMTree();
  },
};
</script>
<style>
/*使文本框内的选中项在一排显示,不换行*/
.el-select__tags {
  white-space: nowrap;
  overflow: hidden;
}
</style>