0Pricing
React Academy · Lekcja

Mutacje i optymistyczne aktualizacje z SWR

Używać mutate() i useSWRMutation do operacji zapisu z optymistycznym interfejsem i automatycznym wycofywaniem zmian

Mutacje i optymistyczne aktualizacje z SWR 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.

mutate: rewalidacja według klucza

Globalna funkcja mutate z swr umożliwia uruchomienie rewalidacji dla dowolnego klucza pamięci podręcznej z dowolnego miejsca w aplikacji: mutate('/api/user') powoduje ponowne pobranie danych przez wszystkie hooki useSWR('/api/user').

Należy ją zaimportować za pomocą: import { mutate } from 'swr'. Jest to przydatne do unieważniania danych po akcji na serwerze wykonanej poza komponentem, który ma bezpośredni dostęp do powiązanej funkcji mutate.

mutate z danymi: aktualizacja pamięci podręcznej bez ponownego pobierania

Przekazanie danych jako drugiego argumentu mutate: mutate('/api/user', updatedUser) natychmiast ustawia pamięć podręczną na updatedUser bez wykonywania żądania sieciowego. Nazywa się to czasem lokalną mutacją.

Należy dodać { revalidate: false } jako trzeci argument, aby uniemożliwić SWR ponowne pobranie danych po optymistycznej aktualizacji.

useSWRMutation: jawne uruchamianie

useSWRMutation służy do mutacji inicjowanych przez użytkownika (przesyłania formularzy, kliknięć przycisków), w przeciwieństwie do automatycznego pobierania. Nie wykonuje się podczas montowania, lecz dopiero po wywołaniu trigger().

Należy zaimportować z swr/mutation: const { trigger, isMutating, data, error } = useSWRMutation('/api/post', sendRequest).

Sygnatura fetchera useSWRMutation

Fetcher dla useSWRMutation otrzymuje (key, { arg}), gdzie arg jest wartością przekazaną do trigger(). Przykład: async (url, { arg: newPost }) => fetch(url, { method: 'POST', body: JSON.stringify(newPost) }).

Należy wywołać trigger({ title: 'New Post', content: '...' }), aby uruchomić mutację z danymi wpisu jako wartością arg.

isMutating State

isMutating z useSWRMutation ma wartość true, gdy żądanie mutacji jest w toku. Można użyć tej właściwości do wyłączenia przycisków przesyłania i wyświetlenia wskaźników ładowania na czas żądania, zapobiegając wielokrotnemu przesłaniu.

Zastępuje ona ręcznie zarządzaną zmienną stanu isSubmitting, którą w przeciwnym razie należałoby obsługiwać za pomocą useState.

Optymistyczne aktualizacje — wyjaśnienie

Optymistyczna aktualizacja natychmiast stosuje w interfejsie oczekiwany rezultat, zanim serwer potwierdzi zmianę. Jeśli operacja na serwerze się powiedzie, nie trzeba robić nic więcej. Jeśli się nie powiedzie, aktualizacja zostaje wycofana do poprzedniego stanu.

Ten wzorzec sprawia, że interfejsy wydają się działać natychmiast: przycisk polubienia wygląda na kliknięty od razu, bez oczekiwania na odpowiedź POST.

Optymistyczne aktualizacje z SWR

Proszę użyć mutate(key, newData, { optimisticData: optimisticValue, rollbackOnError: true }). SWR natychmiast ustawia w pamięci podręcznej wartość optimisticValue, wysyła żądanie ponownej walidacji i przywraca poprzednią wartość, jeśli żądanie zakończy się wyjątkiem.

Opcja rollbackOnError: true jest niezbędna dla poprawności działania: bez niej nieudana mutacja pozostawi w pamięci podręcznej nieaktualne optymistyczne dane.

Automatyczne wycofanie po błędzie

