2016-08-18 92 views
2

我的減速器是這樣的:Redux Reducer - 如何在不改變狀態的情況下更新對象值?

const players = (state = {}, action) => { 
    switch (action.type) { 
     case 'UPDATE_PLAYERS_CARDS': 
     return Object.assign({}, state, { 
      [action.player]: { 
      name: state[action.player].name, 
      score: state[action.player].score, 
      cards: action.cards 
      } 
     }) 
     default: 
     return state 
    } 
    } 

    export default players 

基本上,我只是想更新的球員卡,但如果我不包括姓名和分數,那麼那些獲得新的狀態刪除。

理想情況下,我需要做這樣的事情:state[action.player].cards = action.cards但其中一個規則是從不改變狀態

上面的方法可以工作,但這需要我總是知道數據結構,所以如果我將來添加其他東西,我需要記住回到這個reducer並添加回來,所以我不要失去它。

有沒有更好的方法來實現這個目標?

編輯:感謝Vijay對多個對象分配的建議。我最終得到它與這工作:

case 'UPDATE_PLAYERS_CARDS': 
    const playerObject = Object.assign(state[action.player], { cards: action.cards }); 
    return Object.assign({}, state, { 
    [action.player]: playerObject 
    }); 

這是怎麼回事?讓我知道我是否有任何改進。

+0

可能會考慮immutable.js並對react的本機進行讀取:https://facebook.github.io/react/docs/update.html – dandavis

+0

您使用的是babel嗎?你是否啓用了「stage-2」預設? – QoP

回答

1

多Object.assign可能幫助:

const newState = Object.assign({}, state); 
Object.assign(newState.action.player, { cards: action.cards }); 
+0

謝謝維傑。我編輯了我的答案,以反映出源於您的答案的新解決方案。你對那個怎麼想的? – Drew

4

Object.assign方法看起來很醜陋。

你可以這樣做:

return { ...state.action.player, cards: action.cards } 

注意:您需要stage-2通天預設使用此。

一旦數據結構更新變得相當複雜,你可以使用ImmutableJSsetInupdateIn方法做容易深更新

+1

'Object.assign'確實是一個醜陋的mf – Tuna

相關問題