Redux实现reducer数组去重添加,解决无限循环与状态更新异常
核心问题根因定位
1. 组件无限重渲染循环的触发原因
componentWillReceiveProps未加「仅首次拉取到products数据后执行一次」的限制:只要后续组件收到任意新props(包括每次调用fetchIsProductLiked触发redux状态更新带来的props变更),都会满足nextProps.products.fetched为true的条件,重复遍历所有product发起请求。- 形成闭环死循环:调用
fetchIsProductLiked→ 触发对应action dispatch → redux状态更新 → 组件接收到新props → 再次进入componentWillReceiveProps判断分支 → 重复发起请求。 - 未对单个productId的请求做幂等校验,即使products数据无变化也会重复发起相同请求。
- 代码存在语法错误:
nextProps.products.map的回调函数未闭合括号,可能触发异常的组件更新行为。
2. isProductLikedData 状态无法正确更新的原因
- 非空数组处理逻辑完全偏离需求:错误使用
map遍历原有数组,遇到productId不匹配的项时直接返回新的action.payload,直接覆盖原有所有数组项,既未保留历史数据,也未实现去重追加的逻辑。 map遍历到productId匹配的项时返回undefined,导致最终生成的数组包含大量空值,数据结构完全不符合预期。- AJAX action创建函数中未dispatch
FETCH_IS_PRODUCT_LIKED类型的action,导致reducer中定义的fetching状态永远不会被置为true,状态流转逻辑断裂。
内容的提问来源于stack exchange,提问作者misakimichy
相关产品推荐
相关产品推荐

