首页 > 其他分享 >Element UI 下拉选择树父子脱离关系后仅能选择其中一级

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

时间:2023-06-26 12:11:25浏览次数:29  
标签:yjywdmTree ++ 后仅 value Element length UI 节点 children

<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>

标签:yjywdmTree,++,后仅,value,Element,length,UI,节点,children
From: https://www.cnblogs.com/Lynnyin/p/17505315.html

相关文章

  • Three.js教程:gui.js库(可视化改变三维场景)
    推荐:将NSDT场景编辑器加入你的3D工具链其他系列工具:NSDT简石数字孪生gui.js库(可视化改变三维场景)gui.js库(可视化改变三维场景)dat.gui.js说白了就是一个前端js库,对HTML、CSS和JavaScript进行了封装,学习开发的时候,借助dat.gui.js可以快速创建控制三维场景的UI交互界面,你打开......
  • UUID模块生成随机字符串
    UUID模块生成随机字符串【一】UUID详解UUID(UniversallyUniqueIdentifier)是一种128位的标识符用于在计算机系统中识别唯一性。它通常表示为一个32个十六进制数目,用连字符分隔开来的形式,如xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。Python中的uuid模块可以生成和操作......
  • 07.生成器模式(Builder)
    使用生成器模式来解决问题定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。生成器模式的结构和说明Builder:生成器接口,定义创建一个Product对象所需的各个部件的操作。ConcreteBuilder:具体的生成器实现,实现各个部件的创建,并负责组装Produ......
  • Element textarea 行数限制,超过限定行数不允许输入
    代码methods:{//获取行数getRow(val){letrow=0val.split('\n').forEach(item=>{if(item.length===0){row+=1//如果一行只有回车符就是行数增加一行}else{row+=Math.ceil(item.replace(/[\u0......
  • vue根据element-ui实现下拉多选
    下拉多选element-ui实现效果组件代码<template><el-selectclass="maxwidth"v-model="showVal"multipleplaceholder="请选择":popper-append-to-body="false"@remove-tag="removetag"@......
  • Microsoft Message Queuing(MSMQ)是由微软开发的一种消息队列服务,用于在分布式应用程序
    MicrosoftMessageQueuing(MSMQ)是由微软开发的一种消息队列服务,用于在分布式应用程序之间进行异步通信。它提供了一种可靠的方式来在不同的应用程序之间发送消息,并确保消息的可靠传递。MSMQ基于消息队列的原理,应用程序可以将消息发送到队列中,然后其他应用程序可以从队列中接收这......
  • 2023-06-25 Cannot find module 'uview-ui'
    前言:把uview2.0版本通过hx导入插件方式引入项目中,运行,遂报错:Cannotfindmodule'uview-ui'==》无法找到模块'uview-ui' 检查项目下载的包,'uview-ui'已存在,并存放于uni_modules文件夹中,引入代码为://main.js,注意要在use方法之后执行importuViewfrom"uview-ui";Vue.use(......
  • 开发实用小技巧(1):RuntimeError: 'cryptography' package is required for sha256_passw
    问题:RuntimeError:'cryptography'packageisrequiredforsha256_passwordorcaching_sha2_passwordauthmethods这个错误通常是由于在使用MySQL数据库时,未安装或功能不完整的“cryptography”包所引起的,所以下载“cryptography”这个包即可!!!解决思路:pipinstallcryptogr......
  • QT为什么只能由主线程操作UI
    QT为什么只能由主线程操作UI背景QT中,每次子线程去更新Ui都要通过信号槽去刷。其实不光是QT,很多GUI程序框架都是这么规定的。主线程:主线程是唯一允许创建QApplication或者QCoreApplication对象的,并且调用exec()启动事件循环的线程。原因直接原因:UI线程负责和用户交互,因此不能......
  • elementplus vue 范围输入框
    <divclass="fv-rowmb-7"><labelclass="fs-6fw-semoboldmb-2">{{t("Numberofgroups")}}</label><el-form-itemprop="formInline.group"><el-inputcl......