Reactjs setState每秒钟工作一次

Reactjs setState每秒钟工作一次,reactjs,Reactjs,我有一个简单的表单,用于设置passwordInvalid的状态 国家最初是: this.state={email:'',密码无效:false} 而且电子邮件部分很好,在我提交表格时会更新 更改密码无效的函数是: passwordValidator = (email) => { this.setState(() => { if (email === 'test') { this.setState({ passwordInvalid: true })

我有一个简单的表单,用于设置
passwordInvalid
的状态

国家最初是:

this.state={email:'',密码无效:false}

而且
电子邮件
部分很好,在我提交表格时会更新

更改密码无效的函数是:

passwordValidator = (email) => {
    this.setState(() => {
      if (email === 'test') {
        this.setState({ passwordInvalid: true });
      }
      else {
        this.setState({ passwordInvalid: false });
      }
    })
  }
这就是所谓的:

  mySubmitHandler = (event) => {
    this.passwordValidator(this.state.email);
    if (this.state.passwordInvalid) {
      event.preventDefault();
      alert("Email: '" + this.state.email + "' is invalid.");
    }
    else {
      event.preventDefault();
      alert("Email address submitted: " + this.state.email);
    }
  }
我已经阅读了一些文档:

setState()
不会立即改变此.state,但会创建一个 等待状态转换。调用此函数后访问此.state
方法可能返回现有值。没有 保证对
setState
的调用和调用的同步操作 为提高性能而进行批处理

我已经尝试了很多设置状态的方法,但是我似乎不能让它随着每次调用而更新;它只在第二次通话时起作用


你不应该在setState中使用setState,我认为你应该这样做:

passwordValidator = email => {
  if (email === "test") {
    this.setState({ passwordInvalid: true });
  } else {
    this.setState({ passwordInvalid: false });
  }
};

你不应该在setState中使用setState,我认为你应该这样做:

passwordValidator = email => {
  if (email === "test") {
    this.setState({ passwordInvalid: true });
  } else {
    this.setState({ passwordInvalid: false });
  }
};
正如你所指出的:

setState()不会立即改变this.state,但会创建挂起的状态转换

这意味着您的set state调用将异步执行

因此,在这一行中,无论您做什么,都将始终获得旧状态
passwordInvalid

this.passwordValidator(this.state.email);
if (this.state.passwordInvalid) {
或者,您可以使
密码验证器
返回布尔值, 然后在使用它之后将其设置为状态。例如:

mySubmitHandler = (event) => {
  event.preventDefault();
  const isPasswordValid = this.passwordValidator(); // will get state value automatically then calculate if its valid
  this.setState({ passwordInvalid: isPasswordValid });
  if (isPasswordValid ) {
    alert("Email: '" + this.state.email + "' is invalid.");
  }
  else {
    alert("Email address submitted: " + this.state.email);
  }
}
正如你所指出的:

setState()不会立即改变this.state,但会创建挂起的状态转换

这意味着您的set state调用将异步执行

因此,在这一行中,无论您做什么,都将始终获得旧状态
passwordInvalid

this.passwordValidator(this.state.email);
if (this.state.passwordInvalid) {
或者,您可以使
密码验证器
返回布尔值, 然后在使用它之后将其设置为状态。例如:

mySubmitHandler = (event) => {
  event.preventDefault();
  const isPasswordValid = this.passwordValidator(); // will get state value automatically then calculate if its valid
  this.setState({ passwordInvalid: isPasswordValid });
  if (isPasswordValid ) {
    alert("Email: '" + this.state.email + "' is invalid.");
  }
  else {
    alert("Email address submitted: " + this.state.email);
  }
}

您可以在
setState
中使用
setState
,但这没有多大意义。问题的症结在其他地方。@marzelin是的,这是因为setstate是异步的,他永远不会在下一行中获得新的状态值。否,
setstate
有时是异步的。将代码包装在
setTimeout
中,它奇迹般地工作了这是github的一个老问题。您可以在
setState
中使用
setState
,但这没有多大意义。问题的症结在其他地方。@marzelin是的,这是因为setstate是异步的,他永远不会在下一行中获得新的状态值。否,
setstate
有时是异步的。将代码包装在
setTimeout
中,它奇迹般地工作了这是github的一个老问题。挂起的事务可以同步执行。在某些情况下,您可以在after
setState
中获得新状态。相反,您可以给setState一个回调参数。您是否阅读了本部分:“setState()并不总是立即更新组件。它可能会批处理更新或将更新推迟到以后”?是,但这不会停止处理程序的执行,直到状态更新,然后使用新的新值恢复。它将停止执行,直到状态更新。挂起的事务可以同步执行。在某些情况下,您可以在after
setState
中获得新状态。相反,您可以给setState一个回调参数。您是否阅读了本部分:“setState()并不总是立即更新组件。它可能会批处理更新或将更新推迟到以后”?是,但这不会停止处理程序的执行,直到状态更新,然后使用新的新值恢复。它将停止执行,直到状态更新