Ręczne implementowanie optymistycznych aktualizacji
Stosować optymistyczny stan lokalnie, umieszczać mutację w kolejce oraz jawnie obsługiwać powodzenie i niepowodzenie
Ręczne implementowanie optymistycznych aktualizacji to bezpłatna lekcja React Academy na CoddyKit. To lekcja 2 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.
Stan przed mutacją
Ręczne optymistyczne aktualizacje zaczynają się od lokalnego stanu komponentu zainicjalizowanego danymi z serwera: const [items, setItems] = useState(serverItems). To ten lokalny stan jest renderowany i to jego wartości będą optymistycznie modyfikowane. Nie należy bezpośrednio modyfikować danych pobranych z serwera — należy zachować kontrolowaną lokalną kopię.
Etap optymistycznej aktualizacji
Gdy użytkownik wywoła mutację (klikając „Dodaj”, „Lubię to” lub „Usuń”), należy natychmiast zaktualizować stan przed wywołaniem API: setItems(prev => [...prev, newItem]). Interfejs od razu odzwierciedla zmianę. Dopiero po tej aktualizacji należy wysłać rzeczywiste żądanie sieciowe.
Zapisywanie poprzedniego stanu
Przed wykonaniem optymistycznej aktualizacji należy zapisać bieżący stan: const previousItems = items. Ta migawka jest celem wycofania zmian. Jeśli wywołanie API się nie powiedzie, należy przywrócić tę wartość. Należy przechowywać ją w zmiennej, a nie w stanie, ponieważ jest potrzebna tylko na czas trwania oczekującej mutacji.
Wykonywanie wywołania API
Po optymistycznej aktualizacji należy asynchronicznie wykonać wywołanie API. Należy umieścić je w bloku try/catch. Po powodzeniu można opcjonalnie ponownie pobrać dane, aby zsynchronizować je ze stanem serwera, albo zaufać optymistycznemu stanowi, jeśli serwer zwróciłby te same dane. W przypadku niepowodzenia należy użyć zapisanego poprzedniego stanu, aby wycofać zmianę.
Wycofanie zmian po niepowodzeniu
W bloku catch mutacji należy wykonać: setItems(previousItems). Spowoduje to przywrócenie stanu sprzed optymistycznej aktualizacji. Po wycofaniu zmian należy wyświetlić powiadomienie o błędzie. Użytkownicy rozumieją, że rzadkie błędy się zdarzają — nie akceptują natomiast cichej niespójności.
Wyświetlanie toastu z błędem po niepowodzeniu
Po wycofaniu zmian należy wyświetlić komunikat o błędzie: „Nie udało się zapisać zmian. Spróbuj ponownie.” wraz z przyciskiem „Ponów”, który ponownie wywołuje tę samą mutację. Daje to użytkownikom kontrolę nad sytuacją. Połączenie wycofania zmian, toastu z błędem i możliwości ponowienia pozwala sprawnie obsłużyć niepowodzenie bez blokowania całego interfejsu.
Problem tymczasowego identyfikatora
Podczas optymistycznego dodawania nowego elementu serwer nie przypisał mu jeszcze rzeczywistego identyfikatora. Należy utworzyć tymczasowy identyfikator dla optymistycznego elementu: const tempId = crypto.randomUUID(). Należy użyć go jako klucza elementu na liście. Po pomyślnej odpowiedzi API należy zastąpić tymczasowy identyfikator rzeczywistym identyfikatorem przypisanym przez serwer.
Uzgadnianie tymczasowych identyfikatorów
Po pomyślnym utworzeniu elementu serwer zwraca rzeczywisty identyfikator. Należy zaktualizować stan, zastępując tymczasowy element: setItems(prev => prev.map(item => item.id === tempId ? { ...item, id: serverResponse.id } : item)). Takie uzgodnienie gwarantuje, że kolejne operacje będą używać prawidłowego identyfikatora serwera.
Problem warunku wyścigu
Jeśli użytkownik wywoła dwie mutacje w krótkim odstępie czasu, odpowiedzi mogą nadejść w innej kolejności. Odpowiedź drugiej mutacji może nadejść przed odpowiedzią pierwszej, a wycofanie pierwszej zmiany może nadpisać poprawny stan wynikający z drugiej. Jest to warunek wyścigu charakterystyczny dla optymistycznego interfejsu użytkownika.
Szeregowanie mutacji w celu zapobiegania warunkom wyścigu
Jednym ze sposobów zapobiegania warunkom wyścigu jest szeregowanie mutacji za pomocą kolejki. Gdy mutacja jest w toku, należy wyłączyć przycisk uruchamiający, ustawiając stan isSubmitting na true. Kolejną mutację należy dopuścić dopiero po zakończeniu poprzedniej. Ogranicza to nieco responsywność, ale gwarantuje prawidłową kolejność zmian stanu.
Wzorzec optymistycznego usuwania
W przypadku operacji usuwania należy zapisać poprzednie elementy, odfiltrować usuwany element ze stanu, wywołać API usuwania i wycofać zmiany w razie niepowodzenia. Usuwanie jest prostsze niż tworzenie, ponieważ nie wymaga uzgadniania identyfikatorów, ale obowiązują te same zasady. Przed wykonaniem wywołania API warto rozważyć krótkie opóźnienie, podczas którego zostanie wyświetlona opcja „Cofnij”.
Tymczasowy identyfikator w optymistycznych aktualizacjach
Dlaczego elementy dodawane optymistycznie potrzebują tymczasowego identyfikatora?
Podsumowanie lekcji: ręczne optymistyczne aktualizacje
Wzorzec ręczny wygląda następująco: zapisz previousItems, wywołaj setItems z nowym stanem, wykonaj wywołanie API, a w razie niepowodzenia wycofaj zmiany za pomocą setItems(previousItems) i wyświetl błąd. W przypadku dodawania użyj crypto.randomUUID() jako tymczasowego identyfikatora, a po powodzeniu zsynchronizuj go z identyfikatorem serwera. Zapobiegaj warunkom wyścigu, wyłączając element uruchamiający na czas trwania mutacji. Wycofanie zmian, powiadomienie toast i możliwość ponowienia to standardowy sposób obsługi błędów.
Często zadawane pytania
Czy lekcja „Ręczne implementowanie optymistycznych aktualizacji” jest bezpłatna?
Tak — pełny tekst „Ręczne implementowanie optymistycznych aktualizacji” 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 „Ręczne implementowanie optymistycznych aktualizacji”?
Stosować optymistyczny stan lokalnie, umieszczać mutację w kolejce oraz jawnie obsługiwać powodzenie i niepowodzenie Ć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 2 z 4.
Ile czasu zajmuje lekcja „Ręczne implementowanie optymistycznych aktualizacji”?
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
- Czym jest optymistyczny interfejs i kiedy go używać
- Ręczne implementowanie optymistycznych aktualizacji
- Wycofywanie zmian po błędzie i rozwiązywanie konfliktów
- Wzorce optymistyczne z React Query i Zustand