2016-09-19 65 views
1

我一直在閱讀有關不同方法以避免變異的狀態。其中一種方法是使用擴展運算符(...),避免使用的方法之一是推送。然而,在我的減速器,我需要一個項目添加到一個數組嵌套結構裏面,我couldn't實現CONCAT正確,所以我嘗試下面的代碼:是否在這個減速器中改變狀態?

export default function (state=[],action){ 
if (action.type === 'SELECTED_DROP') { 
    let updated = [ ...state]; 
    updated[action.payload.queryIndex].items.push(action.payload.item) ; 
    return updated; 
    } 
return state; 
} 

所以,我同時使用:傳播經營者和推。我在改變狀態嗎?

謝謝你

回答

1

是的,你在改變狀態。從我收集你的狀態是一個數組與對象包含屬性項也是一個數組。您正在修改items數組,因此您正在改變狀態。

這裏是你應該做的:

export default function (state=[], action) { 
    switch (action.type) { 
    case 'SELECTED_DROP': 
     return state.map((item,ix) => 
     ix===action.payload.queryIndex ? 
      {...item, items:[...item.items, action.payload.item]} : 
      item 
    ); 
    case default: 
     return state; 
    } 
} 

地圖功能基本返回,如果不改變舊的項目或新項目與新項目數組,如果它是正確的索引。

+0

謝謝,作爲一種魅力。 – DM1983

0

是的,你絕對是。您正在製作頂層數組的淺拷貝,但直接對內層數組進行變異。

有不可改變的數據更新的兩個基本規則:

  • 嵌套的每一層都需要有一個副本所做
  • 您可以使用突變,但只有如果你是變異的實際拷貝

在這種情況下,你需要做的頂部陣列,該索引處的項目,items陣列本身的副本。嵌套更新可能會有點醜陋,但事實就是如此。

我有很多關於如何在https://github.com/markerikson/react-redux-links/blob/master/immutable-data.md上正確編寫不可更新的更新代碼的文章的鏈接,以及指向若干實用程序庫的鏈接,以便在https://github.com/markerikson/redux-ecosystem-links/blob/master/immutable-data.md#immutable-update-utilities處抽象出這些更新。

+0

感謝您的幫助。我會檢查那些庫。使用嵌套狀態是痛苦的。 – DM1983