React Academy · Lektion

useDeferredValue til debounce af input

Forsink genrenderinger af langsomme dele af brugerfladen, mens inputfeltet forbliver hurtigt og responsivt.

Lektion 3 af 413 trin

useDeferredValue til debounce af input er en gratis React Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i React Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. React Academy-kurset indeholder 4 lektioner i alt.

Velkommen

I denne lektion bruger du useDeferredValue til at forsinke gengivelsen af tunge dele af brugerfladen, mens kontrollerede inputfelter forbliver hurtige og responsive.

Hvad er useDeferredValue?

useDeferredValue modtager en værdi og returnerer en udskudt version af den. Den udskudte værdi sakker bagefter den aktuelle værdi under hastende gengivelser, så React kan opdatere brugerfladen i to trin: hurtigt for indtastningen og udskudt for det tunge resultat.
const [query, setQuery] = useState('');
const deferredQuery = useDeferredValue(query);
// query updates immediately on keystroke
// deferredQuery updates when React has capacity

Anvendelse på tunge komponenter

Videregiv den udskudte værdi, ikke den aktuelle værdi, til den tunge komponent. Den tunge komponent rendere kun igen, når deferredQuery ændrer sig — og ved hurtig indtastning sakker den bagefter inputfeltet.
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 */}
    </>
  );
}

Visning af indikator for forældet indhold

Sammenlign den aktuelle værdi med den udskudte værdi. Når de er forskellige, er indholdet forældet, og du kan gøre det svagere med opacitet eller vise en indlæsningsindikator.
const isStale = q !== dq;
<div style={{ opacity: isStale ? 0.5 : 1 }}>
  <HeavyList query={dq} />
</div>

useDeferredValue sammenlignet med debounce

En setTimeout-baseret debounce indfører altid en fast forsinkelse, f.eks. 300 ms, selv på hurtige maskiner. useDeferredValue tilpasser sig — på hurtige enheder rendere den med det samme, mens den på langsomme enheder udsætter gengivelsen for at forhindre hakken.

useDeferredValue sammenlignet med useTransition

Brug useTransition, når du SELV ejer tilstandsopdateringen, så du kan pakke setState ind. Brug useDeferredValue, når du modtager en værdi som en prop eller fra en Context og ikke kan styre, hvornår den opdateres.
// You own the state: use useTransition
startTransition(() => setTab(newTab));

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

Kombination med React.memo

For at useDeferredValue effektivt kan springe gengivelser over, skal den tunge komponent pakkes ind i React.memo. Uden det rendere komponenten igen, hver gang den overordnede komponent rendere, uanset den udskudte værdi.
const HeavyList = React.memo(function({ query }) {
  // expensive rendering
  return <ul>{data.filter(q => ...).map(...)}</ul>;
});

Den udskudte værdi ved den første gengivelse

Ved den første gengivelse er den udskudte værdi lig med den aktuelle værdi — der er ingen forsinkelse. Udsættelsen træder først i kraft, når både den aktuelle og den udskudte værdi er forskellige under en ny gengivelse.

Flere udskudte værdier

Du kan kalde useDeferredValue flere gange for forskellige tunge dele af brugerfladen, og hver værdi udsættes uafhængigt af de andre.
const deferredA = useDeferredValue(valueA);
const deferredB = useDeferredValue(valueB);

Begrænsninger

useDeferredValue gør ikke gengivelsen hurtigere — den forsinker den blot. Hvis den tunge gengivelse tager 500 ms, vil brugerfladen stadig hakke. Kombinér med virtualisering (react-virtual) til virkelig store lister.

Hurtig kontrol

Hvornår giver useDeferredValue en fordel sammenlignet med en almindelig værdi?

Opsummering

useDeferredValue returnerer en forsinket version af en værdi. Videregiv den til tunge komponenter, der er pakket ind i React.memo. Vis en indikator for forældet indhold, når deferredValue !== value. Foretræk det frem for debounce med fast forsinkelse, hvis du ønsker tilpasset ydeevne.

Næste lektion

Næste lektion: **Suspense til data- og kodegrænser** — du kombinerer Suspense med lazy loading og databiblioteker for at skabe tydelige indlæsningstilstande.
Gratis at komme i gang

Lær React med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
88
Lektioner
324

Ofte stillede spørgsmål

Er lektionen “useDeferredValue til debounce af input” gratis?

Ja — hele teksten til “useDeferredValue til debounce af input” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af React Academy-kurset, skal du opgradere til CoddyKit PRO. React Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “useDeferredValue til debounce af input”?

Forsink genrenderinger af langsomme dele af brugerfladen, mens inputfeltet forbliver hurtigt og responsivt. Du øver dig i React Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på React Academy?

Der kræves ingen tidligere erfaring. React Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “useDeferredValue til debounce af input”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne React Academy-lektion?

Ja. Alle React Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Kapløbsbetingelser og oprydning i effekter
  2. useTransition til ikke-blokerende UI-opdateringer
  3. useDeferredValue til debounce af input
  4. Suspense til data- og kodegrænser
← Tilbage til React Academy