R
Interview Deckreact · next.js · senior/staff
0·0·122
Padrão

React Query / TanStack Query

Lib para data fetching, cache e sync de server state. Substituí useState+useEffect+manual cache.

TanStack Query (antes React Query) é a lib padrão para gerenciar 'server state' — dados que vêm de APIs. Oferece: cache automático, deduplicação, background refetch, optimistic updates, infinite queries, mutations com rollback.

Problema
useState + useEffect para fetch é repetitivo e propenso a bugs: race conditions, cache manual, refetch on focus, retry, loading/error states.
Solução
useQuery({ queryKey, queryFn }) → retorna { data, isLoading, error, refetch }. Cache, refetch, dedupe, tudo automático. useMutation para writes com optimistic updates.
Tip
Use queryKey como ['posts', userId, filters]. React Query invalida e refeta com base nessa key. Defaults são bons — staleTime: 0 (refetch sempre), refetchOnWindowFocus: true.
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';

function Posts() {
  const { data, isLoading } = useQuery({
    queryKey: ['posts'],
    queryFn: () => fetch('/api/posts').then(r => r.json())
  });

  if (isLoading) return <Skeleton />;
  return data.map(p => <Post key={p.id} {...p} />);
}

function NewPost() {
  const qc = useQueryClient();
  const mutation = useMutation({
    mutationFn: (newPost) => fetch('/api/posts', { method: 'POST', body: JSON.stringify(newPost) }),
    onSuccess: () => qc.invalidateQueries({ queryKey: ['posts'] })
  });

  return <button onClick={() => mutation.mutate({ title: 'Novo' })}>Criar</button>;
}
Q.React Query vs SWR?
A.Ambos resolvem o mesmo problema. React Query: mais features (mutations, infinite, devtools), API mais explícita. SWR (Vercel): mais simples, integração natural com Next.js. Escolha por preferência — ambos excelentes.
Q.React Query com Server Components?
A.Em Server Components, fetch direto basta (já tem cache do Next.js). Use React Query apenas em Client Components. Para hidratar com dados do server, use HydrationBoundary.
Q.Optimistic updates como funciona?
A.useMutation com onMutate atualiza o cache otimisticamente. Se a mutation falhar, onError reverte. Resultado: UI instantânea, com rollback automático em caso de erro.
42/122← →