react-hook-form について
React Hook Form を使う開発者向けのリファレンススキルです。フォーム設定や検証、パフォーマンス最適化など、優先度別の 35 項目を収録しています。
主な機能
- 017 分野にわたる 35 項目
- 02フォーム設定と検証の指針
- 03フィールド購読と再レンダー分離
- 04制御コンポーネントと UI 連携
- 05状態管理とフィールド配列のパターン
活用シーン
- 01React Hook Form でのフォーム作成
- 02フォームのパフォーマンス確認
- 03サーバーエラーと非同期送信への対応
- 04制御 UI コンポーネントの統合
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ pproenca/ dot-skills --skill react-hook-formインストール後、Claude Code で/react-hook-formを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
AGENTS.mdmetadata.jsonREADME.mdassets/templates/_template.mdreferences/_sections.mdarray-disabled-silently-noops.mdarray-separate-crud-operations.mdarray-unique-fieldarray-per-name.mdarray-use-field-id-as-key.mdctrl-controller-field-props.mdctrl-usecontroller-isolation.mdformcfg-async-default-values.mdformcfg-default-values.mdformcfg-disabled-prop.mdformcfg-revalidate-mode.mdformcfg-should-unregister.mdformcfg-transformed-values-generic.mdformcfg-useeffect-dependency.mdformcfg-validation-mode.mdformcfg-values-prop.mdformstate-async-submit-lifecycle.mdformstate-avoid-isvalid-with-onsubmit.mdformstate-destructure-formstate.mdformstate-handlesubmit-oninvalid.mdformstate-reset-default-values.mdformstate-useformstate-isolation.mdinteg-shadcn-form-import.mdinteg-shadcn-select-wiring.mdinteg-value-transform.mdsub-avoid-watch-in-render.md詳細
コミュニティが推奨する React Hook Form のベストプラクティス
React Hook Form アプリケーションのパフォーマンス最適化に関する包括的なガイドです。各ルールは、デフォルトのままでは問題になる判断を取り上げており、7 つのカテゴリーにわたる 35 のルールを収録しています。react-hook-form 7.82.0 に照らして検証済みです。
適用する場面
次のような場合に、これらのガイドラインを参照してください。
- React Hook Form を使って新しいフォームを作成するとき
- useForm のオプション(mode、defaultValues、validation)を設定するとき
- watch / useWatch / subscribe でフォーム値をサブスクライブするとき
- 制御された UI コンポーネント(MUI、shadcn、Ant Design)を統合するとき
- useFieldArray で動的なフィールド配列を管理するとき
- 非同期の送信、サーバーエラー、送信ライフサイクルの状態を処理するとき
- フォームのパフォーマンス問題をレビューするとき
このスキルを使用しない場面
- React 19 Server Actions /
useActionState— 代わりにreact-19スキルを使用してください - 深くネストした、完全に型安全なフォーム — 複雑なネスト構造のスキーマを持つフォームには TanStack Form のほうが適している場合があります。このスキルでは、すでに RHF を選択していることを前提としています
- 単一入力または単純なフォーム — ライブラリを導入するより、非制御の
<form>とFormDataを使うほうが簡潔な場合がよくあります
優先度別のルールカテゴリー
| 優先度 | カテゴリー | 影響度 | プレフィックス |
|---|---|---|---|
| 1 | フォーム設定 | CRITICAL | formcfg- |
| 2 | フィールドのサブスクリプション | CRITICAL | sub- |
| 3 | 制御されたコンポーネント | HIGH | ctrl- |
| 4 | バリデーションパターン | HIGH | valid- |
| 5 | 状態管理 | MEDIUM-HIGH | formstate- |
| 6 | フィールド配列 | MEDIUM-HIGH | array- |
| 7 | 統合パターン | MEDIUM | integ- |
クイックリファレンス
1. フォーム設定(CRITICAL)
formcfg-default-values- フォームの初期化には必ず defaultValues を指定するformcfg-useeffect-dependency- formState 自体ではなく、formState のスライスを依存対象にするformcfg-validation-mode- デフォルトの onSubmit 以外の mode を使う場合は理由を明確にするformcfg-revalidate-mode- バリデーションのコストが高い場合を除き、デフォルトの reValidateMode を維持するformcfg-should-unregister- 非表示フィールドを送信データから除外する必要がある場合を除き、shouldUnregister は無効のままにするformcfg-transformed-values-generic- リゾルバーが値を変換する場合は、useForm の第 3 ジェネリック型を指定するformcfg-async-default-values- サーバーデータには非同期の defaultValues を使用するformcfg-disabled-prop- 見た目上の無効化には、register の disabled オプションではなく HTML の disabled 属性を使用するformcfg-values-prop- values プロパティを使って、フォームをサーバーデータと同期させる
2. フィールドのサブスクリプション(CRITICAL)
sub-avoid-watch-in-render- 一度だけ値を読み取る場合、レンダー中に watch() を呼び出さないsub-memo-cannot-beat-context- React.memo では、FormProvider 配下で Context によって発生する再レンダーを防げないsub-subscribe-outside-react- React のライフサイクル外でフォームの変更に反応するには subscribe() を使うsub-render-prop-components- 子コンポーネントを作らずに再レンダーを分離するには、レンダープロパティコンポーネントを使うsub-useformcontext-sparingly- 深いネストで useFormContext を使うのは必要最小限にするsub-usewatch-over-watch- 再レンダーを分離するには watch ではなく useWatch を使うsub-watch-specific-fields- フォーム全体ではなく、特定のフィールドを監視する
3. 制御されたコンポーネント(HIGH)
ctrl-usecontroller-isolation- 制御された入力は専用の子コンポーネントに分離するctrl-controller-field-props- UI ライブラリの Controller フィールドプロパティを正しく接続する
4. バリデーションパターン(HIGH)
valid-resolver-caching- レンダーパスの外でバリデーションスキーマを一度だけ構築するvalid-valueasnumber-empty-nan- 入力が空の場合に valueAsNumber が生成する NaN 値を処理するvalid-server-errors- setError('root.serverError', ...) でサーバーエラーを表示するvalid-delay-error- delayError を使って、エラー表示の急な切り替わりをデバウンスする
5. 状態管理(MEDIUM-HIGH)
formstate-avoid-isvalid-with-onsubmit- ボタンの状態管理では、onSubmit モードで isValid を使わないformstate-destructure-formstate- レンダリング中に依存する formState のプロパティをすべて読み取るformstate-reset-default-values- 保存成功後に resetDefaultValues でデフォルト値を再設定するformstate-handlesubmit-oninvalid- 拒否された送信を処理するには、handleSubmit の第 2 引数を使うformstate-useformstate-isolation- 状態のサブスクリプションを分離するには useFormState を使うformstate-async-submit-lifecycle- 非同期の送信ハンドラーを try/catch で囲み、isSubmitSuccessful でリセットする
6. フィールド配列(MEDIUM-HIGH)
array-separate-crud-operations- フィールド配列の操作を順番に分けて実行するarray-use-field-id-as-key- useFieldArray のマップでは field.id をキーとして使うarray-unique-fieldarray-per-name- フィールド名ごとに useFieldArray のインスタンスを 1 つだけ使うarray-disabled-silently-noops- useFieldArray の disabled オプションを指定すると、すべての変更操作が何もせずに終了する
7. 統合パターン(MEDIUM)
integ-value-transform- 型強制のために Controller レベルで値を変換するinteg-shadcn-form-import- shadcn Form コンポーネントのインポート元を確認するinteg-shadcn-select-wiring- スプレッドの代わりに onValueChange を使って shadcn Select を接続する
使用方法
詳しい説明とコード例については、個別のリファレンスファイルをお読みください。
- セクション定義 - カテゴリー構成と影響レベル
- ルールのテンプレート - 新しいルールを追加するためのテンプレート
- リファレンスファイル:
references/{prefix}-{slug}.md
関連スキル
- Zod resolver によるスキーマ検証については、
zodスキルを参照してください - React 19 のサーバーアクションについては、
react-19スキルを参照してください - UI/UX フォームの設計については、
frontend-designスキルを参照してください
完全版ドキュメント
すべてのルールを詳しく記載した完全ガイド:AGENTS.md
コメント
Markdown 対応