iview组件tree实现点击节点勾选复选框

组件格式

<Tree :data="specialList" ref="tree" show-checkbox @on-select-change='selectChange'></Tree>

获取节点信息包含父节点半选/全选状态

this.$refs.tree.getCheckedAndIndeterminateNodes()

勾选节点出发函数selectChange

selectChange(v){
          let val=v[0]
          if(!val){
            val=this.tempTreeSelect
          }else{
            this.tempTreeSelect=val
          }
          let list=this.specialList
          for (let index = 0; index < list.length; index++) {
            const element = list[index];
            if(!val.pId&&val.id==element.id){
              let obj=JSON.parse(JSON.stringify(element))
              obj.checked=!obj.checked
              if(element.checked){
                let childArr=[]
                for (let num = 0; num < element.children.length; num++) {
                  const child = element.children[num];
                  child.checked=false
                  childArr.push(child)
                }
                obj.children=childArr
              }
              this.specialList.splice(index,1,obj)
              break
            }else if(val.pId==element.id){
              for (let num = 0; num < element.children.length; num++) {
                const child = element.children[num];
                if(val.id==child.id){
                  let obj=child
                  obj.checked=!child.checked
                  this.specialList[index].children.splice(num,1,obj)
                  return
                }
              }
            }
          }
        }

点击一节点勾选后重复点击出现返回空的状态,声明一个变量tempTreeSelect称接

遍历父级数组判断点击节点是否是父级节点且找到同一数据

若非父节点则含pId 找到对应子节点更新checked状态

实现过程发现父节点被选中后字节点默认选中,然后再次释放父节点后子节点未变化

在element.checked 父节点选中状态下过滤字节的checked状态

 

selectChange(v){
          let val=v[0]
          if(!val){
            val=this.tempTreeSelect
          }else{
            this.tempTreeSelect=val
          }
          let list=this.specialList
          for (let index = 0; index < list.length; index++) {
            const element = list[index];
            let filterList = element.children.filter((item,index)=>{
                return item.checked == true
              })
            if(!val.pId&&val.id==element.id){
              let obj=JSON.parse(JSON.stringify(element))
              
              if(obj.checked){//勾选父级时
                let childArr=[]
                obj.indeterminate=false
                for (let k = 0; k < obj.children.length; k++) {
                  const childElement = obj.children[k];
                  childElement.checked=false
                  childArr.push(childElement)
                }
                obj.children=childArr
              }else if(val.indeterminate){//半选父级时
                obj.indeterminate=false
                let childList=[]
                for (let k = 0; k < obj.children.length; k++) {
                  const childIndeterminate = obj.children[k];
                  childIndeterminate.checked=true
                  childList.push(childIndeterminate)
                }
                obj.children=childList
              }
              obj.checked=!obj.checked
              this.specialList.splice(index,1,obj)
              break
            }else if(val.pId==element.id){
              for (let num = 0; num < element.children.length; num++) {
                const child = element.children[num];
                if(val.id==child.id){
                  let tempObj=child
                  tempObj.checked=!child.checked
                  element.children.splice(num,1,tempObj)
                  //全部取消
                  if(element.indeterminate&&filterList.length==1&&filterList[0].id==val.id){
                    element.indeterminate=false
                    this.specialList.splice(index,1,element)
                  }else if(filterList.length==element.children.length&&element.checked){
                    //全选中取消一个
                    element.checked=false
                    element.indeterminate=true
                    this.specialList.splice(index,1,element)
                  }
                  return
                }
              }
            }
          }
        }

修复上发代码bug 一个父级多个子集时 选中父级后单选子集无效果 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值