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