React表单同时触发HTML原生验证和自定义提示怎么办?
最近在做注册表单时遇到个奇怪问题,我用了HTML5的required和pattern属性做基础验证,同时又在React里写了自定义错误提示。结果当用户输入不符合正则时,浏览器默认的红色边框和弹窗跟我的提示框同时弹出来,体验好差。
比如这个邮箱输入框的代码:
function RegisterForm() {
const [emailError, setEmailError] = useState('');
const handleSubmit = (e) => {
e.preventDefault();
const form = e.target;
if (form.checkValidity() === false) {
setEmailError('邮箱格式不对哦');
return;
}
// 提交逻辑
};
return (
{emailError && {emailError}
}
);
}
我设置了noValidate想先自己处理,但点击提交时浏览器还是先弹出默认提示,而且我的自定义错误没及时显示。试过用setTimeout延时设置状态,感觉不太对劲,有没有更好的解决办法?
1. 保留
noValidate属性,阻止浏览器默认提示。2. 在React里手动触发表单元素的
reportValidity()方法,这样可以显示HTML5的样式(比如红色边框),但不会弹出讨厌的默认提示框。代码改一下就OK了:
重点是
reportValidity()这一步,它能让你既保留HTML5的样式提示,又能让React的自定义提示正常工作。记得在验证通过后清空错误状态,不然用户会一直看到提示信息。这种方法我用过几次,效果不错,推荐试试。