0Pricing
React Academy · Lekcja

useDeferredValue do opóźniania obsługi danych wejściowych

Opóźnianie ponownych renderowań wolniejszych części interfejsu przy zachowaniu szybkiej reakcji na dane wejściowe.

useDeferredValue do opóźniania obsługi danych wejściowych 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 useDeferredValue do opóźnienia ponownego renderowania kosztownych części interfejsu, zachowując płynne i responsywne działanie kontrolowanych pól wejściowych.

Czym jest useDeferredValue?

useDeferredValue przyjmuje wartość i zwraca jej odroczoną wersję. Podczas pilnych renderowań odroczona wartość pozostaje w tyle za bieżącą, umożliwiając React aktualizowanie interfejsu w dwóch etapach: szybko dla pola wejściowego i z opóźnieniem dla kosztownego wyniku.
const [query, setQuery] = useState('');
const deferredQuery = useDeferredValue(query);
// query updates immediately on keystroke
// deferredQuery updates when React has capacity

Zastosowanie do kosztownych komponentów

Do kosztownego komponentu należy przekazywać wartość odroczoną, a nie bieżącą. Kosztowny komponent renderuje się ponownie tylko wtedy, gdy zmieni się deferredQuery — podczas szybkiego wpisywania pozostaje ono w tyle za polem wejściowym.
function App() {
  const [q, setQ] = useState('');
  const dq = useDeferredValue(q);
  return (
    <>
      <input value={q} onChange={e => setQ(e.target.value)} />
      <HeavyList query={dq} /> {/* renders with deferred value */}
    </>
  );
}

Wyświetlanie wskaźnika nieaktualnej treści

Należy porównać bieżącą wartość z wartością odroczoną. Gdy się różnią, treść jest nieaktualna i można ją przyciemnić za pomocą opacity albo wyświetlić wskaźnik ładowania.
const isStale = q !== dq;
<div style={{ opacity: isStale ? 0.5 : 1 }}>
  <HeavyList query={dq} />
</div>

useDeferredValue a debounce

Debounce oparte na setTimeout zawsze wprowadza stałe opóźnienie, na przykład 300 ms, nawet na szybkich urządzeniach. useDeferredValue działa adaptacyjnie — na szybkich urządzeniach renderuje natychmiast, a na wolnych odracza renderowanie, aby zapobiec zacinaniu się interfejsu.

useDeferredValue a useTransition

Należy używać useTransition, gdy TO PAŃSTWO zarządzają setterem stanu i mogą opakować setState. useDeferredValue należy stosować, gdy wartość jest otrzymywana jako props lub z Context i nie można kontrolować momentu jej aktualizacji.
// You own the state: use useTransition
startTransition(() => setTab(newTab));

// You receive the value: use useDeferredValue
const deferredProp = useDeferredValue(props.searchQuery);

Łączenie z React.memo

Aby useDeferredValue skutecznie pomijało ponowne renderowanie, kosztowny komponent musi być opakowany w React.memo. Bez tego komponent renderuje się ponownie przy każdym renderowaniu rodzica, niezależnie od wartości odroczonej.
const HeavyList = React.memo(function({ query }) {
  // expensive rendering
  return <ul>{data.filter(q => ...).map(...)}</ul>;
});

Odroczona wartość podczas pierwszego renderowania

Podczas pierwszego renderowania odroczona wartość jest równa bieżącej — nie ma żadnego opóźnienia. Odroczenie zaczyna działać dopiero wtedy, gdy podczas ponownego renderowania bieżąca i odroczona wartość są różne.

Wiele odroczonych wartości

Można wielokrotnie wywoływać useDeferredValue dla różnych kosztownych części interfejsu, odraczając każdą z nich niezależnie.
const deferredA = useDeferredValue(valueA);
const deferredB = useDeferredValue(valueB);

Ograniczenia

useDeferredValue nie przyspiesza renderowania — jedynie je opóźnia. Jeśli kosztowne renderowanie trwa 500 ms, interfejs nadal będzie się zacinać. W przypadku naprawdę dużych list należy użyć wirtualizacji, na przykład react-virtual.

Szybkie sprawdzenie

Kiedy useDeferredValue zapewnia korzyść w porównaniu ze zwykłą wartością?

Podsumowanie

useDeferredValue zwraca opóźnioną wersję wartości. Należy przekazywać ją kosztownym komponentom opakowanym w React.memo. Gdy deferredValue !== value, należy wyświetlić wskaźnik nieaktualnej treści. W celu uzyskania adaptacyjnej wydajności lepiej używać tego rozwiązania niż debounce ze stałym opóźnieniem.

Następna lekcja

Następna lekcja: **Suspense for Data & Code Boundaries** — połączą Państwo Suspense z leniwym ładowaniem i bibliotekami danych, aby uzyskać przejrzyste stany ładowania.

Często zadawane pytania

Czy lekcja „useDeferredValue do opóźniania obsługi danych wejściowych” jest bezpłatna?

Tak — pełny tekst „useDeferredValue do opóźniania obsługi danych wejściowych” 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 „useDeferredValue do opóźniania obsługi danych wejściowych”?

Opóźnianie ponownych renderowań wolniejszych części interfejsu przy zachowaniu szybkiej reakcji na dane wejściowe. Ć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 „useDeferredValue do opóźniania obsługi danych wejściowych”?

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