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的一个老问题。挂起的事务可以同步执行。在某些情况下,您可以在aftersetState
中获得新状态。相反,您可以给setState一个回调参数。您是否阅读了本部分:“setState()并不总是立即更新组件。它可能会批处理更新或将更新推迟到以后”?是,但这不会停止处理程序的执行,直到状态更新,然后使用新的新值恢复。它将停止执行,直到状态更新。挂起的事务可以同步执行。在某些情况下,您可以在aftersetState
中获得新状态。相反,您可以给setState一个回调参数。您是否阅读了本部分:“setState()并不总是立即更新组件。它可能会批处理更新或将更新推迟到以后”?是,但这不会停止处理程序的执行,直到状态更新,然后使用新的新值恢复。它将停止执行,直到状态更新