bulletproof-react のフォームコンポーネントの実装が綺麗だったためメモメモ。
フォームコンポーネントの実装。
const Form = <
Schema extends ZodType,
TFormValues extends FieldValues = z.infer,
>({
onSubmit,
children,
className,
options,
id,
schema,
}: FormProps) => {
const form = useForm({ ...options, resolver: zodResolver(schema) });
return (
{children(form)} // フォームの機能を子コンポーネントに渡す!!
);
};
こんな感じで使用する。
{
updateDiscussionMutation.mutate({
data: values,
discussionId,
});
}}
options={{
defaultValues: {
title: discussion?.title ?? '',
body: discussion?.body ?? '',
public: discussion?.public ?? false,
},
}}
schema={updateDiscussionInputSchema}
>
{({ register, formState, setValue, watch }) => ( // 渡された機能を使ってフォームの実装が可能になる!!便利!!
<>
~~~
{children(form)} を使って UI コンポーネント上でインポートした React Hook Form の機能を子コンポーネントに渡すことで、無駄なインポートをせずにフォームの開発が行えます。かなり汎用的ですね。すごい...。