2023-07-02
React Hook FormとZodで詰まったポイント
基本的な使い方
- Zodでバリデーションのスキーマを定義
- このスキーマはformデータの型としても利用できる
- React Hook FormのuseFormフックを利用。この際にresolverを指定。先程作成したZodで定義したスキーマを利用。
- inputにregisterを指定して入力フィールドをReact Hook Formの管理下に置く。
import React from 'react';
import { useForm, Controller } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';
// まず、Zodを利用してバリデーションスキーマを定義します
const schema = z.object({
name: z.string().nonempty({ message: 'Name is required' }),
email: z.string().email({ message: 'Invalid email address' }),
});
// スキーマから型を生成します
type FormData = z.infer<typeof schema>;
const Form = () => {
const { register, handleSubmit, formState: { errors } } = useForm<FormData>({
resolver: zodResolver(schema),
});
const onSubmit = (data: FormData) => {
console.log(data);
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register("name")} />
{errors.name && <p>{errors.name.message}</p>}
<input {...register("email")} />
{errors.email && <p>{errors.email.message}</p>}
<input type="submit" />
</form>
);
};
export default Form;
inputのonChangeを検知してバリデーション行いたい
const {
register,
watch,
setValue,
formState: { errors },
} = useForm<SearchFormInputs>({
resolver: zodResolver(schema),
mode: "onChange",
});
modeは他にも
mode | |
---|---|
onSubmit | デフォルト。submitのタイミングでエラー表示 |
onChange | 入力を検知してエラー表示。 |
onBlur | inputの外をクリックしたタイミングでエラー表示。 |
onTouched | 最初のblurのタイミング、その後は毎回の変更のタイミングでエラー表示。 |
all | blurとchangeイベントでエラー表示。 |
がある。
setValue時にもonChangeイベントを発火させたい
setValue("query", suggestion.suggest, { shouldValidate: true });