🔖
[ReactHookForm/Zod] SuperRefine した ArrayField のバリデーションエラーが表示されなくなっていた
問題
ReactHookForm と Zod を使った環境にて、SuperRefine した Array のバリデーションが表示されなくなっていた。
以下、簡略化したコード。
import { z } from "zod";
import { useFieldArray, useForm } from "react-hook-form";
const someSchema = z.object({
items: z.array(z.object({
// 省略
}))
})
const schema = someSchema.superRefine((value, context) => {
if(...) {
context.addIssue({
code: z.ZodIssueCode.custom,
path: ["items"],
message: "..."
})
}
})
const { formState: { errors } } = useForm({
defaultValues: { items: [] },
resolver: zodResolver(schema),
});
const { fields, append, remove } = useFieldArray({
control,
name: "items",
});
console.log(errors.items?.message); // ← これが取得できなくなっている!
利用しているバージョンは以下の通り。
- ReactHookForm: 7.45.4
- Zod: 3.23.8
解決
解決自体はシンプル。
console.log(errors.items?.root?.message); // ← root が挟まるようになった。
コードベースの他の箇所では root
なしでもエラーメッセージが取れるので、SuperRefine した Array の場合など、特殊な条件化で起こる現象かもしれない。
それぞれのライブラリの Release note などを見てみたが、原因となる箇所を見つけられず…。モヤモヤは残るが、いったんバリデーションエラーメッセージは取れるようになった。
Discussion
たしかにそんな気もしなくもないですね。バージョン違いかもですね。
やってみると、以下の2つのスキーマ定義の場合でも
@hookform/error-message
から提供されているErrorMessageコンポーネントからはサブスクライブできていそうな気がしました。その1
その2