【发布时间】:2017-07-19 22:41:47
【问题描述】:
我正在以编程方式验证电子邮件和密码输入以进行简单登录,这里是调用其他验证电子邮件的函数的函数。
handleLogin(event) {
this.validateEmail();
this.validatePassword();
if (this.state.emailValid === 'error' || this.state.passwordValid === 'error') {
alert('invalid form');
return;
};
const email = ReactDOM.findDOMNode(this.refs.email).value;
const password = ReactDOM.findDOMNode(this.refs.password).value;
const creds = { email: email, password: password }
this.props.onLoginClick(creds)
}
请注意,首先我调用的是 validateEmail() 函数,该函数会修改指示输入是否正确的存储,这是 validateEmail() 源代码:
validateEmail() {
const email = ReactDOM.findDOMNode(this.refs.email).value;
let validEmail = /^.+([.%+-_]\w+)*@\w+([.-]\w+)*\.\w+([-.]\w+)*$/.test(email);
if (!validEmail) {
this.setState({
emailValid: 'error'
});
return;
}
this.setState({
emailValid: 'success'
});
}
但是if语句中state.emailValid还没有更新,这是状态修改的延迟,所以alert()没有显示。如何正确获取更新状态?
谢谢
【问题讨论】:
-
setState 是异步的。即使您的验证功能处于顶部设置状态,也不会在其他所有操作之后发生
-
从 react 文档中查看有关状态和单一事实来源、受控组件的此页面:facebook.github.io/react/docs/forms.html