jpskill.com
🛠️ 開発・MCP コミュニティ

pitfalls-tanstack-query

TanStack Query v5 patterns and common pitfalls. Use when implementing data fetching, cache invalidation, or debugging stale data issues. Triggers on: useQuery, useMutation, queryKey, invalidate, TanStack, React Query.

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o pitfalls-tanstack-query.zip https://jpskill.com/download/17449.zip && unzip -o pitfalls-tanstack-query.zip && rm pitfalls-tanstack-query.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/17449.zip -OutFile "$d\pitfalls-tanstack-query.zip"; Expand-Archive "$d\pitfalls-tanstack-query.zip" -DestinationPath $d -Force; ri "$d\pitfalls-tanstack-query.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して pitfalls-tanstack-query.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → pitfalls-tanstack-query フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

TanStack Query v5 の落とし穴

TanStack Query v5 におけるよくある落とし穴と正しいパターンについて説明します。

どのような時に役立つか

  • useQuery を用いたデータ取得の実装
  • useMutation を用いた mutation の設定
  • 古いデータやキャッシュの問題のデバッグ
  • TanStack Query を使用しているコードのレビュー
  • v4 から v5 への移行

ワークフロー

ステップ 1: Query Keys の確認

Query keys が適切な重複排除のために完全な URL パスを使用していることを確認します。

ステップ 2: Invalidation の確認

Mutation が成功時に、関連するクエリを確実に invalidate していることを確認します。

ステップ 3: v5 パターンの確認

v5 固有のパターン (isPending vs isLoading) を確認します。


正しい使用法

// ✅ CORRECT: queryKey に完全な URL パスを使用
const { data } = useQuery({
  queryKey: ['/api/strategies', strategyId],
  queryFn: () => api.get(`/api/strategies/${strategyId}`),
});

// ✅ CORRECT: mutation 後に invalidate
const mutation = useMutation({
  mutationFn: (data) => api.post('/api/strategies', data),
  onSuccess: () => {
    queryClient.invalidateQueries({ queryKey: ['strategies'] });
  },
});

// ✅ CORRECT: スキーマ型でレスポンスを型付け
import type { Strategy } from '@shared/schema';
const { data } = useQuery<{ data: Strategy[] }>(...);

アンチパターン

// ❌ WRONG: 短い queryKey
queryKey: ['strategy']  // 適切に重複排除されない

// ❌ WRONG: invalidate を忘れている
onSuccess: () => { navigate('/'); }  // キャッシュが古いまま!

// ❌ WRONG: mutation に isLoading を使用
mutation.isLoading  // v5 では isPending を使用

楽観的アップデート

// ✅ UI を即座に更新し、エラー時にロールバック
const mutation = useMutation({
  mutationFn: updateStrategy,
  onMutate: async (newData) => {
    await queryClient.cancelQueries({ queryKey: ['strategy', id] });
    const previous = queryClient.getQueryData(['strategy', id]);

    // 楽観的アップデート
    queryClient.setQueryData(['strategy', id], newData);

    return { previous };
  },
  onError: (err, newData, context) => {
    // エラー時にロールバック
    queryClient.setQueryData(['strategy', id], context.previous);
    toast.error('Update failed');
  },
  onSettled: () => {
    queryClient.invalidateQueries({ queryKey: ['strategy', id] });
  },
});

簡単なチェックリスト

  • [ ] QueryKeys は完全な URL パスを使用している
  • [ ] Mutations は関連するクエリを invalidate している
  • [ ] v5 では mutation に isPending ( isLoading ではない) を使用している
  • [ ] レスポンスはスキーマ型で型付けされている
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

TanStack Query v5 Pitfalls

Common pitfalls and correct patterns for TanStack Query v5.

When to Use

  • Implementing data fetching with useQuery
  • Setting up mutations with useMutation
  • Debugging stale data or cache issues
  • Reviewing code that uses TanStack Query
  • Migrating from v4 to v5

Workflow

Step 1: Check Query Keys

Verify query keys use full URL paths for proper deduplication.

Step 2: Verify Invalidation

Ensure mutations invalidate relevant queries on success.

Step 3: Check v5 Patterns

Verify v5-specific patterns (isPending vs isLoading).


Correct Usage

// ✅ CORRECT: Full URL path in queryKey
const { data } = useQuery({
  queryKey: ['/api/strategies', strategyId],
  queryFn: () => api.get(`/api/strategies/${strategyId}`),
});

// ✅ CORRECT: Invalidate after mutation
const mutation = useMutation({
  mutationFn: (data) => api.post('/api/strategies', data),
  onSuccess: () => {
    queryClient.invalidateQueries({ queryKey: ['strategies'] });
  },
});

// ✅ CORRECT: Type responses with schema types
import type { Strategy } from '@shared/schema';
const { data } = useQuery<{ data: Strategy[] }>(...);

Anti-Patterns

// ❌ WRONG: Short queryKey
queryKey: ['strategy']  // Won't dedupe properly

// ❌ WRONG: Forgetting to invalidate
onSuccess: () => { navigate('/'); }  // Stale cache!

// ❌ WRONG: Using isLoading for mutations
mutation.isLoading  // Use isPending in v5

Optimistic Updates

// ✅ Update UI immediately, rollback on error
const mutation = useMutation({
  mutationFn: updateStrategy,
  onMutate: async (newData) => {
    await queryClient.cancelQueries({ queryKey: ['strategy', id] });
    const previous = queryClient.getQueryData(['strategy', id]);

    // Optimistic update
    queryClient.setQueryData(['strategy', id], newData);

    return { previous };
  },
  onError: (err, newData, context) => {
    // Rollback on error
    queryClient.setQueryData(['strategy', id], context.previous);
    toast.error('Update failed');
  },
  onSettled: () => {
    queryClient.invalidateQueries({ queryKey: ['strategy', id] });
  },
});

Quick Checklist

  • [ ] QueryKeys use full URL paths
  • [ ] Mutations invalidate relevant queries
  • [ ] Using isPending (not isLoading) for mutations in v5
  • [ ] Responses typed with schema types