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

React Native数组对象重复添加问题:新增对象重复次数递增原因排查

问题分析与解决方案

你的问题核心是showShipments里的forEach循环逻辑错误,同时也存在违反React数组不可变性原则的问题:

当数组已有元素时,你遍历每个元素,只要当前元素不匹配lookup_scan就执行一次push操作。比如:

  • 数组有1个元素,新对象不匹配 → push1次,数组变为2个
  • 数组有2个元素,新对象不匹配 → 遍历2次,push2次,数组变为4个
  • 数组有4个元素,新对象不匹配 → 遍历4次,push4次,数组变为8个
    这就是新增次数翻倍的原因。另外你直接修改SegregationContext.shipments原数组,不符合React状态不可变性要求,会导致状态更新异常、组件渲染混乱。

修正后的代码实现

正确逻辑应该是先检查数组中是否存在目标对象,存在则替换,不存在则添加,全程遵循不可变性原则:

useEffect(() => {
  if (route.params && route.params.lookup_scan) {
    showShipments();
  }
}, [route]);

const showShipments = () => {
  // 复制当前数组副本,避免直接修改原数组
  const currentShipments = [...SegregationContext.shipments];
  // 查找匹配元素的索引
  const matchIndex = currentShipments.findIndex(
    item => item.lookup_scan === route.params.lookup_scan
  );

  if (matchIndex !== -1) {
    // 存在匹配项,替换对应位置的元素
    currentShipments[matchIndex] = { ...route.params };
  } else {
    // 无匹配项,添加新元素
    currentShipments.push({ ...route.params });
  }

  // 更新状态(若Context有对应的更新方法,也需同步更新Context)
  setShipments(currentShipments);
  // 示例:如果Context提供了更新方法,需同步调用
  // SegregationContext.setShipments(currentShipments);
  setIsLoader(false);
};

关键注意事项

  • 绝不直接修改React状态/Context中的原数组,必须操作副本后再更新状态
  • 用findIndex一次性定位匹配元素,避免遍历过程中修改数组长度引发的异常
  • 对route.params做浅拷贝({ ...route.params }),防止后续参数变化影响已存入数组的对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:00:47