我正在使用输入组件中的useImperativeHandle将ref的数据传递到登录组件,但当emailInputRef的数据与inputRef的数据相比延迟时,我遇到了问题
const Login = () => {
const router = useRouter();
const [isvalid, setIsValid] = useState(true);
const emailInputRef = useRef();
const passwordInputRef = useRef();
const email = emailInputRef.current?.value;
const password = passwordInputRef.current?.value;
console.log("data in login: ", email, password);
const submitHandler = async (event) => {
event.preventDefault();
setIsValid((prevState) => !prevState);
// return router.push("/dashboard");
};
return (
<div className={styles.login}>
<div className={styles.card}>
<p className={styles["signin-label"]}>Log In</p>
<form onSubmit={submitHandler} className={styles["signin-form"]}>
<Input
ref={emailInputRef}
name="email"
type="email"
placeholder="Email"
/>
<p className={styles["none-display"]}>Please enter a valid email.</p>
<Input
ref={passwordInputRef}
name="password"
type="password"
placeholder="Password"
/>
<p className={isvalid ? styles["none-display"] : ""}>
Incorrect Email or Password.
</p>
<Button>Log In</Button>
</form>
<div className={styles["sign-up"]}>
<p>Need an account?</p>
<Link href="/signup">Sign up now.</Link>
</div>
</div>
</div>
);
};
个字符
here is the data output
我不知道是什么问题。我不想使用useState,因为我不想我的组件在输入改变时重新呈现。请帮助。
1条答案
按热度按时间pkln4tw61#
您的
email
和password
值在submitHandler
中是未定义的,这是因为您的Login
组件从初始渲染开始就不会重新渲染,直到您使用setIsValid
更改其状态。在每个XML上重新呈现
Login
组件并没有什么真正的问题,而且您不会看到任何明显的性能损失,除非您正在处理非常大的表单。此外,在命令式处理程序的实现中,您捕获的是
useImperativeHandle
运行时的输入值,它不会反映当前值。以下是我可以为您推荐的两种实施方案:
1)控制输入
在本例中,
Login
组件会在每一个XML上重新呈现,但额外的好处是您可以在用户输入时执行验证。个字符
2)不受控输入
在这种情况下,
Login
组件不会在每个表单上重新呈现,并且您只能在提交表单时验证用户输入。的字符串
但是,如果您确实需要使用
useImperativeHandle
,因为您最初的问题中没有列出的其他原因,您可以按照以下方式实现沿着:型