3 回答
TA贡献1775条经验 获得超8个赞
您正在改变当前项。前/后递减/递减将改变它所操作的当前对象引用。
case types.ADD_TO_CART_SUCCESS:
const isAdded = state.cart.find(item => item.sku === action.product.sku);
if (!isAdded) action.product.qty = 1;
return {
...state,
cart: !isAdded
? [action.product, ...state.cart]
: state.cart.map(item =>
item.sku === action.product.sku
? { ...item, qty: ++item.qty } // <-- This mutates the current item.qty
: item
),
};
但是,您可以返回递增的值,当前item.qty + 1
case types.ADD_TO_CART_SUCCESS:
const isAdded = state.cart.find(item => item.sku === action.product.sku);
if (!isAdded) action.product.qty = 1;
return {
...state,
cart: !isAdded
? [action.product, ...state.cart]
: state.cart.map(item =>
item.sku === action.product.sku
? { ...item, qty: item.qty + 1 }
: item
),
};
我怀疑您的代码按预期运行,因为您确实正确替换了整个购物车数组,并且您变异的项目是您想要更新的项目,但这表明您的化简器可能不是纯函数,即在化简器计算下一个状态后,先前的状态在所有方面仍应等于先前的状态。
TA贡献1780条经验 获得超4个赞
看起来您正在使用我们的官方 Redux Toolkit 包,默认情况下,该包将警告意外状态突变。这很好,因为它显然在这种情况下发现了一个突变。
但是,更好的是,Redux Toolkit在内部使用Immer来让你在化简器中编写“变异”状态更新!这意味着您的化简器逻辑可以简化为:
const cartSlice = createSlice({
name: 'cart',
initialState,
reducers: {
addToCartSuccess(state, action) {
const item = state.cart.find(item => item.sku === action.payload.product.sku);
if (item) {
item.qty++;
} else {
action.product.qty = 1;
state.cart.unshift(action.payload.product);
}
}
}
})
TA贡献1827条经验 获得超8个赞
我做了几次这样的东西,试试这个代码:
const addItemToCart = (cartItems, cartItemToAdd) => {
const existingCartItem = cartItems.find(
(cartItem) => cartItem.id === cartItemToAdd.id
);
if (existingCartItem) {
return cartItems.map((cartItem) =>
cartItem.id === cartItemToAdd.id
? { ...cartItem, quantity: cartItem.quantity + 1 }
: cartItem
);
}
return [...cartItems, { ...cartItemToAdd, quantity: 1 }];
};
添加回答
举报
