我是否通过替换对象中的整个数组来改变我的reducer状态



我有一个购物车应用程序。当我从购物车中删除一个项目时,如果删除请求失败,我希望能够将其添加回购物车。

我通过在删除项之前存储先前的项数组来实现这一点。如果请求删除项目失败,我将替换回整个项目数组。

请注意,有多个订单,因为购物车可以有多个供应商,每个供应商都有自己的商品要添加到购物车中。

这是我的减速器,如果删除项目请求失败,它将把以前的项目添加回购物车。itemsorder对象的属性数组

我的减速机

    case 'ADD_PRODUCT_TO_CART_ERROR':
        return Object.assign({}, state, 
        {
            orders: 
                state.orders.slice(0, action.orderIndex)
                .concat([{
                    ...state.orders[action.orderIndex],
                    items: action.previousItems
                }])
                .concat(state.orders.slice(action.orderIndex + 1))                
        })

它可以工作,但是我在这里改变了任何状态吗?或者Object.assign()会帮我解决这个问题?

Object.assign创建一个新对象,简单地将一个(或多个)对象的属性复制到一个新对象中。

这意味着如果你的状态有嵌套对象,它们将从新对象中被引用(尽管一个新对象,如果你从一个对象中删除一个属性,它不会影响另一个)。

如果你想要不可变性,我建议你使用Immutable.js

当你在处理你的failed request to delete an item时,你在一个完全不同的case 'ADD_PRODUCT_TO_CART_ERROR':中处理它是很好的。

这里没有mutating因为你有concating之前的array状态顺序这样做是可以的

关键的要求是reducer不能修改一个已经存在的状态对象;它必须产生一个新的对象。你可以使用返回数据的新副本的函数,或者如果你不想花太多的工作与那些js的不可变函数,你可以使用库immutable.js。

这个问题对immutable.js有一些讨论

相关内容

  • 没有找到相关文章

最新更新