React setState() не обновляется

#reactjs

Вопрос:

Мой загрузчик не работает, когда я нажимаю на кнопку входа в систему, я хочу, чтобы загрузчик был виден. это мой код, и когда я нажимаю на кнопку, состояние по-прежнему ложное, оно не обновляет состояние. пожалуйста, ознакомьтесь с кодом и порекомендуйте мне, как это реализовать.

**Конструктор компонентов класса React **

 constructor(props)
  {
    super(props);
    this.state = {
      loaderVisible: false
    }
  }
 

Функция Входа в систему

  login = () =>
  {
    this.setState({ loaderVisible: true });
    
    let userID = this.state.email;
    let pass = this.state.pass;
    if (userID.length > 0)
    {
      this.setState({ inputIDError: '' });
      this.setState({ inputIDTextError: '' });
      if (pass.length > 0)
      {
        this.setState({ inputPassError: '' });
        this.setState({ inputPassTextError: '' });

        let data = { userID: userID, pass: pass};
        axios.post(URLs.loginURL, data)
          .then(res =>
          {
            if (res.data === "Account Expired")
            {
              this.setState({ errorMsg: 'اکونت شما موقتآ مسدود گردیده' });
            }
            else if (res.data === "wrongCredentials")
            {
              this.setState({ errorMsg: 'Wronge Email or Password, Please try again' });
            }
            else
            {
              // var ndata = res.data[0];
              // this.setState({Role:ndata[0].Role});
              // ndata.map((d) => localStorage.setItem("userInfo", JSON.stringify(d)))
              // if (this.state.Role === "teacher")
              // {
              //   this.props.history.push("/teacher/index");
              // }
              // else if (this.state.Role === "admin")
              // {
              //   this.props.history.push("/admin/index");
              // }
              // else
              // {
              //   this.props.history.push("/student/index");
              // }
            }
          });
      }
      else
      {
        this.setState({ inputPassError: 'bg-gradient-danger text-white' });
        this.setState({ inputPassTextError: 'bg-danger text-white' });
      }
    }
    else
    {
      this.setState({ inputIDError: 'bg-gradient-danger text-white'});
      this.setState({ inputIDTextError: 'bg-danger text-white'});
    }
    setTimeout(this.setState({ loaderVisible: false }),30000);
}
 

Ответ №1:

То , что вы видите здесь, — это то, что обновление состояния loaderVisible до true будет загружено вместе с обновлением до false , и оно будет принимать только последнее значение. Таким образом, кажется, что он не обновляется, но на самом деле он обновляется — просто не до того значения, которое вы хотите.

setTimeout(this.setState({ loaderVisible: false }),30000); это не то, что ты думаешь.

Вы вызываете setState функцию немедленно, не дожидаясь тайм-аута. Вам нужно передать setTimeout функцию:

 setTimeout(() => this.setState({ loaderVisible: false }),30000);
 

Главный вывод для вашей ситуации-это:

 this.setState(); // <-- Function call
() => this.setState(); // <-- Function reference (new anonymous function)