我是否通过替换对象中的整个数组来改变我的 reducer 状态?
Am I mutating my reducer state by replacing an entire array in an object?
我有一个购物车应用程序。当我从购物车中删除商品时,如果删除请求失败,我希望能够将其添加回购物车。
我通过在删除项目之前存储我之前的项目数组来做到这一点。如果删除项目的请求失败,我会替换回整个项目数组。
请注意,有多个订单,因为购物车可以有多个供应商,每个供应商都有自己的商品要添加到购物车。
这是我的减速器,如果删除项目请求失败,它会将之前的项目添加回购物车。 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()
会帮我处理吗?
当您处理您的 failed request to delete an item
时,您以完全不同的方式处理它很好 case 'ADD_PRODUCT_TO_CART_ERROR':
。
这里什么都没有 mutating
,因为你有 concating
之前的 array
和状态顺序,这样做是可以的。
确实是处理这种情况的正确方法。
Object.assign
创建一个新对象,将一个(或多个)对象的属性浅层复制到一个新对象中。
这意味着如果您的状态有嵌套对象,它们将从新对象中引用(尽管它是一个新对象,如果您从中删除一个属性一个不会影响另一个)。
如果不变性是你想要的,我建议你使用Immutable.js
关键要求是reducer不能修改现有的状态对象;它必须产生一个新对象。您可以使用 returns 新数据副本的函数,或者如果您不想对那些 js 不可变函数做太多工作,您可以使用库 immutable.js。
并且这个 对 immutable.js
有一些讨论
我有一个购物车应用程序。当我从购物车中删除商品时,如果删除请求失败,我希望能够将其添加回购物车。
我通过在删除项目之前存储我之前的项目数组来做到这一点。如果删除项目的请求失败,我会替换回整个项目数组。
请注意,有多个订单,因为购物车可以有多个供应商,每个供应商都有自己的商品要添加到购物车。
这是我的减速器,如果删除项目请求失败,它会将之前的项目添加回购物车。 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()
会帮我处理吗?
当您处理您的 failed request to delete an item
时,您以完全不同的方式处理它很好 case 'ADD_PRODUCT_TO_CART_ERROR':
。
这里什么都没有 mutating
,因为你有 concating
之前的 array
和状态顺序,这样做是可以的。
确实是处理这种情况的正确方法。
Object.assign
创建一个新对象,将一个(或多个)对象的属性浅层复制到一个新对象中。
这意味着如果您的状态有嵌套对象,它们将从新对象中引用(尽管它是一个新对象,如果您从中删除一个属性一个不会影响另一个)。
如果不变性是你想要的,我建议你使用Immutable.js
关键要求是reducer不能修改现有的状态对象;它必须产生一个新对象。您可以使用 returns 新数据副本的函数,或者如果您不想对那些 js 不可变函数做太多工作,您可以使用库 immutable.js。
并且这个