我正在学习React和Redux,目前正在阅读Adam Freeman的Pro React 16。考虑第5章中的这个化简器示例。该化简器处理修改购物车的操作。这是减速器的一部分:import { ActionTypes } from "./Types";export const CartReducer = (storeData, action) => { let newStore = { cart: [], cartItems: 0, cartPrice: 0, ...storeData } switch(action.type) { case ActionTypes.CART_ADD: const p = action.payload.product; const q = action.payload.quantity; let existing = newStore.cart.find(item => item.product.id === p.id); if (existing) { existing.quantity += q; } else { newStore.cart = [...newStore.cart, action.payload]; } newStore.cartItems += q; newStore.cartPrice += p.price * q; return newStore;我的理解是reducer必须是纯函数,但是storeData当产品已经存在于cart数组中时,这一函数似乎会修改store参数。具体来说,它更新了cart项目的quantity属性,该属性existing来自storeData的cart数组的浅表副本。因此,storeData将被修饰为副作用。我对么?
3 回答
翻过高山走不出你
TA贡献1875条经验 获得超3个赞
我认为你是对的。
您不仅要改变状态(如您所指出的那样),而且还要返回此变异的对象。
我相信您应该只使用Immutable JS中的'set'方法来更新化简器中的状态。
精慕HU
TA贡献1845条经验 获得超8个赞
我认为创建减速器并返回新状态的正确方法如下:
export default CartReducer = (storeData = [], action) => {
switch(action.type) {
case ActionTypes.CART_ADD:
return [..state, { ..action.cart }]
default:
return storeData;
}
}
这样,您可以创建的新副本state并简单地返回new state,还需要使reducer保持简单,并避免做其他事情,例如在reducer代码中添加/更新购物车的逻辑。
您还需要创建一个default action并且返回原样state。
添加回答
举报
0/150
提交
取消