reactjs - 反应钩子值未在异步函数中更新
问题描述
我正在尝试使用以下代码验证我的使用钩子的字段:
const validate = async () => {
if (!new ValidateFields().checkIfValidSnn(snn.value))
setSnn({ ...snn, error: "Invalid snn" })
if (!new ValidateFields().checkIfValidPhone(phone.value))
setPhone({ ...phone, error: "Invalid phone number" })
if (!new ValidateFields().checkIfValidEmail(email.value))
setEmail({ ...email, error: "Invalid Email" })
if (country.value.length <= 0)
setCountry({ ...country, error: "Please select a country" })
return [snn, phone, email, country].every(x => x.error == "" && x.value != "")
}
const submit = () => {
validate()
.then(success => {
if (success)
console.log("SUCCESS!")
else
console.log("Failed")
})
}
但问题是,在 validate ruturns 一个值时,所有更改都没有改变。如何在不再次运行该功能的情况下获得正确的值?
解决方案
setState
调用异步,因此您无法确定当前值。您可以将验证状态存储在局部变量中。async
如果一个函数不使用,你也不需要标记它await
。
const validate = () => {
let isValid = true;
if (!new ValidateFields().checkIfValidSnn(snn.value)) {
setSnn({ ...snn, error: 'Invalid snn' });
isValid = false;
}
if (!new ValidateFields().checkIfValidPhone(phone.value)) {
setPhone({ ...phone, error: 'Invalid phone number' });
isValid = false;
}
if (!new ValidateFields().checkIfValidEmail(email.value)) {
setEmail({ ...email, error: 'Invalid Email' });
isValid = false;
}
if (country.value.length <= 0) {
setCountry({ ...country, error: 'Please select a country' });
isValid = false;
}
return isValid;
};
const submit = () => {
if (validate()) {
console.log("SUCCESS!")
} else {
console.log("Failed")
}
}
推荐阅读
- javascript - 将两个检查 url 的正则表达式合二为一
- javascript - 如何在不使选择在视觉上更大的情况下使选择覆盖 div?
- wordpress - Wordpress:返回 ID 而不是对象
- c# - 如何在 Unity 中设置 OVR 边界的守护网格墙?
- puppeteer - 在循环内的 puppeteer 中创建新选项卡导致导航超时
- html - 媒体 CSS 标签上的错误 | 预期规则或选择器
- jenkins - 管道脚本中具有默认主题和正文的 Jenkins emailext 插件
- prometheus-alertmanager - 同时使多个 AlertManager 上的警报静音
- html - 如何构建具有完整样式的 VisualStudio Code 项目
- javascript - Glide JS不显示图像