这是我参与8月更文挑战的第4天,活动详情查看: 8月更文挑战
属性check-strictly
官方文档提供属性check-strictly,在显示复选框的情况下,是否严格的遵循父子不互相关联的做法,默认为 false。
而此属性的意思是:
默认false,父子关联。有如下现象及问题:
设置true,严格的遵循父子不互相关联。
系统的角色菜单控制的问题
问题来了,在系统的角色菜单控制的时候,需要满足以下条件:
需求思考:
一、check-strictly=false,行不通
按照需要满足的条件,明显靠近将check-strictly设置为false,于是从check-strictly=false父子互相关联的基础入手,需要解决的问题就是:
将尚未全部勾选的子节点对应的父节点改为半勾选状态,但是查找文档良久无果。
只有getHalfCheckedKeys和getHalfCheckedNodes,并没有设置成半勾选。
二、check-strictly=true,试一试
只能试一下将check-strictly设置为true,从check-strictly=true严格的遵循父子不互相关联入手,需要解决的问题就是:
而在严格的父子不互相关联时,点击父子节点不会出现半选状态,也无法通过函数设置半选状态,无奈简化解决问题:
解决代码:
1、el-tree标签属性
<el-tree ref="tree" :data="treeMenus" :props="multiProps" :show-checkbox="true"
node-key="menuId" highlight-current :expand-on-click-node="false"
:default-checked-keys="checkedId" :check-strictly="true" @check="clickDeal">
node-key:每个树节点用来作为唯一标识的属性,整棵树应该是唯一的。标识节点唯一的键值名称。
default-checked-keys = checkedId:对应el-tree多选树组件初始化时默认选中ID
check-strictly = true:是否严格的遵循父子不互相关联的做法
check:当复选框被点击的时候触发的方法
props:配置选项,具体看下图。
而根据后台的返回,针对:props="multiProps",我的配置为:
multiProps: {
children: 'childs',
label: 'name',
disabled: this.isDisabled
识别childs字段为子节点name为节点名称,而默认是识别children为子节点label为节点名称。
2、el-tree组件有变化时给多选树重新赋值
updated () {
// 给多选树设置默认值
this.$refs.tree.setCheckedKeys(this.checkedId)
checkedId为勾选节点的数组,不区分父子节点。
3、复选框点击时的特殊处理
clickDeal (currentObj, treeStatus) {
// 用于:父子节点严格互不关联时,父节点勾选变化时通知子节点同步变化,实现单向关联。
let selected = treeStatus.checkedKeys.indexOf(currentObj.menuId) // -1未选中
// 选中
if (selected !== -1) {
// 子节点只要被选中父节点就被选中
this.selectedParent(currentObj)
// 统一处理子节点为相同的勾选状态
this.uniteChildSame(currentObj, true)
} else {
// 未选中 处理子节点全部未选中
if (currentObj.childs.length !== 0) {
this.uniteChildSame(currentObj, false)
// 统一处理子节点为相同的勾选状态
uniteChildSame (treeList, isSelected) {
this.$refs.tree.setChecked(treeList.menuId, isSelected)
for (let i = 0; i < treeList.childs.length; i++) {
this.uniteChildSame(treeList.childs[i], isSelected)
// 统一处理父节点为选中
selectedParent (currentObj) {
let currentNode = this.$refs.tree.getNode(currentObj)
if (currentNode.parent.key !== undefined) {
this.$refs.tree.setChecked(currentNode.parent, true)
this.selectedParent(currentNode.parent)
复制代码