You need to enable JavaScript to run this app. React中选中父复选框时自动勾选所有嵌套子选项如何实现
优惠活动
大模型
产品
解决方案
定价
更多

React中选中父复选框时自动勾选所有嵌套子选项如何实现

实现父子复选框联动的代码调整方案

核心调整点

  • 修正原代码中event.target.isSelected的错误写法:原生checkbox的选中属性为event.target.checked
  • 点击父级复选框时,同步更新其所有嵌套子级的选中状态
  • 推荐用唯一id作为状态存储的key,避免name重复导致的冲突

完整调整后代码

状态与事件处理逻辑

// 存储所有复选框的选中状态,key为id,value为选中状态
const [isSelected, setIsSelected] = useState<Record<number | string, boolean>>({});

/**
 * 复选框选中事件处理
 * @param id 当前点击的复选框对应数据的id
 * @param event 复选框change事件
 * @param childList 可选参数,父级对应子成员数组,传参代表当前点击的是父级复选框
 */
const handleCheck = (
  id: number | string, 
  event: React.ChangeEvent<HTMLInputElement>,
  childList?: Array<{id: number | string, name: string}>
): void => {
  const currentChecked = event.target.checked;
  const newSelectedState = {...isSelected, [id]: currentChecked};

  // 点击父级时同步更新所有子级的选中状态
  if (childList) {
    childList.forEach(child => {
      newSelectedState[child.id] = currentChecked;
    })
  }

  setIsSelected(newSelectedState);
};

渲染层示例

{
  data.map(parentItem => (
    <div key={parentItem.id}>
      {/* 父级复选框 */}
      <input 
        type="checkbox" 
        checked={!!isSelected[parentItem.id]}
        onChange={(e) => handleCheck(parentItem.id, e, parentItem.familyMembers)}
      />
      <span>{parentItem.name}</span>
      {/* 嵌套子级复选框 */}
      <div style={{paddingLeft: 24}}>
        {
          parentItem.familyMembers.map(childItem => (
            <div key={childItem.id}>
              <input 
                type="checkbox" 
                checked={!!isSelected[childItem.id]}
                onChange={(e) => handleCheck(childItem.id, e)}
              />
              <span>{childItem.name}</span>
            </div>
          ))
        }
      </div>
    </div>
  ))
}

可选扩展功能(子级联动父级)

如果需要实现子级全选时自动勾选父级、子级部分选中时父级显示半选状态,可修改父级复选框逻辑:

const isAllChildChecked = parentItem.familyMembers.every(child => isSelected[child.id]);
const isPartChildChecked = parentItem.familyMembers.some(child => isSelected[child.id]) && !isAllChildChecked;

<input
  type="checkbox"
  checked={isAllChildChecked}
  ref={el => el && (el.indeterminate = isPartChildChecked)}
  onChange={(e) => handleCheck(parentItem.id, e, parentItem.familyMembers)}
/>

内容的提问来源于stack exchange,提问作者PengProgrammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 00:36:04