直接更新状态变化(反应)

Direct update on state change (React)

所以我目前面临一个常见问题,我的 class 组件中的状态值不会立即更改,而是仅在 rendering/refreshing 页面之后更改。我有一个名为 'auth' 的状态,我想在单击 'logout' 时将值设为 false。当用户按下按钮 'logout' 时,我想立即将身份验证状态设置为 'false',然后将他们重定向到登录页面。但我的问题是,如果没有 refresh/rerendering 发生, 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);

我在这里为您创建了一个沙盒小演示:https://codesandbox.io/s/a-simple-react-router-v4-tutorial-forked-uznym

您的 handleLogOut 函数会将 auth 读取为 false,直到 React 重新呈现该组件。除非可能发生任何错误,否则您可以在渲染方法中记录状态并查看它在那里读取的内容。

  handleLogOut = () => {
    console.log(this.state.auth);
    localStorage.clear();
    sessionStorage.clear();
    this.setState({ auth: false }); //Here it stays 'true' up until refresh ?
    // this.props.history.push("/");
    console.log(this.state.auth);
  };

  render() {
    console.log(this.state.auth);
    ...
  }
this.setState(
  { auth: false },
  () => this.props.history.push("/")
);

在您的具体情况下,使用 componentDidUpdate

你可以这样使用它

componentDidUpdate(prevProps, prevState) {
  console.log(this.state) // Logs new state.
}

但是,我建议您转向功能组件,因为 componentDidUpdate 和类似的基于 class 的组件被认为是遗留的。

Resource