Javascript OnChange表单验证
我在react中遇到了一个表单验证问题,我不知道如何解决,下面是他的: 我想检查两个输入是否相同,例如,如果两个邮件输入相等,则检查用户是否没有拼写错误,但我需要动态验证,当用户正在写入时,同时检查 这是我的代码:Javascript OnChange表单验证,javascript,reactjs,Javascript,Reactjs,我在react中遇到了一个表单验证问题,我不知道如何解决,下面是他的: 我想检查两个输入是否相同,例如,如果两个邮件输入相等,则检查用户是否没有拼写错误,但我需要动态验证,当用户正在写入时,同时检查 这是我的代码: 打开控制台并开始写入输入,您将在OnChange函数中看到,这两种状态永远不相等,因为OnChange函数的更新速度不够快,但如果我设置setTimeout,它将工作,因为状态已完成。setState操作是异步的 setState()不会立即改变this.state,但会创建 等待
打开控制台并开始写入输入,您将在OnChange函数中看到,这两种状态永远不相等,因为OnChange函数的更新速度不够快,但如果我设置setTimeout,它将工作,因为状态已完成。
setState
操作是异步的
setState()不会立即改变this.state,但会创建
等待状态转换。调用此命令后访问this.state
方法可能返回现有值。没有
保证对setState的调用和可能发生的调用的同步操作
为提高性能而进行批处理
您应该使用setState
回调函数来比较输入值:
onChangeInput(e) {
const { name, value } = e.target;
this.setState({
[name]: value
}, () => console.log(this.state.mail === this.state.confMail));
}
setState
操作是异步的
setState()不会立即改变this.state,但会创建
等待状态转换。调用此命令后访问this.state
方法可能返回现有值。没有
保证对setState的调用和可能发生的调用的同步操作
为提高性能而进行批处理
您应该使用setState
回调函数来比较输入值:
onChangeInput(e) {
const { name, value } = e.target;
this.setState({
[name]: value
}, () => console.log(this.state.mail === this.state.confMail));
}
正如伊万·米纳科夫(Ivan Minakov)在其著作中解释和证明的那样,
setState
调用不一定立即生效。也就是说,以下同步代码不一定会观察到新状态,您需要等待,直到调用作为setState
的第二个参数传递的回调(如果有)
另一种方法可能是将回调作为setState
的第一个参数传递,它允许您使用当前状态就地转换状态。这也可用于方便地设置状态开关,确定输入是否匹配,例如:
const { name, value } = e.target;
this.setState(state => {
state[name] = value;
if (state.mail !== state.confMail) {
state.error = "Mail and confirmation mail do not match.";
} else {
state.error = undefined;
}
return state;
});
正如伊万·米纳科夫(Ivan Minakov)在其著作中解释和证明的那样,
setState
调用不一定立即生效。也就是说,以下同步代码不一定会观察到新状态,您需要等待,直到调用作为setState
的第二个参数传递的回调(如果有)
另一种方法可能是将回调作为setState
的第一个参数传递,它允许您使用当前状态就地转换状态。这也可用于方便地设置状态开关,确定输入是否匹配,例如:
const { name, value } = e.target;
this.setState(state => {
state[name] = value;
if (state.mail !== state.confMail) {
state.error = "Mail and confirmation mail do not match.";
} else {
state.error = undefined;
}
return state;
});
寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。setState()是异步的,这就是为什么您在控制台中看到错误的输出。您的示例正在运行。寻求调试帮助的问题(“为什么此代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现该问题所需的最短代码。setState()是异步的,这就是为什么您在控制台中看到错误的输出。你的例子很有效。