繁体   English   中英

React hooks setState 不会立即更新

[英]React hooks setState not updating immediately

当我点击提交按钮时,我试图验证字段。 这就是我定义我的状态的方式。

  const [values, setValues] = useState({
    email: "",
    password: "",
    emailErrorMessage: "",
    passwordErrorMessage: "",
    errorMessage: "",
    emailError: false,
    passwordError: false,
    rememberMe: false,
  });

在提交方法中,这就是我验证它的方式。

if (values.email.length <= 0) {

  setValues({
    ...values,
    emailError: true,
    emailErrorMessage: "Email field must not be empty"
  })
};

if (values.password.length <= 0) {
  setValues({ ...values, passwordError: true, passwordErrorMessage: "Password field must not be empty" });
}

不知何故,它只向我显示密码字段的错误。 虽然它正在经历两个 if 条件。 不知道我到底能不能修复它。

预期:- 它应该显示电子邮件和密码的错误。

问题 1:状态更新是一个异步过程,因此,在您的情况下,您是通过传播当前状态来第一次更新状态,然后通过传播当前状态来第二次更新状态(尚未更新)。 因此,最后一个成功更新的状态(实际上是一场赌博,第二次更新运气更好)将是实际的 nextState,这就是为什么您会遇到密码仅被更新的原因

问题 2:每次状态更新都会触发重新渲染。 你更新了两次状态(即使它做错了,但这是事实),而你只能做一次(只需要重新渲染一次)。

解决这两个问题的解决方案是:

const newValues = {...values};
if (values.email.length <= 0) {
  newValues.emailError = true;
  newValues.emailErrorMessage = "Email field must not be empty";
};

if (values.password.length <= 0) {
  newValues.passwordError = true;
  newValues.passwordErrorMessage = "Password field must not be empty";
}
setValues(newValues);

@RaduNemerenco 有一个很好的答案,但您可以添加另一个 if 语句来检查这两个条件

if (values.email.length <= 0) {

  setValues({
    ...values,
    emailError: true,
    emailErrorMessage: "Email field must not be empty"
  })
};

if (values.password.length <= 0) {
  setValues({ ...values, passwordError: true, passwordErrorMessage: "Password field must not be empty" });
}

if (values.email.length <= 0 && values.password.length <= 0) {

  setValues({
    ...values,
    emailError: true,
    emailErrorMessage: "Email field must not be empty",
    passwordError: true,
    passwordErrorMessage: "Password field must not be empty"
  })
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM