tanstack-react-query

TanStack React Query Expert

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "tanstack-react-query" with this command: npx skills add gilbertopsantosjr/fullstacknextjs/gilbertopsantosjr-fullstacknextjs-tanstack-react-query

TanStack React Query Expert

Expert guidance for idiomatic React Query (TanStack Query v5) patterns in React applications, with special focus on ZSA server action integration via @saas4dev/core .

Core Hooks

From @saas4dev/core (Server Actions)

import { useServerActionQuery, useServerActionMutation, useServerActionInfiniteQuery, } from '@saas4dev/core'

From @tanstack/react-query (Direct API)

import { useQuery, useMutation, useInfiniteQuery, useQueryClient, } from '@tanstack/react-query'

Decision Tree

Need to fetch data? ├── From server action → useServerActionQuery ├── From REST/fetch directly → useQuery └── Paginated/infinite → useServerActionInfiniteQuery or useInfiniteQuery

Need to modify data? ├── From server action → useServerActionMutation └── From REST/fetch directly → useMutation

After mutation, what cache behavior? ├── Simple: just invalidate → queryClient.invalidateQueries() ├── Update specific item → queryClient.setQueryData() └── Need instant feedback → Optimistic update pattern

Quick Patterns

Server Action Query

const { data, isLoading } = useServerActionQuery(listUsersAction, { input: { status: 'active' }, queryKey: ['users', 'list', { status: 'active' }], })

Server Action Mutation with Invalidation

const queryClient = useQueryClient()

const mutation = useServerActionMutation(createUserAction, { onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['users'] }) toast.success('User created') }, onError: (error) => toast.error(error.message), })

Optimistic Update

const mutation = useServerActionMutation(updateTodoAction, { onMutate: async (newData) => { await queryClient.cancelQueries({ queryKey: ['todos', newData.id] }) const previous = queryClient.getQueryData(['todos', newData.id]) queryClient.setQueryData(['todos', newData.id], (old) => ({ ...old, ...newData })) return { previous } }, onError: (err, newData, context) => { queryClient.setQueryData(['todos', newData.id], context?.previous) }, onSettled: (data, err, variables) => { queryClient.invalidateQueries({ queryKey: ['todos', variables.id] }) }, })

Query Key Structure

Hierarchy Pattern

['entity'] // All of entity ['entity', 'list'] // All lists ['entity', 'list', { filters }] // Filtered list ['entity', 'detail', id] // Single item ['entity', id, 'nested'] // Nested resource

Query Key Factory

export const userKeys = { all: ['users'] as const, lists: () => [...userKeys.all, 'list'] as const, list: (filters: Filters) => [...userKeys.lists(), filters] as const, details: () => [...userKeys.all, 'detail'] as const, detail: (id: string) => [...userKeys.details(), id] as const, }

Configuration Defaults

const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 60 * 1000, // 1 minute gcTime: 5 * 60 * 1000, // 5 minutes retry: 1, refetchOnWindowFocus: false, }, }, })

Best Practices

  • Query Keys: Use hierarchical keys; invalidate broadly, fetch specifically

  • Mutations: Always invalidate or update related queries on success

  • Loading States: Use isLoading for first load, isFetching for background updates

  • Error Handling: Handle in onError callback; show user-friendly messages

  • Optimistic Updates: Use for high-confidence mutations; always implement rollback

  • Conditional Queries: Use enabled option, not conditional hook calls

  • Derived Data: Use select to transform data; keeps original in cache

References

Detailed patterns and examples:

  • query-patterns.md: Query keys, useQuery, pagination, parallel/dependent queries

  • mutation-patterns.md: Mutations, cache invalidation, optimistic updates, rollback

  • advanced-patterns.md: Custom hooks, prefetching, SSR hydration, testing

Skill Interface

When using this skill, provide:

{ "apiDescription": "REST/GraphQL endpoints, methods, parameters, response shapes", "uiScenario": "What the UI needs (e.g., 'List with pagination', 'Edit form with instant feedback')", "constraints": "React Query v5, fetch vs axios, suspense vs traditional", "currentCode": "(optional) Existing code to improve" }

Response includes:

  • recommendations: Query keys, hooks, invalidation strategy

  • exampleCode: React components/hooks demonstrating patterns

  • notes: Why these patterns were chosen

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Automation

gs-tanstack-react-query

No summary provided by upstream source.

Repository SourceNeeds Review
Automation

Xiaohongshu Ops

小红书端到端运营:账号定位、选题研究、内容生产、发布执行、数据复盘。 Use when: (1) 用户要写小红书笔记/帖子, (2) 用户说"发小红书"/"写个种草文"/"出一篇小红书", (3) 用户讨论小红书选题/热点/爆款分析/竞品对标, (4) 用户提到账号定位/人设/内容方向规划, (5) 用户要求生成...

Registry SourceRecently Updated
Automation

WeMP Ops

微信公众号全流程运营:选题→采集→写作→排版→发布→数据分析→评论管理。 Use when: (1) 用户要写公众号文章或提供了选题方向, (2) 用户说"写一篇关于XXX的文章"/"帮我写篇推文"/"出一篇稿子", (3) 用户要求采集热点/素材/竞品分析, (4) 用户提到公众号日报/周报/数据分析/阅读量/...

Registry SourceRecently Updated