2016-08-18 91 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

相关问题