0Pricing
React Academy · Lekcja

useTransition do nieblokujących aktualizacji interfejsu

Opakowanie kosztownych aktualizacji stanu w startTransition, aby interfejs pozostał responsywny.

useTransition do nieblokujących aktualizacji interfejsu 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.

Wprowadzenie

W tej lekcji użyją Państwo hooka useTransition do oznaczania kosztownych aktualizacji stanu jako niepilnych, dzięki czemu interfejs pozostanie responsywny podczas renderowania obciążającego procesor w tle.

Problem blokującej aktualizacji

Podczas wpisywania tekstu w polu wyszukiwania filtrującym dużą listę React musi ponownie renderować całą przefiltrowaną listę po każdym naciśnięciu klawisza. Blokuje to natychmiastową aktualizację pola i sprawia, że interfejs wydaje się powolny.

Tryb współbieżny React

React 18 wprowadził renderowanie współbieżne: React może rozpocząć renderowanie aktualizacji stanu, wstrzymać je i nadać priorytet pilniejszym aktualizacjom, takim jak wpisywanie tekstu. useTransition to hook pozwalający sklasyfikować aktualizacje jako przejścia o niskim priorytecie.

Podstawy useTransition

useTransition zwraca `[isPending, startTransition]`. Niepilną aktualizację stanu należy umieścić wewnątrz `startTransition()`. React nada priorytet innym aktualizacjom, takim jak kontrolowane pole wejściowe, przed tym przejściem.
const [isPending, startTransition] = useTransition();

const handleChange = (e) => {
  setInputValue(e.target.value); // urgent: update input immediately
  startTransition(() => {
    setFilteredList(filter(e.target.value)); // non-urgent
  });
};

isPending dla interfejsu ładowania

Podczas przetwarzania przejścia `isPending` ma wartość `true`. Można użyć tej wartości do wyświetlenia wskaźnika ładowania lub przyciemnienia nieaktualnej listy wyników, informując użytkowników, że aktualizacja jest w toku.
return (
  <>
    <input value={inputValue} onChange={handleChange} />
    {isPending && <Spinner />}
    <ResultList items={filteredList} />
  </>
);

Co umieszczać w startTransition

W startTransition należy umieszczać wyłącznie aktualizacje stanu — nie operacje asynchroniczne. Należy opakować tę aktualizację stanu, która uruchamia kosztowne renderowanie.
// Correct
startTransition(() => setTab('heavy'));

// Wrong — async work outside React state
startTransition(async () => { await fetch(...); }); // not supported

startTransition bez hooka

Jeśli `isPending` nie jest potrzebne, można bezpośrednio zaimportować i wywołać `startTransition` z React, bez używania hooka.
import { startTransition } from 'react';

startTransition(() => setQuery(newValue));

Przykład przełączania kart

Częsty przypadek użycia: kliknięcie karty przełącza ciężki komponent. Należy opakować zmianę karty w startTransition, aby wskaźnik aktywnej karty zaktualizował się natychmiast, podczas gdy ciężki komponent będzie renderowany w tle.
const [tab, setTab] = useState('posts');
const [isPending, startTransition] = useTransition();

const selectTab = (t) =>
  startTransition(() => setTab(t));

useTransition a useDeferredValue

useTransition służy do sytuacji, w których TO PAŃSTWO zarządzają aktualizacją stanu, czyli wywołują setState. useDeferredValue służy do sytuacji, w których otrzymują Państwo props lub wartość, której nie można bezpośrednio opóźnić — opóźniana jest sama wartość.

To nie zastępuje optymalizacji

startTransition nie przyspiesza renderowania — jedynie je odracza. Jeśli renderowanie komponentu trwa 500 ms, nadal będzie trwać 500 ms. W przypadku naprawdę powolnych list należy połączyć go z React.memo lub wirtualizacją.

Szybkie sprawdzenie

Co oznacza isPending zwracane przez useTransition?

Podsumowanie

useTransition pozwala klasyfikować aktualizacje stanu jako niepilne przejścia. Pilne aktualizacje, takie jak wpisywanie tekstu, są renderowane natychmiast, a przejścia — gdy React ma na to zasoby. isPending służy do wyświetlania informacji o ładowaniu.

Następna lekcja

Następna lekcja: **useDeferredValue for Input Debouncing** — opóźnią Państwo ponowne renderowanie powolnych części interfejsu, zachowując płynne działanie pola wejściowego.

Często zadawane pytania

Czy lekcja „useTransition do nieblokujących aktualizacji interfejsu” jest bezpłatna?

Tak — pełny tekst „useTransition do nieblokujących aktualizacji interfejsu” 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 „useTransition do nieblokujących aktualizacji interfejsu”?

Opakowanie kosztownych aktualizacji stanu w startTransition, aby interfejs pozostał responsywny. Ć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 „useTransition do nieblokujących aktualizacji interfejsu”?

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. Warunki wyścigu i czyszczenie efektów
  2. useTransition do nieblokujących aktualizacji interfejsu
  3. useDeferredValue do opóźniania obsługi danych wejściowych
  4. Suspense dla granic danych i kodu
← Powrót do React Academy