Gdy ustawiono rollbackOnError: true, a mutacja zostanie odrzucona, SWR automatycznie przywraca pamięć podręczną do migawki wykonanej przed optymistyczną aktualizacją. Nie trzeba pisać ręcznie kodu wycofującego zmianę.

Dodatkowo należy ustawić populateCache: false, jeśli treść odpowiedzi mutacji nie odpowiada kształtowi danych używanemu przez useSWR. Zapobiega to nieprawidłowej aktualizacji pamięci podręcznej przez odpowiedź.

Mutate powiązane z kluczem a mutate globalne

useSWR zwraca mutate powiązane z kluczem: const { data, mutate } = useSWR('/api/user', fetcher). To mutate automatycznie używa klucza '/api/user'; nie trzeba przekazywać go ponownie.

Mutate powiązanego z kluczem należy używać wewnątrz komponentów odpowiedzialnych za wyświetlanie danych. Mutate globalnego z swr należy używać, gdy trzeba unieważnić klucz z niepowiązanego komponentu lub funkcji narzędziowej.

Porównanie z mutacjami React Query

useMutation w React Query ma podobny wzorzec trigger/isMutating. Najważniejsze różnice: idiomatycznym wzorcem unieważniania pamięci podręcznej w React Query jest wywołanie onSuccess z queryClient.invalidateQueries. SWR używa bezpośrednio funkcji mutate do aktualizowania pamięci podręcznej.

Oba rozwiązania obsługują optymistyczne aktualizacje i wycofywanie zmian, ale kształt API jest inny. Zespoły biegle posługujące się jednym z nich mogą szybko nauczyć się drugiego.

Strategia pamięci podręcznej po mutacji

Po pomyślnej mutacji są trzy możliwości: ponownie pobrać dane, wywołując mutate(key), zaktualizować pamięć podręczną treścią odpowiedzi (jeśli API zwraca zaktualizowany zasób) albo połączyć oba podejścia, stosując optymistyczne aktualizacje wraz z ponowną walidacją.

W przypadku mutacji listy, na przykład dodania elementu, należy ręcznie zaktualizować pamięć podręczną, dopisując nowy element, a następnie przeprowadzić ponowną walidację w celu potwierdzenia stanu na serwerze. Pozwala to uniknąć ponownego pobierania całej listy przy zachowaniu spójności danych.

Wycofywanie optymistycznej aktualizacji

Jaką opcję należy ustawić w mutate z SWR, aby automatycznie wycofać optymistyczną aktualizację w przypadku błędu?

Podsumowanie lekcji

Globalne mutate(key) uruchamia ponowną walidację, a mutate(key, data) aktualizuje pamięć podręczną bez ponownego pobierania danych. useSWRMutation obsługuje jawnie wywoływane przez użytkownika mutacje za pomocą trigger(), stanu isMutating i obsługi extraArg. Optymistyczne aktualizacje z optimisticData i rollbackOnError: true sprawiają, że interfejsy wydają się działać natychmiast, zapewniając automatyczne odzyskiwanie po błędach.

Mutate powiązane z kluczem, zwracane przez useSWR, używa własnego klucza, natomiast globalne mutate z swr działa w dowolnym miejscu.

Często zadawane pytania

Czy lekcja „Mutacje i optymistyczne aktualizacje z SWR” jest bezpłatna?

Tak — pełny tekst „Mutacje i optymistyczne aktualizacje z SWR” 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 i optymistyczne aktualizacje z SWR”?

Używać mutate() i useSWRMutation do operacji zapisu z optymistycznym interfejsem i automatycznym wycofywaniem zmian Ć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 i optymistyczne aktualizacje z SWR”?

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. Podstawowe pojęcia SWR: stale-while-revalidate
  2. Hook useSWR: pobieranie, ładowanie i błędy
  3. Mutacje i optymistyczne aktualizacje z SWR
  4. SWR a React Query: wybór właściwego narzędzia
← Powrót do React Academy