Redux状态突变,尽管使用传播算子进行状态复制

问题描述 投票:1回答:1

为什么在使用传播算子复制对象时为什么会收到状态突变警报?我正在尝试使用redux制作购物车。当添加一个元素或减少其数量时,我调度了一个更新状态的动作。在我的reducer中,如果尚未添加产品,则返回带有新对象的状态数组的新副本。如果已经添加,则使用map(返回一个新数组)和我正在增加并且其qty属性增加的产品副本进行迭代。此属性的问题是在不更改状态的情况下更新此属性的正确方法是什么?

减速器

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 }
            : item
        ),
  };

违规警告

Invariant Violation: A state mutation was detected inside a dispatch, in the path: `user.cart.0.qty`. Take a look at the reducer(s) handling the action {"type":"ADD_TO_CART_SUCCESS"....}
javascript reactjs redux deep-copy
1个回答
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 } // <-- This mutates the current item.qty
            : item
        ),
  };

但是您可以返回一个递增的值

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
        ),
  };
© www.soinside.com 2019 - 2024. All rights reserved.