【发布时间】:2021-10-03 07:07:28
【问题描述】:
我有一个检查密码长度的 checkPassword 函数,该函数在输入密码时触发“onChange”。
这里是函数:
const checkPassword = () => {
if (user_password.length >= 10)
setPasswordFlag({ ...passwordFlag, length: true });
else setPasswordFlag({ ...passwordFlag, length: false });
};
这是我输入的密码:
<input type="password" className="input_container" placeholder="Mot de passe" id="password" name="password" onChange={(e) => {
setUserSignup({
...userSignup,
user_password: e.target.value,
});
checkPassword();
}}
value={userSignup.user_password} ref={refSignupPassword} />
问题是每次都会考虑之前的状态。基本上我的状态 passwordFlag.length 在第 11 个字符而不是第 10 个字符处变为 true。
我尝试使用 prevState,但它并没有改变任何东西。
然后,我尝试像这样使用 useEffect :
const checkPassword = () => {
useEffect(() => {
if (user_password.length >= 10)
setPasswordFlag({ ...passwordFlag, length: true });
else setPasswordFlag({ ...passwordFlag, length: false });
}, []);
};
但是我现在有这个错误:React Hook “useEffect”在函数“checkPassword”中被调用,它既不是 React 函数组件也不是自定义 React Hook 函数。 React 组件名称必须以大写字母开头。 我试图用大写重命名我的函数,但同样的问题。
但是,如果我将 checkPassword 函数放在 onBlur={checkPassword} 中,那么它可以工作。但我需要在“onChange”而不是“onBlur”中修复它
谁能告诉我我需要做什么来确保考虑到正确的状态?
谢谢!
【问题讨论】:
-
我认为这里的部分问题是竞争条件。 React 中的状态更新是异步/批处理的,你不能设置状态然后立即检查它并期望一致的行为。
标签: reactjs