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
相关产品推荐
相关产品推荐

