返回

表单验证不再等待:React Hook Form和Yup的即时验证

javascript

React Hook Form的Yup验证:即时验证,不再等待

简介

表单验证对于确保用户输入数据的准确性和完整性至关重要。然而,在使用React Hook Form和Yup验证库时,默认情况下,验证仅在提交表单后才进行。这可能会导致延迟发现错误,给用户带来不佳的体验。

问题:延迟验证

默认情况下,React Hook Form使用mode: "onSubmit"模式。这意味着只有在提交表单时才会触发验证。这对于大型复杂表单而言,可能导致延迟发现错误,因为用户可能已经填写了大量字段,然后才发现一个错误,迫使他们重新填写。

解决方案:即时验证

为了解决这个问题,我们可以使用mode: "onTouched"模式。在这种模式下,只要用户更改任何字段的值,验证就会立即触发。这允许我们尽早发现错误,并向用户提供及时反馈。

实现即时验证

步骤1:配置表单

在表单配置中,使用mode: "onTouched"来启用即时验证。

import { useForm, yupResolver } from 'react-hook-form';

const schema = yupResolver(Yup.object().shape({
  name: Yup.string().required()
}));

const { register, handleSubmit, formState: { errors } } = useForm({
  resolver: schema,
  mode: "onTouched"
});

步骤2:手动触发验证

在OnChange事件中,我们需要手动触发特定字段的验证,以便在更改值时立即获取反馈。

const onNameChange = async ({ target: { value } }) => {
  await trigger("name");
};

步骤3:使用受控组件

为了确保在更改值时触发验证,我们应该使用受控组件。受控组件允许表单组件的值由React状态管理。

const Input = ({ register, ...rest }) => {
  const name = register("name");
  return <input {...name} {...rest} />;
};

优化即时验证

即时验证可能会对表单性能产生影响,因为每个字段更改都会触发验证。为了优化性能,我们可以:

  • 减少不必要的验证,例如只在特定的条件下验证字段。
  • 使用reValidateMode选项控制验证频率,例如只在失去焦点时验证字段。

结论

通过使用mode: "onTouched"模式和手动触发验证,我们可以让React Hook Form和Yup验证库在字段更改时立即进行验证。这使我们能够尽早发现错误,并向用户提供及时反馈,从而提高表单用户体验。

常见问题解答

Q1:为什么我们需要即时验证?

A: 即时验证可以尽早发现错误,从而减少用户填写大量字段后发现错误的挫败感。

Q2:除了mode: "onTouched"模式外,还有什么替代方案?

A: 另一种方法是使用自定义验证函数,并在onChange事件中手动调用它。

Q3:如何处理大型复杂表单的验证?

A: 对于大型表单,我们可以使用嵌套模式,将表单分解成更小的可管理块。

Q4:reValidateMode选项有什么好处?

A: reValidateMode允许我们控制验证频率,优化表单性能。

Q5:在使用即时验证时,还有什么需要考虑的?

A: 避免不必要的验证,使用受控组件,并根据需要优化验证频率,以确保最佳的性能和用户体验。