Redux状态更改后,简单的React组件不会更新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redux状态更改后,简单的React组件不会更新相关的知识,希望对你有一定的参考价值。

我将以下React组件连接到Redux存储,即使存储状态发生更改(我已选中),组件prop userIsLogged也不会更改其值。任何帮助表示赞赏!

const mapDispatchToProps = (dispatch) => bindActionCreators({deauthenticateUser}, dispatch);

const mapStateToProps = (state) => ({ userIsLogged: state.auth.loggedUser !== null });

const Logout = (props) => {

  const { userIsLogged } = props;

  return (
    userIsLogged?
    <Button 
      variant="outlined" 
      color="primary" 
      onClick={(e) => {
        props.deauthenticateUser();
        history.push('/login');
      }}>
      Exit
     </Button>
     :<div />
  );

}

Logout.propTypes = {
  userIsLogged: PropTypes.bool.isRequired
};

export default connect(mapStateToProps, mapDispatchToProps)(Logout);

减速机如下:

const initialState = {
  jwt: null,
  loggedUser: null,
  isLoading: false
}

export default function auth(state = initialState, action) {
  switch (action.type) {
    case 'GOT_JWT':
      return Object.assign(state, { jwt: action.jwt });
    case 'USER_LOGGING_IN':
      return Object.assign(initialState, { isLoading: action.isLoading });
    case 'USER_LOGGED_IN':
      return Object.assign(state, { loggedUser: action.loggedUser, isLoading: false });
    case 'NO_JWT':
      return initialState;
    case 'USER_LOGGED_OUT':
      return initialState;
    default:
      return state;
  }
}
答案

在你的reducer代码中,你正在改变传递的状态对象。

接下来发生的事情是react将状态视为未更改(它是同一个对象),因此它不会重新呈现它。

修复它改变了

Object.assign(state, { jwt: action.jwt });

Object.assign({}, state, { jwt: action.jwt });

它将从原始状态+新状态创建新对象并复制属性。

以上是关于Redux状态更改后,简单的React组件不会更新的主要内容,如果未能解决你的问题,请参考以下文章

React Redux Store 更新,但组件不重新渲染

React Native 和 Redux:为啥子组件不会在每次状态更新时重新渲染?

在 redux 状态更改后,React 导航不会更改导航屏幕

组件不会重新渲染,但 redux 状态已通过反应钩子更改

React 功能组件在状态更改后不更新

将新的商店状态放入道具后,反应不会重新渲染