【发布时间】:2021-11-18 22:16:15
【问题描述】:
因此,我目前面临一个常见问题,即我的类组件中的状态值不会立即更改,而只会在渲染/刷新页面后更改。我有一个名为“auth”的状态,我想在单击“注销”时将其属性为 false。当用户按下“注销”按钮时,我想立即将身份验证状态设置为“假”,然后将它们重定向到登录页面。但我的问题是 this.state.auth 如果没有发生刷新/重新渲染,它仍然是正确的。请记住,它必须在如下所示的 Class 组件中工作。
import React, { Component, useEffect, useState} from 'react';
import { AuthContext } from '../Context/AuthContext';
class Home extends Component {
state = {
auth: true
}
handleLogOut = () => {
localStorage.clear();
sessionStorage.clear();
this.setState({auth: false}); //Here it stays 'true' up until refresh ?
this.props.history.push('/');
}
render() {
return (
<AuthContext.Provider value={this.state.auth}>
<div>
<button onClick = {this.handleLogOut}>Log out</button>
</div>
</AuthContext.Provider>
);
}
};
export default withRouter(Home);
【问题讨论】:
-
状态更改是异步的。你不能也不应该改变这一点。真正的根本问题是.. 为什么您需要立即进行这种更改?您是否遇到了异步性质的问题?解释那个问题而不是对抗反应。
-
@JokesOnYou 我猜你想要
useEffect钩子,或者等效的类生命周期componentDidUpdate。虽然不清楚你想要什么。AuthContext不应该包裹HomePage而不是相反吗? -
@Evert,是的,我遇到了与状态更改的异步性质有关的问题。我需要将其设置为“假”,否则我的登录屏幕将拒绝渲染,因为上下文应该是 auth: false 才会发生。当立即更改该值以允许其他组件与我的 Context 值相应地工作时,感觉要顺畅得多。
-
@JokesOnYou 这是因为您重定向到
/吗?您可能希望在 setState 上使用回调参数。这将在 值更改后调用。 -
@Urmzd,在我的情况下,它与上下文包装无关。是的,你可以说我想使用 compondentDidUpdate。但这是否意味着我仍然必须“刷新”页面才能正常工作?
标签: javascript reactjs use-state web-frontend