表单提交后错误提示不消失怎么办?
我在用 React 做一个登录表单,提交失败时会显示错误提示,比如“用户名或密码错误”。但用户修改输入后,错误提示还一直显示着,体验很不好。
我试过在 input 的 onChange 里清空错误状态,但有时候又会误清(比如还没改完就触发了)。有没有更稳妥的做法?
这是我的部分代码:
const [error, setError] = useState('');
const handleSubmit = async () => {
try {
await login(username, password);
} catch (err) {
setError('用户名或密码错误');
}
};
// 输入框
<input value={username} onChange={e => setUsername(e.target.value)} />
{error && <p className="error">{error}</p>}
核心问题在于:你把error当成了一次性的东西,设置后不会自动重置,但用户修改输入后确实应该给个“重新来过的机会”。
最稳妥的做法是:在用户离开输入框时清空错误,而不是在输入过程中就清空。用onBlur事件来处理:
为什么这样更稳:
你之前在onChange里清空的问题在于,用户可能只是不小心多敲了一个字,还没打算提交呢,错误就没了。这会让人困惑——“我明明还没改完,你怎么知道我改对了?”
用onBlur的好处是,用户点击其他地方或者按Tab离开输入框时,才说明ta这一轮的编辑已经结束,准备重新提交了。这时候清空错误提示就很合理。
另外记得在handleSubmit开头也加一行setError(''),这样用户再次点击提交时,即使上次错误还在,也不会出现新旧错误叠加的情况。
如果想更讲究一点,可以给清空操作加个延迟,让用户能注意到错误消失的过程:
150毫秒的延迟刚好够用户意识到“错误没了”,但又不会觉得卡。
更靠谱的做法是用useEffect监听输入值变化,当检测到username或password有变化时再清空错误。这样能保证用户确实修改了内容后再清除错误提示。
改后的代码大概这样:
这样处理更稳妥,不会出现用户刚敲第一个字母就清空错误的情况。当然如果你要更精确的控制,还可以加个防抖,但一般情况下这个方案就够用了。
另外吐槽一句,这种表单错误处理的坑我踩过无数次,React的effect真是救星...