【问题标题】:Redux ComponentDidMount not firingRedux ComponentDidMount 未触发
【发布时间】:2025-12-25 22:40:16
【问题描述】:

我无法让组件在操作后重新渲染。我知道我必须在减速器中返回一个新对象,所以我返回一个全新的状态,但它仍然没有触发 componentDidMount()render()

我的组件:

class AppTemplate extends React.Component {

    constructor(props) {
        super(props);

        if(!this.props.settings.user){
            this.props.dispatch(userActions.get());
        }
    }

    componentDidUpdate(prevProps, prevState) {

        console.log(prevProps, this.props);

        //do some stuff

    }


    render() {

        return (
            <SomeComponent/>
        );
    }
}

function mapStateToProps(state) {
    const { registration, role, settings } = state;
    console.log(role);
    return {
        registration,
        role,
        settings
    };
}

const connectedAppTemplate = connect(mapStateToProps)(AppTemplate);
export { connectedAppTemplate as AppTemplate }; 

我的减速机:

export function role(state = { role : null, loading: true }, action) {

  switch (action.type) {
    case 'USER_GET_PENDING':
      return {
        role:null,
        loading: true
      }
    case 'USER_GET_FULFILLED':
      const role = action.payload.data.roles[0];
      const newState = {
        role: role,
        loading: false
      }
      console.log(state, newState);
      console.log(state == newState);
      return newState;
    default:
      return state
  }

}

该操作正在顺利完成,甚至 mapToState 也在使用新角色进行记录,但 componentDidMount 从未触发。有什么想法吗?

谢谢!

【问题讨论】:

  • componentDidMount在哪里?
  • 如果对您有帮助,请务必将给定答案标记为已接受...

标签: reactjs redux


【解决方案1】:

componentDidMount 仅调用一次。这是组件第一次完成加载的时间。如果您正在更新 redux 存储,那么您将收到对 componentWillReceiveProps 的调用,如果您在那里触发渲染,您将看到 componentDidUpdate 将触发。

编辑:虽然当通过 redux 接收到新的 props 时组件将再次渲染...componentDidMount 仍然只会被调用一次。你最好使用componentWillReceivePropscomponentDidUpdate 来完成你想要完成的事情。

感谢下面 cmets 中的 Dan O(押韵)指出了我的错误。

【讨论】:

  • 组件在获得新道具时会自动重新渲染,除非您编写了 shouldComponentUpdate 函数,否则会做出其他决定。
  • @DanO 你是对的,我应该修改我的答案。我尝试编写纯组件,所以在我的情况下,我通常是对的。
  • @DanO 完成了编辑并感谢您指出了这一点。谢谢。