2017-09-23 14 views
0

Je suis nouveau à réagir/redux et j'essaie de stocker un de mes objets dans l'état redux comme une carte/hachage avec les clés étant les clés primaires des objets de la base de données et les valeurs étant l'objet lui-même. Cependant, l'état semble être surévalué chaque fois que je mets à jour et la nouvelle valeur que j'ajoute est la seule qui reste. Voici mon code:réagir/redux imbriqué état problème

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; 
    } 
} 

Je voudrais juste passer dans mon objet:

{id: 1, thing: "blue"} 

et ont l'état mis à jour avec elle. Ensuite, si je passe:

{id: 2, thing: "red"} 

Je voudrais que mon état Redux pour refléter:

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

est-il un moyen facile pour moi de faire cela? Est-ce que redux sera rendu si je mets à jour une valeur imbriquée? Par exemple si je passe:

{id: 2, thing: "purple"} 

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

Je voudrais voir un comportement comme celui-ci. Ive regardé dans JS Immutable Je me demande simplement si je peux faire ce simple cas d'utilisation sans elle?

Toute aide est appréciée! Merci!

Répondre

2

Lorsque vous

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

vous surchargez state.currentScanResult. Si vous souhaitez le mettre à jour, vous devez faire quelque chose comme

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

Merci! Savez-vous si l'état mettra à jour correctement avec l'emboîtement redux comme ça? des inconvénients? – BC00

+0

Il n'y a pas de problème. Plus les données sont imbriquées, plus il devient fastidieux de mettre à jour les structures internes. Voir ces documents pour plus de détails: http://redux.js.org/docs/recipes/reducers/ImmutableUpdatePatterns.html – JulienD

+0

est cet état de mutation, pour une raison quelconque, mon composant n'est pas re-rendu lorsque les valeurs imbriquées sont mises à jour. – BC00