0Pricing
React Academy · Lección

Mutaciones con useMutation

Envíe datos a las API con useMutation, gestione los estados de carga y error e invalide las consultas cuando haya éxito.

Mutaciones con useMutation es una lección gratuita de React Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.

Bienvenida

En esta lección utilizará useMutation para enviar datos a APIs, gestionará los estados de carga y error e invalidará las consultas obsoletas después de realizar mutaciones correctamente.

Conceptos básicos de useMutation

Llame a useMutation con una mutationFn. Devuelve una función mutate y propiedades de estado. Llame a mutate() para activar la operación.
import { useMutation } from '@tanstack/react-query';

const { mutate, isLoading, isError } = useMutation({
  mutationFn: (newPost) => fetch('/api/posts', {
    method: 'POST',
    body: JSON.stringify(newPost),
  }).then(r => r.json()),
});

Llamada a mutate

Llame a `mutate(variables)` desde un controlador de eventos. Las variables se pasan a mutationFn como primer argumento.
<button onClick={() => mutate({ title: 'New Post' })}>
  Create Post
</button>

Callbacks: onSuccess, onError, onSettled

Añada opciones de callback a useMutation: onSuccess se ejecuta después de una mutación correcta, onError se ejecuta si falla y onSettled se ejecuta en ambos casos (como finally).
useMutation({
  mutationFn: createPost,
  onSuccess: (data) => {
    console.log('Created:', data);
    navigate('/posts/' + data.id);
  },
  onError: (error) => {
    toast.error(error.message);
  },
})

Invalidación de consultas después de una mutación

Después de una mutación correcta, invalide las consultas relacionadas para que React Query vuelva a obtener datos actualizados. Utilice queryClient.invalidateQueries en onSuccess.
import { useQueryClient } from '@tanstack/react-query';

const queryClient = useQueryClient();

const { mutate } = useMutation({
  mutationFn: createPost,
  onSuccess: () => {
    queryClient.invalidateQueries({ queryKey: ['posts'] });
  },
});

mutateAsync para usar await

Utilice `mutateAsync` en lugar de `mutate` para esperar a que termine la mutación y gestionarla con try/catch.
const { mutateAsync } = useMutation({ mutationFn: createPost });

async function handleSubmit() {
  try {
    const post = await mutateAsync({ title: 'Draft' });
    navigate('/posts/' + post.id);
  } catch (err) {
    setError(err.message);
  }
}

Deshabilitar el envío durante una mutación

Utilice `isPending` (o `isLoading`) para deshabilitar el botón de envío mientras la mutación está en curso.
const { mutate, isPending } = useMutation({ mutationFn: saveItem });

<button onClick={() => mutate(item)} disabled={isPending}>
  {isPending ? 'Saving...' : 'Save'}
</button>

Actualizaciones optimistas con onMutate

Utilice onMutate para actualizar la caché de forma optimista antes de que responda el servidor. Revierta los cambios en onError con el contexto devuelto por onMutate.
useMutation({
  mutationFn: likePost,
  onMutate: async (id) => {
    await queryClient.cancelQueries({ queryKey: ['posts'] });
    const prev = queryClient.getQueryData(['posts']);
    queryClient.setQueryData(['posts'], old => old.map(p =>
      p.id === id ? { ...p, likes: p.likes + 1 } : p));
    return { prev };
  },
  onError: (err, id, ctx) => queryClient.setQueryData(['posts'], ctx.prev),
  onSettled: () => queryClient.invalidateQueries({ queryKey: ['posts'] }),
})

Restablecimiento del estado de una mutación

Llame a `reset()` desde useMutation para borrar el estado de la mutación (data, error y status). Resulta útil después de navegar a otra página o de borrar un formulario.
const { mutate, isError, reset } = useMutation({ /* ... */ });

{isError && (
  <>
    <p>Error!</p>
    <button onClick={reset}>Try Again</button>
  </>
)}

Varias mutaciones en paralelo

Llame a mutate varias veces en paralelo; cada invocación se sigue de forma independiente. Utilice mutateAsync con Promise.all para realizar mutaciones en paralelo.
await Promise.all([
  mutateAsync({ id: 1, title: 'First' }),
  mutateAsync({ id: 2, title: 'Second' }),
]);

Comprobación rápida

Después de una mutación correcta, ¿cuál es la forma recomendada de garantizar que la interfaz muestre datos actualizados?

Resumen

useMutation proporciona mutate, isPending y callbacks del ciclo de vida. Utilice onSuccess para invalidar las consultas relacionadas. Utilice mutateAsync en flujos basados en await. Utilice onMutate/onError para realizar actualizaciones optimistas con reversión.

A continuación

Siguiente lección: **Desplazamiento infinito y paginación con useInfiniteQuery** — obtendrá datos paginados y cargará más páginas sin interrupciones.

Preguntas frecuentes

¿La lección «Mutaciones con useMutation» es gratis?

Sí — el texto completo de «Mutaciones con useMutation» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Mutaciones con useMutation»?

Envíe datos a las API con useMutation, gestione los estados de carga y error e invalide las consultas cuando haya éxito. Practicas React Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar React Academy?

No se requiere experiencia previa. React Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Mutaciones con useMutation»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de React Academy?

Sí. Cada lección de React Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Configurar React Query y QueryClient
  2. Caché, stale time y actualización en segundo plano
  3. Mutaciones con useMutation
  4. Desplazamiento infinito y paginación con useInfiniteQuery
← Volver a React Academy