2016-08-18 2 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하지만 규칙 중 하나는 이 아니기 때문에 상태가 변경되지 않습니다.

위의 방법을 사용할 수는 있지만 데이터 구조를 항상 알고 있어야하므로 나중에 다른 것을 추가하면이 감속기로 되돌아 와서 다시 기억해야합니다. 그것을 잃지 마십시오.

더 좋은 방법이 있나요?

편집 : 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 및 readup을 고려할 수 있습니다. https://facebook.github.io/react/docs/update.html – dandavis

+0

바벨을 사용하고 있습니까? 'stage-2' 프리셋이 활성화되어 있습니까? 감사합니다 비제이. – QoP

답변

1

여러 Object.assign은 도움이 될 수 있습니다 : Object.assign 방법이 예쁘게

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

. 나는 당신의 대답에서 유래 한 새로운 해결책을 반영하기 위해 나의 대답을 편집했습니다. 어떻게 생각하니? – Drew

4

여러.

당신은 할 수 있습니다 :

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

참고 :이 작업을 사용하는 사전 설정 stage-2 바벨이 필요합니다. 업데이트 할 수있는 데이터 구조가 상당히 복잡하게되면

, 당신은 깊은 업데이트 쉽게 할 ImmutableJSsetIn, updateIn 방법을 사용할 수 있습니다.

+1

'Object.assign'은 정말로 하나의 못생긴 mf입니다. – Tuna

관련 문제