element-ui树形组件实现父级与子级关联,子级与父级不关联

element-ui树形组件实现父级与子级关联,子级与父级不关联

需求:使用elementui在开发权限树,系统组织树时,会遇到勾选父级时,子级全选,勾选子级时父级不会被勾选(elementui正常情况下会发生后端回传ID数组中只要有父级ID,那么子级所有项都会被勾选)

使用属性check-strictly

官方文档提供属性check-strictly,在显示复选框的情况下,是否严格的遵循父子不互相关联的做法,默认为 false。
而此属性的意思是:
默认false,父子关联。有如下现象及问题:
1、当你通过函数设置勾选节点的时候,只要父节点被勾选子节点必会勾选上,即便设置勾选的list中无此子节点。
2、当你点击勾选复选框时候,若点击父节点,其下子节点全部统一跟随父节点变化;若点击子节点,子节点部分勾选时父节点处于半选状态,子节点全部勾选时父节点选中,子节点全部不勾选时父节点未选中。
设置true,严格的遵循父子不互相关联。
1、当你通过函数设置勾选节点的时候,严格通过设置勾选的list中有无此节点来断定是否勾选。
2、当你点击勾选复选框时候,无论点击的哪个节点只会改变当前节点的勾选状态,不存在半选状态。

解决办法

一、首先将树设置严格模式check-strictly=true。
二、使用@check方法进行覆写勾选功能。

<div class="treeBox-tree">
    <el-tree
        :data="orgList"
        show-checkbox
        node-key="id"
        ref="orgTree"
        :default-checked-keys="
            ruleForm.addOrgIds
        "
        check-strictly
        @check="orgCheck"
        @check-change="changeOrg"
        :default-expand-all="true"
        :check-on-click-node="true"
        :filter-node-method="
            filterOrgNode
        "
        :props="defaultProps"
    >
    </el-tree>
</div>

orgCheck(data,node) {//系统权限树操作(多个树同时存在可用名称区别)
  this.hanleCheck(data,node,'orgTree');
},
hanleCheck(data,node,treeName){
  const _this = this
  // 获取当前节点是否被选中
  const isChecked = this.$refs[treeName].getNode(data).checked
  // 如果当前节点被选中,则遍历下级子节点并选中,如果当前节点取消选中,则遍历下级节点并取消选中
  if(isChecked){
    // 判断是否有上级节点,如果有那么遍历设置上级节点选中
    // if(data.parentId||data.parentId===0){
    //   setParentChecked(data.parentId)
    // }
    // 判断该节点是否有下级节点,如果有那么遍历设置下级节点为选中
    data.childrenList && data.childrenList.length>0 && setChildreChecked(data.childrenList,true)
  }else{
    // 如果节点取消选中,则取消该节点下的子节点选中
    data.childrenList && data.childrenList.length>0 && setChildreChecked(data.childrenList,false)
  }
  function setParentChecked(parenId){
    console.log(parentId)
    // 获取该id的父级node
    const parentNode = _this.$refs[treeName].getNode(parentId)
    // 如果该id的父级node存在父级id则继续遍历
    parentNode.data.parentId && setParentChecked(setParentChecked)
    //  设置该id的节点为选中状态
    _this.$refs[treeName].setChecked(parenId,true)
  }
  function setChildreChecked(node,isChecked){
    node.forEach(item => {
      data.childrenList && item.childrenList.length>0 && setChildreChecked(item.childrenList,isChecked)
      _this.$refs[treeName].setChecked(item.id,isChecked)
    })
  }

}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Element UI的Table多选组件中,选择父级子级一起选择可以通过自定义的方式实现。 首先,我们需要在数据源中增加一个字段用于标识是否选中,例如使用"checked"字段,默认为false表示未选中。 然后,我们需要编写一个方法,在用户选择父级时,将其下所有子级都设置为选中状态。同样,在用户取消选择父级时,将其下所有子级都设置为未选中状态。可以通过递归的方式实现这个功能。 最后,我们需要在Table组件的多选列中,将checkbox的选中状态与数据源中的"checked"字段进行绑定,以实现联动效果。 具体代码如下: template: ``` <template> <el-table :data="tableData" style="width: 100%"> <el-table-column type="selection" :selectable="customSelectable"></el-table-column> <!-- 其他列 --> </el-table> </template> ``` script: ``` <script> export default { data() { return { tableData: [ { name: '父级1', children: [ { name: '子级1', checked: false }, { name: '子级2', checked: false }, ], checked: false }, { name: '父级2', children: [ { name: '子级3', checked: false }, { name: '子级4', checked: false }, ], checked: false } ] }; }, methods: { customSelectable(row, index) { return row.checked; }, handleSelectAll(selection) { selection.forEach(item => { if (item.children) { item.checked = true; this.setChildrenChecked(item.children, true); } }); }, handleSelectionChange(selection) { selection.forEach(item => { if (!item.children) { item.checked = selection.length > 0; } }); }, setChildrenChecked(children, checked) { children.forEach(child => { child.checked = checked; if (child.children) { this.setChildrenChecked(child.children, checked); } }); } } }; </script> ``` 以上代码演示了如何实现Element UI的Table多选组件中选择父级子级一起选择的功能。当用户选择父级时,其下的所有子级都会被选中;当用户取消选择父级时,其下的所有子级都会被取消选中。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值