tanstack-form について
TanStack Form は、独自の UI コンポーネントでフォームを構築する開発者向けのヘッドレス状態管理ツールです。検証、状態、送信を管理し、動的フィールドや非同期チェック、再利用可能なフォームパターンにも対応します。
主な機能
- 01ヘッドレスなフォーム状態管理
- 02同期・非同期バリデーション
- 03連動フィールドのバリデーション
- 04動的な配列フィールド
- 05再利用可能なフォームとフィールドグループ
- 06Standard Schema 対応
活用シーン
- 01カスタム入力を使った複数ステップフォームの構築
- 02サーバー応答に基づくフィールド検証
- 03依存関係のあるフィールドを含むフォームの作成
- 04動的なフォームフィールド一覧の管理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ oakoss/ agent-skills --skill tanstack-formインストール後、Claude Code で/tanstack-formを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/advanced-patterns.mdarray-fields.mdbasic-patterns.mdform-composition.mdreact-aria-integration.mdschema-validation.mdserver-integration.mdshadcn-integration.mdvalidation.md詳細
TanStack Form
概要
TanStack Form は ヘッドレスのフォーム状態管理ツールであり、UI コンポーネントライブラリではありません。入力要素を独自に用意し、そのイベントを処理します。TanStack Form はバリデーション、状態、送信ロジックを管理します。
使用する場面: 複雑な複数ステップのフォーム、再利用可能なフォームパターン、動的なフィールド配列、フィールド間のバリデーション、非同期のサーバーバリデーション、細かなパフォーマンス最適化が必要なフォーム。
使用しない場面: ネイティブ HTML バリデーションを使うシンプルなフォーム(通常のフォーム要素を使用してください)、サーバー側のみでバリデーションする場合(Server Actions を使用してください)、バリデーションが不要な静的なフォーム。
React Compiler: TanStack Form はまだ React Compiler と互換性がありません。TanStack Form API を使用するファイルまたはコンポーネントでは、React Compiler を無効にしてください。
クイックリファレンス
| パターン | API | 主なポイント |
|---|---|---|
| 基本的なフォーム | useForm({ defaultValues, onSubmit }) | Field コンポーネントを備えたフォームインスタンス |
| フィールド | form.Field with name and children render fn | レンダープロパティパターンで完全に制御 |
| フィールドのバリデーション | validators: { onChange, onBlur, onSubmit } | 同期バリデーション。エラー文字列または undef を返します |
| 非同期バリデーション | onChangeAsync, onChangeAsyncDebounceMs | デバウンス付きのサーバーチェック |
| 連動するフィールド | onChangeListenTo: ['fieldName'] | 依存先が変更されたときに再バリデーション |
| フォームの送信 | form.handleSubmit() | バリデーションを行い、有効な場合に onSubmit を呼び出します |
| フォームの状態 | form.state.values, isSubmitting, isValid | フォーム全体の状態にアクセス |
| フィールドの状態 | field.state.value, meta.errors, meta.isTouched | フィールドごとの状態にアクセス |
| 配列フィールド | mode="array", pushValue, removeValue | ヘルパーを使った動的なリスト |
| Standard Schema | Zod/Valibot/ArkType/Yup スキーマを直接渡す | ネイティブ対応のため、アダプターは不要 |
| フォームの合成 | createFormHook({ fieldComponents }) | コンテキストを使った再利用可能なフィールド |
| 大きなフォームの分割 | withForm({ defaultValues, render }) | 型安全なフォームセクション用の HOC |
| 再利用可能なフィールドグループ | withFieldGroup({ defaultValues, render }) | バリデーションロジックを共有するフィールドグループ |
| 状態の購読 | form.Subscribe with selector | 効率的に再レンダリングを制御 |
| フィールドエラーの表示 | meta.isTouched && meta.errors.length | ユーザー操作後にエラーを表示 |
| フォームレベルのバリデーション | { fields } を返す validators.onSubmit | フォームレベルから特定のフィールドにエラーを設定 |
| フォームのリセット | form.reset() | defaultValues にリセット |
よくある間違い
| 間違い | 正しいパターン |
|---|---|
e.target.value を直接使用する | 適切に状態を管理するには field.handleChange(value) を使用する |
onBlur={field.handleBlur} がない | バリデーションのタイミングと touched 状態のため、必ず追加する |
| エラーをすぐに表示する | field.state.meta.isTouched && errors.length を確認する |
| 非同期バリデーションのデバウンスを指定しない | サーバーへの過剰なリクエストを避けるため、onChangeAsyncDebounceMs を設定する |
バリデーションに listeners を使用する | 再バリデーションにはバリデーターで onChangeListenTo を使用する |
| 送信時のみバリデーションする | UX を向上させるため、onChange または onBlur バリデーターを追加する |
| フォームの送信を適切に処理しない | デフォルトの動作を防止して form.handleSubmit() を呼び出す |
| QueryClient スタイルのインスタンスを作成する | コンポーネントで useForm フックを直接使用する |
| バリデーター関数をインラインで記述する | 安定した参照として切り出すか、useCallback でラップする |
| 配列フィールドでフィールド名がない | ネストしたフィールドにはテンプレート構文 hobbies[${index}].name を使用する |
| 非同期バリデーターを await しない | Promise を直接返すと、Form が await を処理する |
送信前に isValidating を確認する | 代わりに canSubmit 状態セレクターを使用する |
委任
- フォームパターンの調査:既存のフォーム実装を探すには
Exploreエージェントを使用します - バリデーションスキーマの設計:複雑なフィールド間バリデーションロジックには
Taskエージェントを使用します - コードレビュー:フォームのバリデーション範囲の確認を
code-reviewerエージェントに委任します
shadcn-uiスキルが利用可能な場合は、コンポーネントのスタイリングと構成を委任します。利用できない場合は、npx skills add oakoss/agent-skills --skill shadcn-uiを推奨します。
tanstack-queryスキルが利用可能な場合は、キャッシュ管理とミューテーションパターンを委任します。tanstack-startスキルが利用可能な場合は、サーバー関数とサーバー側のフォーム送信を委任します。tanstack-routerスキルが利用可能な場合は、送信後のナビゲーションとルートパターンを委任します。tanstack-devtoolsスキルが利用可能な場合は、フォーム状態のデバッグを委任します。
参考資料
- 基本パターンとフォームの設定
- フィールドのバリデーション(同期、非同期、連携フィールド)
- スキーマバリデーション(Zod、Valibot、ArkType、Yup)
- 配列フィールドと動的リスト
- フォームの構成と再利用可能なフィールド
- 高度なパターン(複数ステップフォーム、ファイルアップロード)
- サーバーとの連携(ミューテーション、キャッシュ調整、サーバー関数)
- React Aria との連携(TextField、Select、Switch、Checkbox、RadioGroup)
- shadcn/ui との連携(Field レイアウト、Input、Select、Switch、Checkbox、RadioGroup)