【前端】ant design中树形控件的父子节点受控实现

本文介绍如何在Ant Design的前端框架中,使用React和JavaScript实现树形控件的父子节点选择不关联的受控模式。通过设置`checkStrictly`属性,控制节点选择完全独立。详细阐述了需求,包括点击父节点时子节点不受影响,以及点击子节点时对父节点的影响规则。文章还提供了实现步骤,包括渲染TreeNode时传递path值,维护checkedNodes状态,以及处理选中和取消选中节点的方法。在提交时,检查每个父节点至少有一个选中子节点,否则提示不能提交。
摘要由CSDN通过智能技术生成

前言:

1.ant design的树形控件里面先设置好checkStrictly属性,即checkable 状态下节点选择完全受控(父子节点选中状态不再关联),这样的话,onCheck函数中的checkedKeys参数打印出来它是一个有chekcedhalfChecked属性的对象,并且父子节点的选中与否不再关联;

onCheck=(checkedKeys,event)=>{
   console.log(checkedKeys,event)
}
// 打印的第一个是{checked:[],halfChecked:[]}
// evet.node.props.dataRef打印出来就是点击的节点的相关信息

// 目录树的数据结构如下
[
   {
    menuId:'1222',// 节点id
    menuName:'xxx',// 节点显示的名字
    pMenuId:'-1',// 父节点的id,没有父节点就为-1
    hasChild:true,// 是否有孩子节点
    authority:true,// 是否是选中状态
    children:[
     {
       menuId:'1452',
       menuName:'xxx',
       pMenuId:'1222',
       hasChild:false,
       authority:false
     }
    ]
   },
   ...
]

2.checked是一个数组,里面存放所有选中的树节点,halfChecked也是一个数组,里面存放的是关联子节点的父节点

需求:

1.点击父节点,对子节点没有影响,而取消父节点的选中状态,其所有的孩子节点都取消选中(checked:false),且提交的时候如果父节点是选中状态,必有一个孩子节点是选中状态(如果第一个孩子还有孩子,那么孩子的孩子也必须有一个选中状态,以此类推。。。)否则的话会弹出提示框;

2.点击子节点,如果其父节点下只有这一个子节点是选中状态,那么父节点也变为选中状态;取消选中子节点,同理如果其父节点下没有子节点是选中状态,父节点也取消选中状态。

实现:

1.在渲染TreeNode的时候传入一个path值,可以用来追根溯源,找到祖辈的节点id;

2.需要设置一个名为checkedNodes的state值,是一个对象形式,在初始化的时候需要遍历所有选中状态的节点,设置成如下形式:

{父节点1:[子节点1,子节点2,...],父节点2:[子节点1,子节点2,...]}

/**
   * 用来处理菜单授权的目录树默认选中的节点
   * 因为函数里面涉及到递归操作所以必须要在函数外定义初始变量
   * @param checkedKeys 存放选中状态的节点id
   * @param menuId 树节点所有信息的数组
   * @param checkedNodes {父节点:[子节点1,子节点2,...]}
   */
  dealDefaultMenuId = (checkedKeys, menuId, checkedNodes) => {
    const nodes = chec
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值