Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/tomevault-io/skills-registry --skill tanstack-query명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
| Use when this capability is needed.
> Use when this capability is needed.
Review architecture and API design for the vfs-s3 project. Use when the user mentions @architect, asks to review an issue's design, discuss module boundaries, API shape, or architectural decisions for vfs-s3. Also trigger when the user wants to create an ADR (Architecture Decision Record) or evaluate a technical approach for the project. Intended for dispatch from Codex automation or Claude routines; GitHub trigger phrase: @vfs-s3-bot please prepare design doc Use when this capability is needed.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | tanstack-query |
| description | | Use when this capability is needed. |
Version: @tanstack/react-query@5.90.x Requires: React 18.0+, TypeScript 4.7+
variables from pending mutations, no cache manipulation neededuseErrorBoundaryonline | always | offlineFirst)queryOptions)onError/onSuccess/onSettled now receive 4 params (added onMutateResult)npm install @tanstack/react-query@latest @tanstack/react-query-devtools@latest
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 1000 * 60 * 5, // 5 min
gcTime: 1000 * 60 * 60, // 1 hour
refetchOnWindowFocus: false,
},
},
})
function App() {
return (
<QueryClientProvider client={queryClient}>
<YourApp />
<ReactQueryDevtools initialIsOpen={false} />
</QueryClientProvider>
)
}
If using Query + Router (or other TanStack libraries), use the unified TanStackDevtools shell instead of individual devtools components:
npm install -D @tanstack/react-devtools
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { ReactQueryDevtoolsPanel } from '@tanstack/react-query-devtools'
import { TanStackDevtools } from '@tanstack/react-devtools'
function App() {
return (
<QueryClientProvider client={queryClient}>
<YourApp />
<TanStackDevtools
config={{ position: 'bottom-right' }}
plugins={[
{ name: 'TanStack Query', render: <ReactQueryDevtoolsPanel /> },
// Add more plugins: Router, etc.
]}
/>
</QueryClientProvider>
)
}
Use *Panel variants (ReactQueryDevtoolsPanel, TanStackRouterDevtoolsPanel) when embedding inside TanStackDevtools.
import { useQuery, useMutation, useQueryClient, queryOptions } from '@tanstack/react-query'
const todosQueryOptions = queryOptions({
queryKey: ['todos'],
queryFn: async () => {
const res = await fetch('/api/todos')
if (!res.ok) throw new Error('Failed to fetch')
return res.json()
},
})
function useTodos() {
return useQuery(todosQueryOptions)
}
function useAddTodo() {
const queryClient = useQueryClient()
return useMutation({
mutationFn: async (newTodo: { title: string }) => {
const res = await fetch('/api/todos', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(newTodo),
})
(!res.) ()
res.()
},
: {
queryClient.({ : [] })
},
})
}
| Priority | Category | Rule File | Impact |
|---|---|---|---|
| CRITICAL | Query Keys | rules/qk-query-keys.md | Prevents cache bugs and data inconsistencies |
| CRITICAL | Caching | rules/cache-configuration.md | Optimizes performance and data freshness |
| HIGH | Invalidation | rules/cache-invalidation.md | Ensures stale data is properly refreshed |
| HIGH | Mutations | rules/mut-basics.md | Ensures data integrity after writes |
| HIGH | Optimistic Updates | rules/mut-optimistic-updates.md | Responsive UI during mutations |
| HIGH | Error Handling | rules/err-error-handling.md | Prevents poor user experiences |
| MEDIUM | Prefetching | rules/pf-prefetching.md | Improves perceived performance |
| MEDIUM | Infinite Queries | rules/inf-infinite-queries.md | Prevents pagination bugs |
| MEDIUM | SSR/Hydration | rules/ssr-hydration.md | Enables proper server rendering |
| MEDIUM | Parallel Queries | rules/parallel-queries.md | Dynamic parallel fetching |
| LOW | Performance | rules/perf-optimization.md | Reduces unnecessary re-renders |
| LOW | Offline Support | rules/offline-support.md | Enables offline-first patterns |
useQuery({ queryKey, queryFn, ...options })['todos'], ['todos', id], ['todos', { filter }]if (!res.ok) throw new Error('Failed')if (isPending) return <Loading />onSuccess: () => queryClient.invalidateQueries({ queryKey: ['todos'] })useQuery, useSuspenseQuery, prefetchQueryuseQuery(['todos'], fetchTodos) — removed in v5onSuccess/onError/onSettled removed from queries (still work in mutations) — use useEffect insteadisPendingplaceholderData: keepPreviousData| v4 | v5 | Notes |
|---|---|---|
useQuery(['key'], fn, opts) | useQuery({ queryKey, queryFn, ...opts }) | Object syntax only |
cacheTime | gcTime | Renamed |
isLoading (no data) | isPending | isLoading = isPending && isFetching |
keepPreviousData: true | placeholderData: keepPreviousData | Import keepPreviousData helper |
useErrorBoundary | throwOnError | Renamed |
onSuccess/onError/onSettled on queries | Removed | Use useEffect for side effects |
pageParam = 0 default | initialPageParam: 0 | Required for infinite queries |
status: 'loading' | status: 'pending' | Renamed |
onError(err, vars, ctx) | onError(err, vars, onMutateResult, ctx) | v5.89+ added 4th param |
void prefetchQuery + useSuspenseQuery with conditional isFetching render causes hydration errors. Workaround: await prefetch or don't render based on fetchStatususeQuery + server prefetch can mismatch isLoading between server/client. Use useSuspenseQuery insteadretryOnMount: false in addition to refetchOnMount: falsemutation.state.variables typed as unknown due to fuzzy matching. Cast explicitly in select callbackrefetchType: 'all' to include inactive queries// Dependent queries (B waits for A)
const { data: user } = useQuery({ queryKey: ['user', id], queryFn: () => fetchUser(id) })
const { data: posts } = useQuery({
queryKey: ['posts', user?.id],
queryFn: () => fetchPosts(user!.id),
enabled: !!user,
})
// Parallel queries
const results = useQueries({
queries: ids.map(id => ({ queryKey: ['item', id], queryFn: () => fetchItem(id) })),
combine: (results) => ({ data: results.map(r => r.data), pending: results.some(r => r.isPending) }),
})
// Prefetch on hover
const handleHover = () => queryClient.prefetchQuery({ queryKey: ['item', id], queryFn: (id) })
({
: [],
: (pageParam),
: ,
: lastPage.,
})
: ({ signal }) => {
res = (, { signal })
res.()
}
({ : [], : fetchTodos, : data.( t.) })
Converted and distributed by TomeVault — claim your Tome and manage your conversions.