我有一个购物车应用程序。当我从购物车中删除一个项目时,如果删除请求失败,我希望能够将其添加回购物车。
我通过在删除项之前存储先前的项数组来实现这一点。如果请求删除项目失败,我将替换回整个项目数组。
请注意,有多个订单,因为购物车可以有多个供应商,每个供应商都有自己的商品要添加到购物车中。
这是我的减速器,如果删除项目请求失败,它将把以前的项目添加回购物车。items
是order
对象的属性数组
我的减速机
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有一些讨论