el-tree树形实现点击父级全选子级,取消子级,父级不会取消。选中子级,自动勾选父级

实现点击父级全选子级,取消某个子级后,父级不会取消。

<template>
      <el-tree
        :data="Data"
        show-checkbox
        :default-checked-keys="ids"
        node-key="id"
        ref="tree"
        highlight-current
        :props="defaultProps"
        :check-strictly="true"
        @check="nodeClick"
      >
      </el-tree>
</template>
<script>
export default {
  data() {
    return {
      Data: [],
      ids: [],
    };
  },
  created() {
  },
  methods: {
    // 实现权限向下级联
    nodeClick(currentObj, treeStatus) {
      // 用于:父子节点严格互不关联时,父节点勾选变化时通知子节点同步变化,实现单向关联。
      let selected = treeStatus.checkedKeys.indexOf(currentObj.id); // -1未选中,>=0为选中

      // 选中
      if (selected !== -1) {
        // 子节点只要被选中父节点就被选中(需要选中父节点时候调用此方法)
        this.selectedParent(currentObj);
        // 统一处理子节点为相同的勾选状态
        this.uniteChildSame(currentObj, true);
      } else {
        // 未选中 处理子节点全部未选中
        if (currentObj.children && currentObj.children.length !== 0) {
          this.uniteChildSame(currentObj, false);
        }
      }
    },

    // 统一处理子节点为相同的勾选状态
    uniteChildSame(treeList, isSelected) {
      this.$refs.tree.setChecked(treeList.id, isSelected);
      if (treeList.children) {
        for (let i = 0; i < treeList.children.length; i++) {
          this.uniteChildSame(treeList.children[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);
      }
    },
  },
};
</script>
可以使用递归的方式来实现。具体步骤如下: 1. 遍历整个树形数据,找到所有被选中的节点。 2. 对于每个被选中的节点,判断其父级节点是否也被选中。 3. 如果该节点的所有父级节点都被选中,则返回该节点的父级节点名称。 4. 如果该节点的父级节点未被选中,则递归处理其父级节点,直到找到所有被选中父级节点。 5. 对于每个被选中子级节点,返回其名称以及父级节点名称,用“-”连接。 下面是一个示例代码(假设树形数据存储在一个名为tree的变量中): ```python def get_checked_nodes(node, checked_nodes): # 判断当前节点是否被选中 if node['checked']: # 判断父级节点是否被选中 if not node['parent'] or node['parent'] in checked_nodes: return node['parent'] or '' else: # 递归处理父级节点 parent_node = next( (n for n in tree if n['id'] == node['parent']), None) if parent_node: return get_checked_nodes(parent_node, checked_nodes) else: # 处理子级节点 for child_node in node.get('children', []): if child_node['checked']: checked_nodes.add(child_node['id']) return '{}-{}'.format( node['name'], child_node['name']) else: result = get_checked_nodes(child_node, checked_nodes) if result: return '{}-{}'.format(node['name'], result) return '' checked_nodes = set(n['id'] for n in tree if n['checked']) result = [get_checked_nodes(n, checked_nodes) for n in tree if n['checked']] ``` 其中,get_checked_nodes函数的第一个参数为当前节点,第二个参数为已经被选中的节点的ID集合。最后返回的是一个列表,每个元素对应一个被选中的节点的名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值