React-Hook-Form:输入为空时如何不显示错误
React-Hook-Form: How to show no error when input is blank
一旦组件被触摸,然后用户清除输入,默认行为是错误继续显示。如何做到在触摸输入后清除输入时错误消失?
下面的代码摘自文档
import React from "react";
import { useForm } from "react-hook-form";
export default function App() {
const { register, formState: { errors }, handleSubmit } = useForm();
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register("firstName", { required: true })} />
{errors.firstName?.type === 'required' && "First name is required"}
<input {...register("lastName", { required: true })} />
{errors.lastName && "Last name is required"}
<input type="submit" />
</form>
);
}
您的验证规则检查字段是否为必填字段,因此如果您希望在字段为空时不出现错误,这意味着您只是不想在那个时候显示验证结果。
您可以选择何时执行验证并显示错误并给出 2 个选项 useForm()
:
mode
:这定义了第一次执行验证的时间。默认情况下,它是在单击提交按钮时而不是之前执行的。
reValidateMode
:这定义了第一次执行验证的时间。 默认情况下,它在更改时执行。这意味着在第一次验证后,每次输入一个字符时,错误都会出现或消失,具体取决于每个字段的有效状态。
因此,您可以通过提供选项 {reValidateMode: "onSubmit"}
来决定始终在提交时进行验证,并使用 clearErrors
在更改时重置错误。
function App() {
const {
register,
formState: { errors },
handleSubmit,
clearErrors
} = useForm({ reValidateMode: "onSubmit" });
const onSubmit = () => null;
const firstName = register("firstName", { required: true });
const lastName = register("lastName", { required: true });
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input
{...firstName}
onChange={(e) => {
firstName.onChange(e);
clearErrors("firstName");
}}
/>
{errors.firstName?.type === "required" && "First name is required"}
<input
{...lastName}
onChange={(e) => {
lastName.onChange(e);
clearErrors("lastName");
}}
/>
{errors.lastName && "Last name is required"}
<input type="submit" />
</form>
);
}
Here is a codesandbox for that.
您也可以通过在调用 clearErrors
之前检查字段的值来仅在字段为空时(而不是在每次字符更改时)重置错误,但我认为这不是很直观只有当字段实际格式不正确时,用户才能看到错误消失。
一旦组件被触摸,然后用户清除输入,默认行为是错误继续显示。如何做到在触摸输入后清除输入时错误消失?
下面的代码摘自文档
import React from "react";
import { useForm } from "react-hook-form";
export default function App() {
const { register, formState: { errors }, handleSubmit } = useForm();
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register("firstName", { required: true })} />
{errors.firstName?.type === 'required' && "First name is required"}
<input {...register("lastName", { required: true })} />
{errors.lastName && "Last name is required"}
<input type="submit" />
</form>
);
}
您的验证规则检查字段是否为必填字段,因此如果您希望在字段为空时不出现错误,这意味着您只是不想在那个时候显示验证结果。
您可以选择何时执行验证并显示错误并给出 2 个选项 useForm()
:
mode
:这定义了第一次执行验证的时间。默认情况下,它是在单击提交按钮时而不是之前执行的。reValidateMode
:这定义了第一次执行验证的时间。 默认情况下,它在更改时执行。这意味着在第一次验证后,每次输入一个字符时,错误都会出现或消失,具体取决于每个字段的有效状态。
因此,您可以通过提供选项 {reValidateMode: "onSubmit"}
来决定始终在提交时进行验证,并使用 clearErrors
在更改时重置错误。
function App() {
const {
register,
formState: { errors },
handleSubmit,
clearErrors
} = useForm({ reValidateMode: "onSubmit" });
const onSubmit = () => null;
const firstName = register("firstName", { required: true });
const lastName = register("lastName", { required: true });
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input
{...firstName}
onChange={(e) => {
firstName.onChange(e);
clearErrors("firstName");
}}
/>
{errors.firstName?.type === "required" && "First name is required"}
<input
{...lastName}
onChange={(e) => {
lastName.onChange(e);
clearErrors("lastName");
}}
/>
{errors.lastName && "Last name is required"}
<input type="submit" />
</form>
);
}
Here is a codesandbox for that.
您也可以通过在调用 clearErrors
之前检查字段的值来仅在字段为空时(而不是在每次字符更改时)重置错误,但我认为这不是很直观只有当字段实际格式不正确时,用户才能看到错误消失。