[英]Am I mutating my reducer state by replacing an entire array in an object?
我有一個購物車應用程序。 當我從購物車中刪除某個商品時,如果刪除請求失敗,我希望能夠將其添加回購物車。
我通過在刪除項目之前存儲我之前的項目數組來完成此操作。 如果請求無法刪除該項,我將替換整個項目數組。
請注意,有多個訂單,因為購物車可以有多個供應商,每個供應商都有自己的項目添加到購物車。
這是我的reducer,如果刪除項目請求失敗,則會將之前的項目添加回購物車。 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':
處理它case 'ADD_PRODUCT_TO_CART_ERROR':
這里沒有什么mutating
,你已經concating
以前的array
與國家秩序這是確定這樣做。
事實上,這是處理此類案件的正確方法。
Object.assign
創建一個新對象,將屬性從一個(或多個)對象輕微復制到一個新對象中。
這意味着如果您的狀態具有嵌套對象,則它們將從新對象引用(盡管它是一個新對象,如果從一個屬性中刪除屬性,它不會影響另一個)。
如果你想要不變性,我建議你使用Immutable.js
關鍵要求是reducer不能修改現有的狀態對象; 它必須產生一個新的對象。 您可以使用返回新數據副本的函數,或者如果您不想對這些js不可變函數進行大量工作,則可以使用庫immutable.js 。
這個問題對immutable.js有一些討論
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.