2017-04-03 7 views
0

J'ai ce réducteur dans Redux:Redux réagir élément SETIN immuable modifie la liste entière

let index = state.items.findIndex(item => item.get('_id') == action.id); 
let list = state.items.setIn([index, "selected"], action.selected) 

return { 
    ...state, 
    items: list 
} 

Dans ce cas, quand je suis à la recherche sur les changements de Redux, je vois que toute la liste est modifiée, alors tout mon avis est reders au lieu de l'élément spécifique.

Qu'est-ce que je fais mal?

MISE À JOUR: j'ai changé pour updateIn, maintenant mon état montre que seul un élément est mis à jour, mais mon application tout est rendu au lieu de l'élément spécifique:

<Row style={styles.row} key={item.get('_id')} item={item} selected={item.get('selected')} 
         onSelect={this.props.onRowSelect}/> 

Répondre

0

Il semble que vous n'utilisez pas composition réducteur. Je vous encourage fortement car cela rend chaque réducteur beaucoup plus facile à comprendre: http://redux.js.org/docs/api/combineReducers.html

Sans voir comment votre composant est mappé à l'état, il est difficile de dire ce qui se passe ici, mais je crois que la racine de votre problème est que ce que vous retournez de votre réducteur sera toujours un nouvel objet.

  • L'état retourné sera un nouvel objet puisque vous avez fusionné l'ancien state avec une nouvelle liste. Les objets seront un nouvel objet dans le cadre de ce que fait immutablejs: assurez-vous que si vous changez un enfant à l'intérieur, ce changement se répercute en cascade vers tous les parents.
  • Enfin, les éléments individuels que vous avez mis à jour seront de nouveaux objets.

Je soupçonne que vous devez modifier une fonction selector ou mapStateToProps pour l'empêcher de se items qui, comme il aura toujours changé, causant ainsi toujours un rerender.