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

React中修改数组对象属性时触发只读属性报错

问题分析与解决

报错原因

你用[...produtosComplementares]做的浅拷贝,只是复制了数组的外层结构,但数组里的每个对象还是指向API返回的只读对象(大概率是API返回的数据被冻结,或者在运行环境的严格模式下被标记为只读)。直接修改这些对象的属性自然会触发只读属性的报错。

另外你的代码里还有个明显的语法错误:if(item.codigoProduto == 2{ 少了一个闭合括号),这个也会导致代码运行异常。

解决方案

核心思路是:给数组里的每个对象创建独立的可修改副本,而不是直接操作原只读对象。下面是几种可行的实现方式:

方式1:用对象展开语法生成新对象

// 修正语法错误 + 生成对象副本
let arrayTemporario: any = produtosComplementares.map((item: any) => {
  // 先复制原对象的所有属性到新对象
  const newItem = { ...item };
  if (item.codigoProduto === 2) {
    newItem.quantidadeMaxima = 3;
  }
  return newItem;
});

方式2:用Object.assign创建新对象

和展开语法效果一致,适合兼容性要求更高的场景:

let arrayTemporario: any = produtosComplementares.map((item: any) => {
  const newItem = Object.assign({}, item);
  if (item.codigoProduto === 2) {
    newItem.quantidadeMaxima = 3;
  }
  return newItem;
});

方式3:处理嵌套对象的深拷贝

如果你的对象里还有嵌套的子对象,上面两种浅拷贝对象的方式就不够了,可通过JSON序列化反序列化生成完全独立的副本:

let arrayTemporario: any = produtosComplementares.map((item: any) => {
  // 序列化再反序列化,生成和原对象完全独立的副本
  const newItem = JSON.parse(JSON.stringify(item));
  if (item.codigoProduto === 2) {
    newItem.quantidadeMaxima = 3;
  }
  return newItem;
});

重要提醒

  • 浅拷贝只处理数组外层,内部对象还是原引用,原对象只读就会报错;必须给每个对象单独创建副本。
  • 一定要修正if语句的语法错误,缺失的闭合括号会直接导致代码无法运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:55:14