组件绑定字段
说明
组件绑定字段是使用的React Hook Form的关键之一。组件绑定字段后,该组件的值就能够被用于表单校验和提交。
注意: 每一个字段都必须设置一个唯一的字段名。
关键步骤
import { useForm } from 'react-hook-form';
const { register } = useForm();
<input {...register('firstName')} />
<select {...register('gender')}></select>
完整示例
import { useForm } from 'react-hook-form';
enum GenderEnum {
female = 'female',
male = 'male',
other = 'other',
}
interface IFormInput {
firstName: String;
gender: GenderEnum;
}
export default function RegisterField() {
const { register, handleSubmit } = useForm<IFormInput>();
const onSubmit = (data: IFormInput) => console.log(data);
return (
<form onSubmit={handleSubmit(onSubmit)}>
<label>First Name</label>
<input {...register('firstName')} />
<label>Gender Selection</label>
<select {...register('gender')}>
<option value="female">female</option>
<option value="male">male</option>
<option value="other">other</option>
</select>
<input type="submit" />
</form>
);
}
校验与校验错误的处理
React-Hook-Form支持对每个字段设置独立的校验规则,且同时支持预置的HTML校验规则和第三方库的schema校验。
使用预置的校验规则
React-Hook-Form预置了以下的校验规则,这些规则与现有的HTML格式验证标准一致。
- required
- min
- max
- minLength
- maxLength
- pattern
- validate
定义规则
内置规则要求以键值对的形式定义,格式如下:
{
字段名: {
value: 规则,
message: 校验错误时的提示信息,
}
}
其中required可以省略value,直接以message作为键值对的值,如下:
{
字段名: { required: 校验错误时的提示信息 }
}
校验规则与组件和字段绑定
将校验规则作为第二个参数传入组件的register方法,如下:
<input {...register(字段名, 校验规则)} />
获取校验错误时的提示信息
通过useForm取出错误信息,如下:
const { formState: { errors }} = useForm<IFormInputs>();
完整示例
import { useEffect } from 'react';
import { useForm, SubmitHandler } from 'react-hook-form';
interface IFormInputs {
firstName: string;
lastName: string;
age: number;
}
const onSubmit: SubmitHandler<IFormInputs> = (data) => console.log(data);
export default function HandleErrors() {
const {
register,
formState: { errors },
handleSubmit,
} = useForm<IFormInputs>();
const validateSchema = {
firstName: { required: 'First Name is required' },
lastName: {
required: 'Last Name is required',
pattern: {
value: /^[A-Za-z]+$/i,
message: 'Characters in last name must be A-Z or a-z',
},
},
age: {
required: 'Age is required',
min: {
value: 18,
message: 'Age must be larger than 18',
},
max: {
value: 99,
message: 'Age must be smaller than 99',
},
},
};
useEffect(() => {
console.log('errors: ', errors);
}, [errors]);
return (
<form onSubmit={handleSubmit(onSubmit)}>
<label>First Name</label>
<input {...register('firstName', validateSchema.firstName)} />
{errors.firstName && errors.firstName.message}
<label>Last Name</label>
<input {...register('lastName', validateSchema.lastName)} />
{errors.lastName && errors.lastName.message}
<label>Age</label>
<input type="number" {...register('age', validateSchema.age)} />
{errors.age && errors.age.message}
<input type="submit" />
</form>
);
}