vue+element UI 当前节点的向上所有父节点全部勾选,向下的所有子节点不进行勾选,并在文本框进行展示勾选内容,勾选时并隐藏下拉框

项目当中的需求实现自定义勾选树,当选择子节点的时候,当前节点的向上所有父节点全部勾选,向下的所有子节点不进行勾选,并在文本框进行展示勾选内容,勾选时并隐藏下拉框,鼠标放置文本框,出现清除按钮,点击清楚文本并重置树,并且需要记录当前勾选的标识,名称等节点信息。后端返回的树节点信息,到底有几层未知,数据量到底有多大未知。
项目环境:vue+element UI 树(el-tree)
在这里插入图片描述
在这里插入图片描述

<el-form
    class="sarch_container mt30"
    label-width="70px"
    label-position="left"
    :model="formLabelAlign"
    @submit.native.prevent
>
	<el-form-item label="上级标签:" class="sarch_form_item">
	     <el-select v-model="formLabelAlign.parentTag" placeholder="请选择上级标签" ref="sarchTree" clearable @change="sarchTagChange()">
	         <el-option class="select_tree_item" :value="prevTagArr">
	             <el-tree
	                 :data="prevTagArr"
	                 show-checkbox
	                 ref="tagTree"
	                 node-key="code"
	                 check-strictly
	                 @check="checktagTreeNode"
	             >
	             </el-tree>
	         </el-option>
	     </el-select>
	</el-form-item>
</el-form>

data

