You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中如何使用setState更新嵌套对象内数组项的复选框勾选状态

问题核心原因

你的代码存在两个典型错误:

  • 状态更新时结构不匹配:初始todoList是包含foundation、discovery两个分类的嵌套对象,你当前更新时直接将处理后的steps数组传入setTodoList,直接覆盖了原有完整结构,导致状态异常。
  • 复选框使用了非受控属性:defaultChecked只会在组件首次渲染时生效,后续状态更新不会同步修改勾选状态,需要换成受控属性checked。

修正方案

1. 修改状态更新方法

嵌套状态更新需要保证每一层都做不可变拷贝,避免直接修改原状态,推荐使用函数式更新保证拿到最新的状态值:

const updateCheckFoundation = ({isDone, key}) => {
  setTodoList(prevTodoList => {
    // 逐层拷贝,只修改需要更新的字段
    return {
      ...prevTodoList, // 保留discovery等其他分类的所有数据
      foundation: {
        ...prevTodoList.foundation, // 保留foundation下除steps外的其他属性
        steps: prevTodoList.foundation.steps.map(todo => 
          todo.key === key ? {...todo, isDone} : todo
        )
      }
    }
  })
}

2. 修改复选框属性

将渲染代码中的defaultChecked改为受控属性checked,保证视图和状态完全同步:

<input 
  type="checkbox" 
  checked={item.isDone} // 替换原defaultChecked
  onClick={(event)=> updateCheckFoundation({
      isDone:event.target.checked, 
      key:item.key
  })}
/>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:36:04