TanStack Query Best Practices
Comprehensive guidelines for implementing TanStack Query (React Query) patterns in React applications. These rules optimize data fetching, caching, mutations, and server state synchronization.
When to Apply
-
Creating new data fetching logic
-
Setting up query configurations
-
Implementing mutations and optimistic updates
-
Configuring caching strategies
-
Integrating with SSR/SSG
-
Refactoring existing data fetching code
Rule Categories by Priority
Priority Category Rules Impact
CRITICAL Query Keys 5 rules Prevents cache bugs and data inconsistencies
CRITICAL Caching 5 rules Optimizes performance and data freshness
HIGH Mutations 6 rules Ensures data integrity and UI consistency
HIGH Error Handling 3 rules Prevents poor user experiences
MEDIUM Prefetching 4 rules Improves perceived performance
MEDIUM Parallel Queries 2 rules Enables dynamic parallel fetching
MEDIUM Infinite Queries 3 rules Prevents pagination bugs
MEDIUM SSR Integration 4 rules Enables proper hydration
LOW Performance 4 rules Reduces unnecessary re-renders
LOW Offline Support 2 rules Enables offline-first patterns
Quick Reference
Query Keys (Prefix: qk- )
-
qk-array-structure — Always use arrays for query keys
-
qk-include-dependencies — Include all variables the query depends on
-
qk-hierarchical-organization — Organize keys hierarchically (entity → id → filters)
-
qk-factory-pattern — Use query key factories for complex applications
-
qk-serializable — Ensure all key parts are JSON-serializable
Caching (Prefix: cache- )
-
cache-stale-time — Set appropriate staleTime based on data volatility
-
cache-gc-time — Configure gcTime for inactive query retention
-
cache-defaults — Set sensible defaults at QueryClient level
-
cache-invalidation — Use targeted invalidation over broad patterns
-
cache-placeholder-vs-initial — Understand placeholder vs initial data differences
Mutations (Prefix: mut- )
-
mut-invalidate-queries — Always invalidate related queries after mutations
-
mut-optimistic-updates — Implement optimistic updates for responsive UI
-
mut-rollback-context — Provide rollback context from onMutate
-
mut-error-handling — Handle mutation errors gracefully
-
mut-loading-states — Use isPending for mutation loading states
-
mut-mutation-state — Use useMutationState for cross-component tracking
Error Handling (Prefix: err- )
-
err-error-boundaries — Use error boundaries with useQueryErrorResetBoundary
-
err-retry-config — Configure retry logic appropriately
-
err-fallback-data — Provide fallback data when appropriate
Prefetching (Prefix: pf- )
-
pf-intent-prefetch — Prefetch on user intent (hover, focus)
-
pf-route-prefetch — Prefetch data during route transitions
-
pf-stale-time-config — Set staleTime when prefetching
-
pf-ensure-query-data — Use ensureQueryData for conditional prefetching
Infinite Queries (Prefix: inf- )
-
inf-page-params — Always provide getNextPageParam
-
inf-loading-guards — Check isFetchingNextPage before fetching more
-
inf-max-pages — Consider maxPages for large datasets
SSR Integration (Prefix: ssr- )
-
ssr-dehydration — Use dehydrate/hydrate pattern for SSR
-
ssr-client-per-request — Create QueryClient per request
-
ssr-stale-time-server — Set higher staleTime on server
-
ssr-hydration-boundary — Wrap with HydrationBoundary
Parallel Queries (Prefix: parallel- )
-
parallel-use-queries — Use useQueries for dynamic parallel queries
-
query-cancellation — Implement query cancellation properly
Performance (Prefix: perf- )
-
perf-select-transform — Use select to transform/filter data
-
perf-structural-sharing — Leverage structural sharing
-
perf-notify-change-props — Limit re-renders with notifyOnChangeProps
-
perf-placeholder-data — Use placeholderData for instant UI
Offline Support (Prefix: offline- )
-
network-mode — Configure network mode for offline support
-
persist-queries — Configure query persistence for offline support
How to Use
Each rule file in the rules/ directory contains:
-
Explanation — Why this pattern matters
-
Bad Example — Anti-pattern to avoid
-
Good Example — Recommended implementation
-
Context — When to apply or skip this rule
Full Reference
See individual rule files in rules/ directory for detailed guidance and code examples.