Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript OnChange表单验证_Javascript_Reactjs - Fatal编程技术网

Javascript OnChange表单验证

Javascript OnChange表单验证,javascript,reactjs,Javascript,Reactjs,我在react中遇到了一个表单验证问题,我不知道如何解决,下面是他的: 我想检查两个输入是否相同,例如,如果两个邮件输入相等,则检查用户是否没有拼写错误,但我需要动态验证,当用户正在写入时,同时检查 这是我的代码: 打开控制台并开始写入输入,您将在OnChange函数中看到,这两种状态永远不相等,因为OnChange函数的更新速度不够快,但如果我设置setTimeout,它将工作,因为状态已完成。setState操作是异步的 setState()不会立即改变this.state,但会创建 等待

我在react中遇到了一个表单验证问题,我不知道如何解决,下面是他的:

我想检查两个输入是否相同,例如,如果两个邮件输入相等,则检查用户是否没有拼写错误,但我需要动态验证,当用户正在写入时,同时检查

这是我的代码:


打开控制台并开始写入输入,您将在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()是异步的,这就是为什么您在控制台中看到错误的输出。你的例子很有效。