反应减速器错误的增量数

Posted

技术标签:

【中文标题】反应减速器错误的增量数【英文标题】:React reducer wrong increment number 【发布时间】:2022-01-10 16:42:05 【问题描述】:

我在调度触发 ADD_TO_CART 类型的操作时遇到问题。当用户单击它时,我想增加购物车中添加的特定数字的数量。我得到的数量数字是:1、3、5、7、9 ..但它们应该只增加 1,如 1、2、3、4、5。为什么我的 if 语句会加倍当我想间接更新状态而不改变它时?非常感谢任何形式的帮助。

这是我的代码:

switch(action.type)
    case 'ADD_TO_CART':
        let tempCart = [...state.cart];
        let specificIndex = state.cart.findIndex((obj) => obj.id === action.item.id);
        if(specificIndex >= 0)
            tempCart[specificIndex].quantity +=1; // it should increment only by 1 and not by 2
            tempCart[specificIndex].price += action.item.price;
            return
                ...state,
                cart : tempCart,
            
        

这是我上面例子的状态:

export const initialState = 
cart: [],
;

【问题讨论】:

你确定这个reducer只被调用一次吗?我建议添加一个 console.log("test");到你的reducer代码的第一行,以确保这个reducer只被调用一次。 【参考方案1】:

我怀疑这是因为您将tempCart 视为可变(直接添加到其成员),而实际上它只是对(不是副本的引用of) state 的一部分,应始终被视为不可变。相反,请尝试以下操作:

switch (action.type) 
  case "ADD_TO_CART":
    let specificIndex = state.cart.findIndex(
      (obj) => obj.id === action.item.id
    );
    if (specificIndex >= 0) 
      return 
        ...state,
        cart: state.cart.map((item, idx) =>
          idx == specificIndex
            ? 
                ...item,
                quantity: item.quantity + 1,
                price: item.price + action.item.price,
              
            : item
        ),
      ;
    

请参阅Immutable Update Patterns 了解更多信息。请注意,即使在这个小例子中,这些类型的更新也会很快变得笨拙。如果您愿意,可以使用helper libraries 来简化流程。

【讨论】:

以上是关于反应减速器错误的增量数的主要内容,如果未能解决你的问题,请参考以下文章

使用 redux 反应原生路由:错误:期望减速器是一个函数

使用 Redux 反应热重载

用于反应中多个异步调用的单个减速器,redux

修改状态和更新减速器的正确方法? (反应/还原)

在 redux 连接的反应应用程序中未定义初始状态

反应中的setState增量和每个增量1有啥区别[重复]