0Pricing
React Academy · Lekcja

Mutacje z useMutation

Wysyłanie danych do API za pomocą useMutation, obsługa stanów ładowania i błędów oraz unieważnianie zapytań po pomyślnym zakończeniu.

Mutacje z useMutation to bezpłatna lekcja React Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.

Wprowadzenie

W tej lekcji użyją Państwo useMutation do wysyłania danych do API, obsługi stanów ładowania i błędu oraz unieważniania nieaktualnych zapytań po pomyślnym wykonaniu operacji modyfikującej dane.

Podstawy useMutation

Wywołaj useMutation z funkcją mutationFn. Zwraca ona funkcję mutate oraz właściwości stanu. Wywołaj mutate(), aby uruchomić operację.
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()),
});

Wywoływanie mutate

Wywołaj `mutate(variables)` z procedury obsługi zdarzenia. Zmienne zostaną przekazane do mutationFn jako pierwszy argument.
<button onClick={() => mutate({ title: 'New Post' })}>
  Create Post
</button>

Wywołania zwrotne: onSuccess, onError, onSettled

Dodaj opcje wywołań zwrotnych do useMutation: onSuccess jest wykonywane po pomyślnym wykonaniu operacji, onError po niepowodzeniu, a onSettled w obu przypadkach (podobnie jak finally).
useMutation({
  mutationFn: createPost,
  onSuccess: (data) => {
    console.log('Created:', data);
    navigate('/posts/' + data.id);
  },
  onError: (error) => {
    toast.error(error.message);
  },
})

Unieważnianie zapytań po operacji modyfikującej dane

Po pomyślnym wykonaniu operacji modyfikującej dane unieważnij powiązane zapytania, aby React Query ponownie pobrał aktualne dane. Użyj queryClient.invalidateQueries w onSuccess.
import { useQueryClient } from '@tanstack/react-query';

const queryClient = useQueryClient();

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

mutateAsync i składnia await

Użyj `mutateAsync` zamiast `mutate`, aby oczekiwać na zakończenie operacji i obsłużyć ją za pomocą 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);
  }
}

Wyłączanie wysyłania podczas operacji

Użyj `isPending` (lub `isLoading`), aby wyłączyć przycisk wysyłania, gdy operacja jest w toku.
const { mutate, isPending } = useMutation({ mutationFn: saveItem });

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

Optymistyczne aktualizacje za pomocą onMutate

Użyj onMutate, aby optymistycznie zaktualizować pamięć podręczną przed odpowiedzią serwera. W onError wycofaj zmianę, korzystając z kontekstu zwróconego przez 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'] }),
})

Resetowanie stanu operacji

Wywołaj `reset()` z useMutation, aby wyczyścić stan operacji (dane, błąd i status). Jest to przydatne po przejściu do innego widoku lub wyczyszczeniu formularza.
const { mutate, isError, reset } = useMutation({ /* ... */ });

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

Wiele operacji wykonywanych równolegle

Wywołuj mutate wiele razy równolegle — każde wywołanie jest śledzone niezależnie. Użyj mutateAsync z Promise.all w przypadku operacji równoległych.
await Promise.all([
  mutateAsync({ id: 1, title: 'First' }),
  mutateAsync({ id: 2, title: 'Second' }),
]);

Szybkie sprawdzenie

Jaki jest zalecany sposób zapewnienia, że interfejs wyświetla aktualne dane po pomyślnym wykonaniu operacji modyfikującej dane?

Podsumowanie

useMutation udostępnia mutate, isPending oraz wywołania zwrotne cyklu życia. Użyj onSuccess do unieważniania powiązanych zapytań. Użyj mutateAsync w przepływach opartych na await. Użyj onMutate/onError do optymistycznych aktualizacji z możliwością wycofania zmian.

Następny temat

Następna lekcja: **Infinite Scroll & Pagination with useInfiniteQuery** — będą Państwo pobierać dane podzielone na strony i płynnie ładować kolejne strony.

Często zadawane pytania

Czy lekcja „Mutacje z useMutation” jest bezpłatna?

Tak — pełny tekst „Mutacje z useMutation” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Mutacje z useMutation”?

Wysyłanie danych do API za pomocą useMutation, obsługa stanów ładowania i błędów oraz unieważnianie zapytań po pomyślnym zakończeniu. Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć React Academy?

Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Mutacje z useMutation”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?

Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Konfiguracja React Query i QueryClient
  2. Buforowanie, czas nieaktualności i odświeżanie w tle
  3. Mutacje z useMutation
  4. Nieskończone przewijanie i paginacja z useInfiniteQuery
← Powrót do React Academy