0Pricing
React Academy · Lezione

Mutation con useMutation

Invii dati alle API con useMutation, gestisca gli stati di caricamento ed errore e invalidi le query in caso di successo.

Mutation con useMutation è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento React Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso React Academy include 4 lezioni in totale.

Benvenuto

In questa lezione utilizzerà useMutation per inviare dati alle API, gestirà gli stati di caricamento ed errore e invaliderà le query obsolete dopo le mutazioni completate correttamente.

Nozioni di base su useMutation

Chiami useMutation con una mutationFn. Restituisce una funzione mutate e proprietà di stato. Chiami mutate() per attivare l'operazione.
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()),
});

Chiamare mutate

Chiami `mutate(variables)` da un gestore di eventi. Le variabili vengono passate a mutationFn come primo argomento.
<button onClick={() => mutate({ title: 'New Post' })}>
  Create Post
</button>

Callback: onSuccess, onError, onSettled

Aggiunga le opzioni di callback a useMutation: onSuccess viene eseguita dopo una mutazione completata correttamente, onError in caso di errore e onSettled in entrambi i casi, come finally.
useMutation({
  mutationFn: createPost,
  onSuccess: (data) => {
    console.log('Created:', data);
    navigate('/posts/' + data.id);
  },
  onError: (error) => {
    toast.error(error.message);
  },
})

Invalidare le query dopo una mutazione

Dopo una mutazione completata correttamente, invalidi le query correlate affinché React Query recuperi dati aggiornati. Utilizzi queryClient.invalidateQueries in onSuccess.
import { useQueryClient } from '@tanstack/react-query';

const queryClient = useQueryClient();

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

mutateAsync per la sintassi await

Utilizzi `mutateAsync` invece di `mutate` per attendere il completamento della mutazione e gestirla 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);
  }
}

Disabilitare l'invio durante una mutazione

Utilizzi `isPending`, o `isLoading`, per disabilitare il pulsante di invio mentre la mutazione è in corso.
const { mutate, isPending } = useMutation({ mutationFn: saveItem });

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

Aggiornamenti ottimistici con onMutate

Utilizzi onMutate per aggiornare ottimisticamente la cache prima che il server risponda. Esegua il ripristino in onError utilizzando il contesto restituito da 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'] }),
})

Reimpostare lo stato della mutazione

Chiami `reset()` da useMutation per cancellare lo stato della mutazione, inclusi dati, errore e stato corrente. È utile dopo aver abbandonato una pagina o svuotato un modulo.
const { mutate, isError, reset } = useMutation({ /* ... */ });

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

Più mutazioni in parallelo

Chiami mutate più volte in parallelo: ogni invocazione viene monitorata indipendentemente. Utilizzi mutateAsync con Promise.all per eseguire mutazioni parallele.
await Promise.all([
  mutateAsync({ id: 1, title: 'First' }),
  mutateAsync({ id: 2, title: 'Second' }),
]);

Verifica rapida

Dopo una mutazione completata correttamente, qual è il modo consigliato per assicurarsi che l'interfaccia mostri dati aggiornati?

Riepilogo

useMutation espone mutate, isPending e i callback del ciclo di vita. Utilizzi onSuccess per invalidare le query correlate. Utilizzi mutateAsync nei flussi basati su await. Utilizzi onMutate/onError per gli aggiornamenti ottimistici con ripristino.

Prossimo argomento

Prossima lezione: **Infinite Scroll & Pagination with useInfiniteQuery** — recupererà dati paginati e caricherà nuove pagine senza interruzioni.

Domande Frequenti

La lezione «Mutation con useMutation» è gratuita?

Sì — il testo completo di «Mutation con useMutation» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso React Academy, passa a CoddyKit PRO. Il corso React Academy include 4 lezioni in totale.

Cosa imparerò in «Mutation con useMutation»?

Invii dati alle API con useMutation, gestisca gli stati di caricamento ed errore e invalidi le query in caso di successo. Eserciti React Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare React Academy?

Non è richiesta alcuna esperienza precedente. React Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Mutation con useMutation»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione React Academy?

Sì. Ogni lezione React Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Configurazione di React Query e QueryClient
  2. Caching, stale time e refetch in background
  3. Mutation con useMutation
  4. Scroll infinito e paginazione con useInfiniteQuery
← Torna a React Academy