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

React状态管理:嵌套数组操作使用event.target.name替代硬编码键

React动态处理嵌套数组State的解决方案

你遇到的核心问题是:在JavaScript对象字面量中使用变量作为键名时,必须用方括号[]包裹变量,且更新State时要保留原有属性,不能直接覆盖整个对象。以下是针对你代码的修复方案:


修复addClick函数

const addClick = (event) => {
  const key = event.target.name;
  // 用函数式更新确保基于最新State修改,同时保留其他属性
  setValue(prevValue => ({
    ...prevValue,
    [key]: [...(prevValue[key] || []), ""] // 处理键未初始化的情况,默认用空数组
  }));
};
  • 用[key]动态指定对象键名,替代硬编码的DevOps
  • ...prevValue保留State中其他嵌套数组的数据,避免丢失
  • prevValue[key] || []防止该键未定义时抛出错误

修复removeClick函数

const removeClick = (event) => {
  const key = event.target.name;
  const index = Number(event.target.id);
  
  setValue(prevValue => {
    const updatedArr = [...(prevValue[key] || [])];
    // 校验索引合法性,避免越界报错
    if (index >= 0 && index < updatedArr.length) {
      updatedArr.splice(index, 1);
    }
    return {
      ...prevValue,
      [key]: updatedArr
    };
  });
};
  • 同样用[key]动态访问和修改目标数组
  • 函数式更新确保拿到最新的State状态
  • 增加索引校验,防止无效索引导致的异常

修复遍历渲染代码

{value[input[form].name]?.map((el, i) => (
  <div key={i}>
    <Array
      name={input[form].name}
      placeholder={input[form].placeholder}
      required={input[form].required}
      key={`${input[form].placeholder}-${i}`} // 结合索引避免key重复
      el={el}
      i={i}
      handleChange={(event) => handleChange(event, input[form].input_type)}
      removeClick={() => removeClick({ target: { name: input[form].name, id: i } })} // 直接构造目标对象,传递更清晰
    />
  </div>
))}
  • 用value[input[form].name]动态访问目标数组
  • ?.可选链操作符,避免数组未定义时抛出渲染错误
  • 优化removeClick的传递方式,直接构造event参数,替代bind写法
  • 给组件key增加索引后缀,避免同类型组件key重复

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:15:43