Se o seu código tem useEffect com fetch, useState para loading e error, você está reinventando a roda (e provavelmente uma roda quadrada).
O TanStack Query (React Query) não é apenas uma lib de fetch. É um Gerenciador de Estado Assíncrono.
O Problema do Fetch Manual
Gerenciar estado de servidor no cliente é difícil:
- Como lidar com cache? (Não buscar o mesmo dado 2x).
- Como atualizar o dado se o usuário focar na janela?
- Como tentar de novo se a internet falhar?
- Como evitar "Race Conditions"?
O React Query resolve tudo isso com zero configuração.
O Poder do useQuery
import { useQuery } from '@tanstack/react-query'
function UserProfile() {
const { isPending, error, data } = useQuery({
queryKey: ['userProfile'],
queryFn: () => fetch('/api/user').then((res) => res.json()),
})
if (isPending) return 'Carregando...'
if (error) return 'Erro: ' + error.message
return <div>{data.name}</div>
}
Stale-While-Revalidate
O React Query mostra o dado "velho" (stale) do cache instantaneamente enquanto busca o novo em background. O usuário sente que o app é instantâneo.
Mutations (Alterando Dados)
Para POST/PUT/DELETE, usamos useMutation. O "pulo do gato" é a Invalidation.
const mutation = useMutation({
mutationFn: updateUser,
onSuccess: () => {
// Diz ao React Query: "O dado de perfil mudou, busque de novo!"
queryClient.invalidateQueries({ queryKey: ['userProfile'] })
},
})
Isso garante que sua UI esteja sempre sincronizada com o servidor, sem você precisar atualizar manualmente o estado local.
Conclusão
React Query elimina milhares de linhas de código boilerplate e bugs complexos. É a ferramenta essencial para qualquer aplicação React que fale com uma API.