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 Native 和 Redux:为啥子组件不会在每次状态更新时重新渲染?