ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript-React钩子setState不会立即更新

2019-12-10 21:33:58  阅读:177  来源: 互联网

标签:reactjs javascript


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

  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);

标签:reactjs,javascript
来源: https://codeday.me/bug/20191210/2104357.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有