Estado y Obtención de Datos
Dos tipos de estado, dos herramientas:
- Estado de servidor (cualquier cosa que vive en tu backend) →
@tanstack/react-query. - Estado local / de UI (un toggle, un paso de formulario, un tab seleccionado) → hooks de React + Context.
Importante
Sin store global (Redux/Zustand) por defecto. react-query ya maneja caché, loading, reintentos y refetch en segundo plano para los datos de servidor — que es la mayor parte de lo que antes ocupaba un “store global”. Recurrí a un store global solo cuando tenés estado de cliente genuinamente global que muchas screens mutan, y agregalo a propósito.
Query keys
Las keys son arrays, ordenadas de más-general a más-específica. Esto hace que invalidar sea predecible:
["orders"] // la lista
["orders", orderId] // una orden
Un hook de query
Envolvé cada request en un hook que vive en el hooks/ de la feature:
// src/features/orders/hooks/useOrders.ts
import { useQuery } from "@tanstack/react-query";
import { api } from "@shared/services/api";
export function useOrders() {
return useQuery({
queryKey: ["orders"],
queryFn: async () => (await api.get("/orders")).data,
staleTime: 30_000, // tratar los datos como frescos por 30s
});
}
Mutations + invalidación
import { useMutation, useQueryClient } from "@tanstack/react-query";
export function useCreateOrder() {
const qc = useQueryClient();
return useMutation({
mutationFn: (body: NewOrder) => api.post("/orders", body),
onSuccess: () => qc.invalidateQueries({ queryKey: ["orders"] }),
});
}
El QueryClientProvider se monta una sola vez en la raíz, en
app/_layout.tsx, así que todas las screens comparten una sola caché.