prevTagArr:[{"code":"0jdGu33w","label":"data","pcode":"0","children":[]},{"code":"1212DWE","label":"home","pcode":"0","children":[{"code":"12345678","label":"tmp","pcode":"1212DWE","children":[{"code":"2BkCxUst","label":"room","pcode":"12345678","children":[{"code":"3FDZUkFF","label":"ui","pcode":"2BkCxUst","children":[{"code":"4J6rg1Wi","label":"ombs","pcode":"3FDZUkFF","children":[{"code":"4WlSEliD","label":"zip","pcode":"4J6rg1Wi","children":[]},{"code":"5dLPYAKR","label":"jar_11","pcode":"4J6rg1Wi","children":[]},{"code":"66666666","label":"jdk","pcode":"4J6rg1Wi","children":[]}]}]}]},{"code":"2tmt60KC","label":"啥","pcode":"12345678","children":[{"code":"jiUUyeVB","label":"滴滴222","pcode":"2tmt60KC","children":[]}]},{"code":"o9kZORnc","label":"321122","pcode":"12345678","children":[]}]},{"code":"opt9nnvx","label":"000","pcode":"1212DWE","children":[{"code":"rxVDK1bS","label":"啥也不是2456","pcode":"opt9nnvx","children":[]}]}]},{"code":"7Y837XwW","label":"lrzsz","pcode":"0","children":[{"code":"7YFmAEua","label":"xuyue","pcode":"7Y837XwW","children":[{"code":"v86YirXW","label":"666","pcode":"7YFmAEua","children":[]}]},{"code":"88888877","label":"util","pcode":"7Y837XwW","children":[]},{"code":"88888888","label":"mysql","pcode":"7Y837XwW","children":[]},{"code":"f25CZrGh","label":"112","pcode":"7Y837XwW","children":[]},{"code":"icvHZwu9","label":"3","pcode":"7Y837XwW","children":[]}]},{"code":"97m0mjdG","label":"Memory","pcode":"0","children":[{"code":"5pwzFNMJ","label":"滴滴2","pcode":"97m0mjdG","children":[]},{"code":"ALCGyCwE","label":"zookeeper","pcode":"97m0mjdG","children":[]},{"code":"CbdHmPvZ","label":"zookeeper_1","pcode":"97m0mjdG","children":[]},{"code":"EQvYrT5Q","label":"zookeeper-2","pcode":"97m0mjdG","children":[]}]},{"code":"FEC4qQso","label":"kafka","pcode":"0","children":[{"code":"FEDGTDD","label":"kafka_1.1.0","pcode":"FEC4qQso","children":[]},{"code":"FkWmcd76","label":"kafka_1.2.0","pcode":"FEC4qQso","children":[]},{"code":"FpaIACtO","label":"kafka_1.3.0","pcode":"FEC4qQso","children":[]},{"code":"H35AhEz5","label":"kafka_1.4.0","pcode":"FEC4qQso","children":[]}]},{"code":"HFvnIoYW","label":"reids","pcode":"0","children":[{"code":"HYGYK12","label":"bin","pcode":"HFvnIoYW","children":[]},{"code":"Iq0k9j3x","label":"config","pcode":"HFvnIoYW","children":[]},{"code":"Iw4W08Vo","label":"redis-1","pcode":"HFvnIoYW","children":[]},{"code":"JUHUG12","label":"redis-2","pcode":"HFvnIoYW","children":[]}]},{"code":"JuqP37K6","label":"tmp","pcode":"0","children":[{"code":"KIUJYHYG","label":"ombs","pcode":"JuqP37K6","children":[]},{"code":"KRm2ikmG","label":"优化新增","pcode":"JuqP37K6","children":[]},{"code":"L5N1rj6B","label":"other1","pcode":"JuqP37K6","children":[]},{"code":"LVSFUYC1","label":"other2","pcode":"JuqP37K6","children":[]},{"code":"M1X8WsAn","label":"other3","pcode":"JuqP37K6","children":[]}]},{"code":"MyF62Y7t","label":"abc","pcode":"0","children":[{"code":"N9DV6UTq","label":"1","pcode":"MyF62Y7t","children":[]},{"code":"PEOl1tIn","label":"2","pcode":"MyF62Y7t","children":[]},{"code":"PtaCsEts","label":"3","pcode":"MyF62Y7t","children":[]},{"code":"S059eM3E","label":"4","pcode":"MyF62Y7t","children":[]}]},{"code":"Sc667jBt","label":"eer","pcode":"0","children":[{"code":"T46Vbb92","label":"ety","pcode":"Sc667jBt","children":[]},{"code":"Uq85P8Rx","label":"etc","pcode":"Sc667jBt","children":[]},{"code":"Vg6CZSHX","label":"etx","pcode":"Sc667jBt","children":[{"code":"VxAzp1sZ","label":"etx-1","pcode":"Vg6CZSHX","children":[]},{"code":"W91vdDph","label":"etx-2","pcode":"Vg6CZSHX","children":[]}]}]},{"code":"UXNBbWlO","label":"b","pcode":"0","children":[]},{"code":"YGYFJUJJ","label":"ux","pcode":"0","children":[{"code":"YRHHTFS","label":"uxl","pcode":"YGYFJUJJ","children":[]},{"code":"aHNFpT6b","label":"uxp","pcode":"YGYFJUJJ","children":[]},{"code":"acg9RvHM","label":"uxe","pcode":"YGYFJUJJ","children":[]},{"code":"bYVpAJFU","label":"uxa","pcode":"YGYFJUJJ","children":[]},{"code":"dUdlXsni","label":"uxgd","pcode":"YGYFJUJJ","children":[]},{"code":"kjELWFVz","label":"uxmm","pcode":"YGYFJUJJ","children":[{"code":"mWcbjjUr","label":"uxmmr","pcode":"kjELWFVz","children":[]},{"code":"o6FcMyct","label":"uien","pcode":"kjELWFVz","children":[]},{"code":"oBtgdEau","label":"uieef","pcode":"kjELWFVz","children":[]}]}]},{"code":"mlS85xh6","label":"uie","pcode":"0","children":[]},{"code":"oMt8FkPv","label":"puyo","pcode":"0","children":[{"code":"r9GmZUn9","label":"pugf","pcode":"oMt8FkPv","children":[]},{"code":"v0qvhQW2","label":"punu","pcode":"oMt8FkPv","children":[]},{"code":"wu2UeRMf","label":"puer","pcode":"oMt8FkPv","children":[]},{"code":"xKilTar4","label":"pugh","pcode":"oMt8FkPv","children":[]}]}],
formLabelAlign: {
    parentTagCode:'',
    parentTag: "",
    tagName: ""
},
prevCheckNode:[],//存储树节点
prevCheckName:[],//存储树名称
checkedKeys:[],//暂存选择的树节点
checkTreeName:[],//暂存选择的树名称
tpArr:''

methods

