2017-09-23 82 views
0

我是新來反應/ redux,我試圖將我的一個對象以redux狀態存儲爲Map/Hash,其中的鍵是來自db和對象的主鍵作爲對象本身。然而,每次我更新時,狀態似乎都會變得過度,我添加的新值是唯一剩下的值。這裏是我的代碼:react/redux嵌套狀態問題

import { RECEIVE_CURRENT_SCAN_RESULT } from '../constants'; 

const initialState = { 
    currentScanResult: {info:{}, results:[]}, 
}; 

export default createReducer(initialState, { 
    [RECEIVE_CURRENT_SCAN_RESULT]: (state, payload) => 
     Object.assign({}, state, { 
      currentScanResult: payload 
     }) 

}); 


export function createReducer(initialState, reducerMap) { 
    return (state = initialState, action) => { 
     const reducer = reducerMap[action.type]; 

     return reducer 
      ? reducer(state, action.payload) 
      : state; 
    } 
} 

我想只是掠過我的對象:

{id: 1, thing: "blue"} 

,並已在國家與它進行更新。然後,如果我通過在:

{id: 2, thing: "red"} 

我想我的終極版狀態,以反映:

currentScanResult: {1: {id: 1, thing: "blue"}, 2: {id: 2, thing: "red"}} 

有我的任何簡單的方法來做到這一點?如果我正在更新嵌套值,會重新渲染嗎?例如,如果我通過:

{id: 2, thing: "purple"} 

=> currentScanResult: {1: {id: 1, thing: "blue"}, 2: {id: 2, thing: "purple"}} 

我希望看到類似這樣的行爲。我查看了Immutable JS,我只是想知道如果沒有它,這個簡單的用例是否可以工作?

任何幫助表示讚賞!謝謝!

回答

2

當你

Object.assign({}, state, { 
    currentScanResult: payload 
}) 

要覆蓋state.currentScanResult。如果你想更新它,你需要做類似

Object.assign({}, state, { 
    currentScanResult: Object.assign({}, state.currentScanResult, payload) 
}) 
+0

謝謝!你知道狀態是否會像這樣嵌套更新嗎?有什麼缺點? – BC00

+0

沒有問題。數據嵌套越多,更新內部結構就越乏味。有關更多詳細信息,請參閱這些文檔:http://redux.js.org/docs/recipes/reducers/ImmutableUpdatePatterns.html – JulienD

+0

是這種變異狀態,由於某種原因,當嵌套值更新時,我的組件不會重新呈現。 .. – BC00