ElementUI tree组件 动态渲染编辑时 选择父级时会全选所有的子级(el-tree数据回显父节点和子节点都会被选中)
具体上代码
效果
![](https://img-blog.csdnimg.cn/2020102311283911.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM3MTU1Mzcw,size_16,color_FFFFFF,t_70#pic_center)
代码
<el-form-item label="菜单权限">
<el-tree
:data="menuOptions"
show-checkbox
default-expand-all
ref="tree"
node-key="id"
empty-text="加载中,请稍后"
:props="defaultProps"
:default-checked-keys="editordata.menu"
check-on-click-node
check-strictly
@check="checkChange"
></el-tree>
</el-form-item>
js代码
//点击树节点
checkChange(a) {
const self = this
const anode = this.$refs.tree.getNode(a)
console.log(anode.checked)
if (anode.checked) {//删除选中的
this.setParentChecked(anode.parent)
//点击权限子节点
anode.childNodes.map(res=>{
res.checked=true
})
} else {//新增选中的
this.deleteParentChecked(anode.parent)
this.deleteChildChecked(anode.childNodes)
}
},
setParentChecked(parent) {//如果不是全选中为父级添加半选状态,如果子集全选后,父级也要全选
const fnode = this.$refs.tree.getNode(parent)
const isAllChecked = fnode.childNodes.every(k => k.checked && k.indeterminate === false)//子集是否是全选
if (!fnode.isLeaf) {
fnode.indeterminate = !isAllChecked//子集是否是全选,如果子集全选,则半选状态为假
fnode.checked = true
}
if (fnode.parent) {
this.setParentChecked(fnode.parent)
}
},
deleteParentChecked(parent, d = false) {//如果取消子节点的选中, 设置父级节点选中状态
const fnode = this.$refs.tree.getNode(parent)
const isAllChecked = fnode.childNodes.some(k => d ? (k.checked || k.indeterminate) : k.checked)//子集是否是全选
if (!fnode.isLeaf) {
fnode.indeterminate = isAllChecked//子集是否是全选,如果子集全选,则半选状态为假
fnode.checked = isAllChecked
if (fnode.parent) {//如果有父节点,则需要去判断父节点是否选中
this.deleteParentChecked(fnode.parent, true)
}
}
},
deleteChildChecked(childNodes) {//删除子节点的勾选状态
if (childNodes && childNodes.length > 0) {
childNodes.map(k => {
k.indeterminate = false
k.checked = false
this.deleteChildChecked(this.$refs.tree.getNode(k).childNodes)
})
}
}
特此记录