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

React中使用setState追加对象属性仅保留最后一项的问题

问题原因及解决方案

你遇到的问题是因为React状态更新是异步且批量处理的,在map循环里每次调用setProductPrices时,引用的productPrices都是循环启动时的旧状态值,而非实时更新后的状态。所以每一次更新都是基于初始的旧状态添加单个键值对,后面的更新会直接覆盖前面的,最终只保留最后一次循环的结果。

正确写法

方式一:先转换数组为目标对象,再一次性更新

// 先把products数组转换成需要的对象结构
const newPrices = products.reduce((result, item) => {
  result[item.title] = item.unitPrice;
  return result;
}, {});
// 一次性更新状态
setProductPrices(newPrices);

方式二:基于原有状态合并(如果需要保留之前的productPrices内容)

setProductPrices(prevPrices => {
  return products.reduce((result, item) => {
    result[item.title] = item.unitPrice;
    return result;
  }, {...prevPrices}); // 复制原有状态,避免直接修改
});

为什么原代码无效

举个例子,假设products是[{title: 'first', unitPrice: 10}, {title: 'second', unitPrice: 15}],初始productPrices是空对象:

  • 第一次循环调用setProductPrices时,productPrices是空对象,生成的新对象是{first: 10}
  • 第二次循环调用时,productPrices依然是空对象(因为状态还没来得及更新),生成的新对象是{second: 15}
  • 最后状态批量更新,后一次的结果覆盖了前一次,所以最终只保留{second: 15}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:20:43