使用Redux Toolkit时首次添加购物车项无法通过useSelector获取的问题
Redux Toolkit购物车添加商品后useSelector未更新的问题解决
核心问题出在Redux Toolkit reducer的写法上:你直接对state变量进行赋值操作,绕过了Immer的不可变更新追踪机制。
Redux Toolkit的createSlice依赖Immer库实现便捷的不可变更新——它允许你在reducer里"直接修改"state(实际是生成不可变的新状态),但如果执行state = merge(state, action.payload),只是把局部变量state指向了新对象,Immer并没有追踪到原state对象的变化,导致Redux store的更新未被正确触发,组件也就不会重新渲染获取新数据。
两种正确写法
1. 直接修改原state对象(利用Immer代理)
让lodash的merge直接修改Immer代理的state对象,Immer会自动处理不可变更新:
updateByPayload: (state, action: PayloadAction<Cart>) => { merge(state, action.payload); }
2. 返回新的状态对象
手动创建新对象并返回,符合Redux的不可变更新原则,也能被正确追踪:
updateByPayload: (state, action: PayloadAction<Cart>) => { return merge({}, state, action.payload); }
内容的提问来源于stack exchange,提问作者gerdo smith
相关产品推荐
相关产品推荐

