组件在动作分派和状态更新时无法重新渲染

问题描述:

当我单击某个InspectorOption组件时,我的redux记录器显示分派了一个动作,并且状态如预期更新。组件在动作分派和状态更新时无法重新渲染

My InspectorSelect和children InspectorOption组件使用react-redux的连接到mapStateToProps,这些组件依赖于来自状态的道具。

但即使状态正在更新并且组件依赖于状态,组件也不会在状态更新时重新呈现。

为什么我的组件在状态改变时不能重新渲染,我该如何纠正?

@connect((state) => { 
    return { 
     options: state.inspector.options 
    } 
}) 
export default class InspectorSelect extends Component { 
    render() { 
     return (
      <div> 
       { 
        this.props.options.map(option => { 
         return <InspectorOption 
          option={ option } 
          key={ option.id } 
         /> 
        }) 
       } 
      </div> 
     ) 
    } 
} 

https://github.com/caseysiebel/dashboard/blob/master/src/components/InspectorSelect.js#L17

+0

99.9%的时间,这是由于在还原器(或代码中的其他地方)中Redux状态的意外突变。请参阅http://redux.js.org/docs/faq/ReactRedux.html#react-not-rerendering。 – markerikson

+0

正如以前的评论所述,这可能是由国家变异引起的。如果你会发布你的减速器有人能够发现错误 –

由于@markerikson指出:时间99.9%,这是由于在一个减速

有一个在dashboard/src/reducers/inspector.js

export default function reducer(state = { 
    options: [] 
}, action) { 

    switch (action.type){ 
     case 'SET_INSPECTOR': 
      state.options = state.options.map(option => { // <-- mutation here 
       return option.id === action.payload ? 
        { ...option, active: true } : 
        { ...option, active: false } 
      }) 
      return state // returning mutated state 
     default: 
      return state 
    } 
} 
突变终极版状态的偶然突变

应该是

export default function reducer(state = { 
    options: [] 
}, action) { 

    switch (action.type){ 
     case 'SET_INSPECTOR': 
      var newOptions = state.options.map(option => { 
       return option.id === action.payload ? 
        { ...option, active: true } : 
        { ...option, active: false } 
      }); 
      return {...state, options: newOptions} // returning new state 
     default: 
      return state 
    } 
} 
+1

好眼! :)是的,这将是'国家'的变种。 – markerikson

+0

谢谢!那样做了。 – Casey