问题描述:官方提供了获取半选节点的API,但是回显会有一些没有选中的节点都勾选上了,那怎么办呢?

重新回到设置 check-strictly 为 true 时,父子级不互相关联,挨个点击用户体验不好的问题,同时也避免了出现半选的情况。

我们简化用户的操作:

1、当点击勾选复选框时候,若状态为 选中 
1.1、其所有 父节点 (父节点、父节点的父节点以此类推)全部统一跟随当前节点变化为 选中 。
1.2、其下 子节点 全部统一跟随父节点变化为 选中 。

2、当点击勾选复选框时候,若状态为 未选中 ,其下 子节点 全部统一跟随父节点变化为 未选中 。

一、el-tree 标签属性

node-key:每个树节点用来作为唯一标识的属性,整棵树应该是唯一的。标识节点唯一的键值名称。
default-checked-keys:对应el-tree多选树组件初始化时默认选中ID
check-strictly:是否严格的遵循父子不互相关联的做法,默认为false
check:当复选框被点击的时候触发的方法

<el-tree
  :data="menuTreeData"
  :default-checked-keys="editData.menuId"
  ref="trees"
  show-checkbox
  highlight-current
  accordion
  check-strictly
  node-key="id"
  :props="defaultProps"
  :default-expand-all="true"
  @check="clickDeal"
></el-tree>

二、点击复选框处理

java Element 获取值的节点 element获取节点属性_el-tree

点击事件时,若选中节点,则父节点和子节点都设为勾选状态,若取消节点选中,则取消该节点下的所有节点。

clickDeal (currentObj, treeStatus) {
  // 用于:父子节点严格互不关联时,父节点勾选变化时通知子节点同步变化,实现单向关联。
  let selected = treeStatus.checkedKeys.indexOf(currentObj.id) // -1未选中
  // 选中
  if (selected !== -1) {
    // 子节点只要被选中父节点就被选中
    this.selectedParent(currentObj)
    // 统一处理子节点为相同的勾选状态
    this.uniteChildSame(currentObj, true)
  } else {
    // 未选中 处理子节点全部未选中
    if (currentObj.childs.length !== 0) {
      this.uniteChildSame(currentObj, false)
    }
  }
},

三、处理选中父节点和子节点

通过 setChecked 设置节点是否选中状态。

java Element 获取值的节点 element获取节点属性_element-ui_02

check 事件可以传递给 data 属性的数组中该节点所对应的对象,将data 中及其下所有字节,统一处理子节点为相同的勾选状态

uniteChildSame (treeList, isSelected) {
  this.$refs.trees.setChecked(treeList.id, isSelected)
  if (treeList.children) {
    for (let i = 0; i < treeList.children.length; i++) {
      this.uniteChildSame(treeList.children[i], isSelected)
    }
  }
  
},

怎么获取选中节点的父节点呢?

首先我们先介绍 getNode,根据 data 或者 key 拿到 Tree 组件中的 node,那么我们可以通过点击节点获取到当前节点信息。

 使用 currentNode.parent.key 判断父节点是否选中,如果没选中,则设置父节点选中,同时递归查询父节点的父节点选中情况。

// 统一处理父节点为选中
selectedParent (currentObj) {
  let currentNode = this.$refs.trees.getNode(currentObj)
  if (currentNode.parent.key !== undefined) {
    this.$refs.trees.setChecked(currentNode.parent, true)
    this.selectedParent(currentNode.parent)
  }
},