【问题标题】:Components Not Re-Rendering when Action is Dispatched and State Updates分派操作和状态更新时组件未重新呈现
【发布时间】:2017-06-21 18:19:27
【问题描述】:

当我单击其中一个 InspectorOption 组件时,我的 redux 记录器显示一个操作已分派并且状态按预期更新。

我的 InspectorSelect 和子 InspectorOption 组件使用 react-redux 连接到 mapStateToProps,这些组件依赖于来自 state 的那些 props。

但是即使状态正在更新并且组件依赖于状态,当状态更新时组件也不会重新渲染。

为什么当状态改变时我的组件没有重新渲染,我该如何纠正这个问题?

@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

【问题讨论】:

标签: javascript reactjs redux react-redux web-component


【解决方案1】:

正如@markerikson 所指出的:99.9% 的时间,这是由于 reducer 中 Redux 状态的意外突变

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

【讨论】:

  • 好眼光! :) 是的,那将是 state 的突变。
猜你喜欢
  • 1970-01-01
  • 2021-12-21
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 2021-07-10
  • 2020-11-09
  • 1970-01-01
相关资源
最近更新 更多