mcpField
T
tanstack-query

tanstack-query

github.com/oakoss開発21158 回インストール12 週間前に更新
リポジトリ

tanstack-query について

非同期のサーバー状態を扱うアプリ開発者向けの TanStack Query スキルです。クエリ、ミューテーション、キャッシュ、移行のパターンと実装上の注意点を解説します。

主な機能

  1. 01クエリとミューテーションのパターン
  2. 02キャッシュの無効化と更新
  3. 03無限クエリとページネーション
  4. 04オフラインと永続化のガイド
  5. 05v5 移行リファレンス

活用シーン

  1. 01無限スクロールのデータ表示を構築
  2. 02ミューテーション後のキャッシュ更新を調整
  3. 03アプリのオフラインデータを処理
  4. 04プロジェクトを v4 から v5 へ移行

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/oakoss/agent-skills --skill tanstack-query

インストール後、Claude Code で/tanstack-queryを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
basic-patterns.md
caching-coordination.md
caching.md
data-transformations.md
error-handling.md
infinite-queries.md
known-issues.md
mutations.md
offline-mode.md
performance.md
query-keys.md
ssr-hydration.md
testing.md
typescript-patterns.md
websocket-integration.md

詳細

TanStack Query

概要

TanStack Query はデータ取得ライブラリではなく、非同期状態マネージャーです。Promise を返す queryFn を指定すると、React Query がキャッシュ、重複排除、バックグラウンド更新、古いデータの管理を処理します。

使用する場合: 無限スクロール、オフラインファーストのアプリ、フォーカス復帰時や再接続時の自動再取得、複雑なキャッシュ無効化、React Native、サーバーとクライアントを組み合わせたアプリ。

使用しない場合: 純粋な同期状態(useState/Zustand を使用)、正規化された GraphQL キャッシュ(Apollo/urql)、サーバーコンポーネントのみのアプリ(ネイティブの fetch)、単純な取得と表示(サーバーコンポーネント)。

クイックリファレンス

パターンAPI主なポイント
基本的なクエリuseQuery({ queryKey, queryFn })queryKey にパラメーターを含める
Suspense クエリuseSuspenseQuery(options)enabled オプションは指定できません
並列クエリuseQueries({ queries, combine })動的な並列データ取得
依存クエリuseQuery({ enabled: !!dep })前提となるデータを待機
クエリオプションqueryOptions({ queryKey, queryFn })再利用可能で型安全な設定
基本的なミューテーションuseMutation({ mutationFn, onSuccess })成功時に無効化
ミューテーションの状態useMutationState({ filters, select })コンポーネント間でミューテーションを追跡
楽観的更新onMutate -> cancel -> snapshot -> setonError でロールバック
無限クエリuseInfiniteQuery({ initialPageParam })v5 では initialPageParam が必須
プリフェッチqueryClient.prefetchQuery(options)ホバー時や操作意図に応じて事前読み込み
無効化queryClient.invalidateQueries({ queryKey })デフォルトでは部分一致し、アクティブなもののみ対象
キャンセルqueryFn: ({ signal }) => fetch(url, { signal })キー変更時に自動キャンセル
select による変換select: (data) => data.filter(...)構造共有が維持されます
スキップトークンqueryFn: id ? () => fetch(id) : skipToken型安全な条件付き無効化
直列ミューテーションuseMutation({ scope: { id } })同じスコープ ID のミューテーションは直列に実行

v5 移行クイックリファレンス

v4(削除)v5(代わりに使用)
useQuery(key, fn, opts)useQuery({ queryKey, queryFn, ...opts })
cacheTimegcTime
isLoading(データなし)isPending
keepPreviousData: trueplaceholderData: keepPreviousData
クエリの onSuccess/onErroruseEffect またはミューテーションのコールバック
useErrorBoundarythrowOnError
initialPageParam なしinitialPageParam が必須
エラー型 unknownエラー型のデフォルトは Error

よくある間違い

間違い正しいパターン
data の前に isPending を確認するデータ優先:data → error → isPending の順に確認する
サーバーの状態をローカルの useState にコピーするデータを直接使うか、派生状態のパターンを使う
コンポーネント内で QueryClient を作成するコンポーネントの外で一度だけ作成するか、useState を使う
パラメーターの変更に refetch() を使うパラメーターを queryKey に含め、自動再取得に任せる
useQuery と useInfiniteQuery で同じキーを使う異なるキーセグメントを使う(キャッシュ構造が異なるため)
メモ化せずにインラインで select を使う安定した関数に切り出すか、useCallback を使う
再スローせずに catch を使うqueryFn 内でエラーをスローする(fetch は 4xx/5xx で reject されないため)
useQuery に手動でジェネリクスを指定するqueryFn の戻り値に型を指定し、型推論に任せる
型の絞り込みにクエリを分割代入する適切な型の絞り込みのため、クエリオブジェクトをそのまま保持する
useSuspenseQuery で enabled を使う条件付きレンダリングでコンポーネントをマウント/アンマウントする
SSR 用のプリフェッチを await しないハイドレーションの不一致を避けるため、prefetchQuery を await する
invalidateQueries ですべてが再取得されない非アクティブなクエリには refetchType: 'all' を使う

委任

  • クエリパターンの調査:Explore エージェントを使います
  • キャッシュ戦略のレビュー:Task エージェントを使います
  • コードレビュー:code-reviewer エージェントに委任します

tanstack-router スキルが利用可能な場合は、ルートローダーとプリロードのパターンを委任します。 tanstack-form スキルが利用可能な場合は、フォーム送信とミューテーションの連携を委任します。 tanstack-table スキルが利用可能な場合は、サーバーサイドのテーブルパターンを委任します。 tanstack-start スキルが利用可能な場合は、サーバー関数と SSR データ読み込みを委任します。 tanstack-devtools スキルが利用可能な場合は、クエリキャッシュのデバッグと確認を委任します。 tanstack-db スキルが利用可能な場合は、リアクティブなクライアントサイドデータベースとライブクエリのパターンを委任します。 tanstack-virtual スキルが利用可能な場合は、リストの仮想化と無限スクロールのレンダリングを委任します。 tanstack-store スキルが利用可能な場合は、クライアントサイドで共有するリアクティブな状態管理を委任します。 electricsql スキルが利用可能な場合は、ElectricSQL によるリアルタイムの Postgres 同期パターンを委任します。 local-first スキルが利用可能な場合は、ローカルファーストのアーキテクチャに関する判断と同期エンジンの選定を委任します。

参考資料

コメント