element-ui树形控件,子节点选择时,将半选状态的父节点同时取出的解决方法

  • Post author:
  • Post category:其他


用element的树形控件实现权限管理的时候碰到一个问题,当一项大权限节点下的小权限节点被选中时,大节点属于半选状态,但是最后输出的结果不包含大节点的id 这样会导致两个问题

  • 首先第一次选择时,传给后端的权限列表不包含大的权限id
  • 回显时,如果包含了大的权限时,会直接将大权限下的所有子权限都选中

这样和我们的需求是完全不一样的, 看过文档也没有可配置的解决方法.然后我自己花了点时间用遍历+递归的方法解决了 虽然比较麻烦但是最终解决了问题,实现过程如下

  //该部分是将半选状态下的父节点加入id数组中
//树形控件
<el-tree
    :data="list"
    show-checkbox
    node-key="id"
    ref="tree"
    highlight-current
    :props="defaultProps">
</el-tree>


//提交是把拥有子节点的父权限加入id数组

var arr  = this.$refs.tree.getCheckedKeys()
var array = []
for(var i = 0;i < arr.length;i++) {
   fun(arr[i],this.list,array)
}
function noRepeat(arr,value) { //id去重
    for(var i = 0;i < arr.length;i++) {
       if(arr[i] == value){
           return false
        }
 }
 return true
 }
 function fun(value,data,arr) {   //通过查询父节点下是否右子节点 将半选状态的父节点加入数组中
 for( var i  = 0;i < data.length;i++){
 	var mod = data[i]
 	if(mod.id == value) {
 		if(noRepeat(arr,mod.id)) {
 			arr.push(mod.id)
 		}
 		return true;
 }else {
 	if(mod.child) {
	 	var bool = fun(value, mod.child, arr)
 		if(bool) {
 			if (noRepeat(arr, mod.id)) {
 				arr.push(mod.id)
			 }
 		return true
 	}
 }
}
 }
  return false
}

------------------------------------------------------
//以下部分是回显时,将只有部分选择子节点的父节点剔除

 var arr = this.permissionIds
        var array = []
        function fun(value,data,arr) {
          for( var i  = 0;i < data.length;i++){
            var mod = data[i]
            if(mod.id == value) {
              if(mod.child.length == 0){
                arr.push(mod.id)
                return true
              }
            return true
            }else {
              mod.child.id
              if(mod.child.length != 0) {
                fun(value, mod.child, arr)
              }
            }
          }
          return true
        }
        for(var i = 0;i < arr.length;i++) {
          fun(arr[i],this.list,array)
        }
        this.permissionIds = array

基本实现就是这样 ,因为写的比较晚,细节有点忘了 .写起来比较麻烦,思路挺简单的.



版权声明:本文为deng1456694385原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。