簡體   English   中英

我是否通過替換對象中的整個數組來改變我的reducer狀態?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM