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

React动态添加表单字段触发非可写长度数组索引属性TypeError如何解决

报错原因
  • React的state是只读不可直接修改的,你用Object.assign({}, form)只做了最外层对象的浅拷贝,内部的experience数组还是和原来state里的数组指向同一个引用,这个引用在React严格模式下是被冻结的,长度属性不可写,直接调用push方法尝试修改原数组长度就会抛出这个报错。
  • Object.assign属于浅拷贝,只会复制对象的顶层属性,如果属性值是数组、对象这类引用类型,只会复制内存地址,不会深层复制对应的内容,所以你修改temp.experience本质还是在修改原state里的数组。
解决方案

你需要先对experience数组做一次独立拷贝,再修改新拷贝的数组,更新到新的form对象里即可,修改后的代码如下:

const addExperience = () => {
  setForm(prevForm => {
    // 先拷贝旧的experience数组,再追加新元素
    const newExperience = [...prevForm.experience, {
      company: "",
      position: "",
      startDate: "",
      endDate: "",
      description: "",
    }];
    // 返回新的form对象,其他属性保留,仅替换experience字段
    return {
      ...prevForm,
      experience: newExperience
    }
  });
}

推荐使用函数式更新的方式读取旧state,避免闭包陷阱导致的旧state值过期问题。
如果需要新增education、projects、skills等其他字段组,复用同样的逻辑替换对应数组字段即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:54:03