checktagTreeNode: function (a, b) {
   const _self=this
   var resArr=[];//所有的code label 集成数组
   _self.getTagMap(_self.prevTagArr,resArr);
   //初始化各数据开始
   _self.checkedKeys=[]
   _self.checkTreeName=[]
   _self.formLabelAlign.parentTag=''
   _self.formLabelAlign.parentTagCode=''
   //初始化各数据结束
   // debugger
   if(_self.prevCheckNode.length){//判断是否是选择过树之后的点击
       let booFlag=true//判断是否是第二次点击取消选择标记
       _self.prevCheckNode.forEach(ele => {//遍历存储的树节点
           if(ele === a.code){//判断节点相同说明是第一个父节点
               _self.$nextTick(() => {
                   _self.$refs.tagTree.setCheckedKeys([]);//树选择滞空
               });
               _self.prevCheckNode=[]//节点存储滞空
               _self.prevCheckName=[]//节点名称存储滞空
               _self.formLabelAlign.parentTag=''//select下拉滞空
               _self.formLabelAlign.parentTagCode=''
               booFlag = false//修改标记
           }
       })
       if(booFlag){//判断标记true说明虽然第二次点击,但是不是取消选择,只是修改选择节点
           if (b.checkedKeys.length > 0) {//判断节点选择树大于零说明是修改
               if(a.pcode === '0'){//第一子结点后端返回pcode父节点为'0',作为判断依据
                   _self.checkedKeys=[a.code]//将当前节点存储
                   _self.checkTreeName=[a.label]//将当前节点名称存储
                   _self.$nextTick(() => {
                       _self.$refs.tagTree.setCheckedKeys(_self.checkedKeys);//设置勾选节点
                   });
               }else{//否则说明当前节点是勾选节点
                   _self.checkedKeys=[a.code,a.pcode]//存储父节点和当前节点code
                   _self.checkTreeName=[a.label]//存储当前节点名称
                   _self.checkPcode(resArr,a)//对冒泡排序重组map进行对比存储当前节点向上所有父节点的名称和节点code
                   _self.$nextTick(() => {
                       _self.$refs.tagTree.setCheckedKeys(_self.checkedKeys);//设置树选择
                   });
               }
           }
           _self.prevCheckNode=_self.checkedKeys//存储节点
           _self.prevCheckName=_self.checkTreeName//存储节点名称
           for (let i = _self.prevCheckName.length - 1; i >= 0; i--) {//存储时父节点在后,所以倒序遍历并给到select
               _self.formLabelAlign.parentTag += `/${_self.prevCheckName[i]}`
           }
       }
       _self.$refs.sarchTree.blur()//调用select blur()方法隐藏select
   }else{//说明时第一次进行选择树节点
       if (b.checkedKeys.length > 0) {//判断节点选择树大于零说明是修改
           if(a.pcode === '0'){//第一子结点后端返回pcode父节点为'0',作为判断依据
               _self.checkedKeys=[a.code]//将当前节点存储
               _self.checkTreeName=[a.label]//将当前节点名称存储
               _self.$nextTick(() => {
                   _self.$refs.tagTree.setCheckedKeys(_self.checkedKeys);//设置勾选节点
               });
           }else{//否则说明当前节点是勾选节点
               _self.checkedKeys=[a.code,a.pcode]//存储父节点和当前节点code
               _self.checkTreeName=[a.label]//存储当前节点名称
               _self.checkPcode(resArr,a)//对冒泡排序重组map进行对比存储当前节点向上所有父节点的名称和节点code
               _self.$nextTick(() => {
                   _self.$refs.tagTree.setCheckedKeys(_self.checkedKeys);//设置树选择
               });
           }
       }
       _self.prevCheckNode=_self.checkedKeys//存储节点
       _self.prevCheckName=_self.checkTreeName//存储节点名称
       for (let i = _self.prevCheckName.length - 1; i >= 0; i--) {//存储时父节点在后,所以倒序遍历并给到select
           _self.formLabelAlign.parentTag += `/${_self.prevCheckName[i]}`
       }
       _self.$refs.sarchTree.blur()//调用select blur()方法隐藏select
   }
   _self.formLabelAlign.parentTagCode=a.code
},
checkPcode(a,b){//检查当前节点的向上父节点,冒泡遍历存储
   let _self=this
   if(b.pecode !== '0'){
       a.forEach(i => {
           if(i.code === b.pcode){
               _self.checkedKeys.push(i.code)
               _self.checkTreeName.push(i.label)
               _self.checkPcode(a,i)
           }
       })
   }
},
sarchTagChange(){//清空select时清空树和对应存储内容
   let _self=this
   if(this.formLabelAlign.parentTag === ''){
       _self.$nextTick(() => {
           _self.$refs.tagTree.setCheckedKeys([]);
       });
       _self.prevCheckNode=[]
       _self.prevCheckName=[]
       _self.formLabelAlign.parentTagCode=''
   }
},
getTagMap(tdata,resData){//冒泡遍历后端json数据,存储方便使用的数据
   let _self=this
  if(Array.isArray(tdata) && tdata.length>0){
    tdata.forEach(function(v,i){
       var newValue={
               'code':v.code,
               'label':v.label,
               'pcode':v.pcode
           };
           resData.push(newValue)
           _self.getTagMap(v.children,resData);
    });
  }
},
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值