🙆♀️
React Hook Form + Zodで他の項目によってvalidationが変わる場合の対応
とある項目のvalidationが他の項目の値によって変わる場合の対応をした時の備忘録。
React Hook Formを併用した場合に限らずだとは思います。
例えば選んだプランによっては、入力が必須となる項目を作りたい場合。
.refineで入力値dataを受け取れるので、その中で判定します。
falseを返すとエラーとなります。
pathで渡した項目のエラーとなりmessageが受け取れます。
const schema = z
.object({
plan: z.coerce.number(),
point: z.coerce
.number()
.min(100, { message: "ポイントを入力してください" }),
})
.refine(
(data) => {
if (data.planId === 1) {
return data.point !== null && data.point !== 0;
}
return true;
},
{
message:
"プランが「法人プラン」の場合、「ポイント」は必須です。",
path: ["point"],
}
);
おまけ
z.coerce.number()はReact Hook Formを使った場合フォームから受け取った値がStringになっているので強制的にNumberにするものです。
Discussion
相関のあるプロパティでのバリデーションをsuperRefineで表現してみました。
/coerce
ページがデモになります。簡単ですが、以上です。
ありがとうございます。
superRefineなるほど、こういうのもあるんですね。
component構造とかも勉強になります。