React Academy · Lektion

Implementera en anpassad useDebounce-hook

Bygg en useDebounce-hook som fördröjer tillståndsuppdateringar tills användaren slutar skriva.

Lektion 2 av 413 steg

Implementera en anpassad useDebounce-hook är en gratis lektion i React Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för React Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i React Academy innehåller totalt 4 lektioner.

Hookens signatur

Hooken useDebounce tar emot ett värde och en fördröjning i millisekunder och returnerar en debounced-version av värdet: function useDebounce(value, delay). Det returnerade debouncedValue ligger efter det faktiska värdet och uppdateras först när den angivna fördröjningen har gått utan någon ny ändring.

Internt tillstånd för debouncedValue

Inuti hooken deklarerar du en tillståndsvariabel: const [debouncedValue, setDebouncedValue] = useState(value). Detta tillstånd innehåller det senast fastställda värdet. Det börjar med samma värde som det ursprungliga värdet och uppdateras först när debounce-timern körs. Komponenter som läser av debouncedValue ser en stabil och färdigbehandlad inmatning.

useEffect med setTimeout

Kärnlogiken finns i en useEffect: skapa en timer med setTimeout(() => setDebouncedValue(value), delay) och lagra dess ID. Effekten körs varje gång value eller delay ändras. Timern körs delay millisekunder efter den senaste ändringen och uppdaterar det debounced-tillståndet.

Rensa timern i cleanup

Rensningsfunktionen i useEffect anropar clearTimeout(timerId). När value ändras innan timern körs utför React cleanup-funktionen, vilket avbryter den väntande uppdateringen. Därefter schemaläggs en ny timer. Detta är den centrala mekanismen bakom debounce: snabba ändringar återställer timern gång på gång.

Effektens beroenden

Beroendearrayen för useEffect bör innehålla [value, delay]. Effekten körs på nytt varje gång indatavärdet ändras, så att en ny timer schemaläggs, och varje gång delay ändras, ifall anroparen justerar debounce-intervallet dynamiskt. Båda måste tas med för att undvika problem med inaktuella closures.

Använda hooken i en komponent

Användningen är enkel: const debouncedSearch = useDebounce(searchInput, 300). En separat useEffect med [debouncedSearch] som beroende gör API-anropet. Indatatillståndet (searchInput) uppdateras direkt, så att fältet förblir responsivt; det är bara API-anropet som väntar på debounce.

Specialfall med omedelbart första anrop

Som standard körs standardimplementationen endast vid trailing edge. För ett "omedelbart" läge, där funktionen anropas vid den första utlösningen men efterföljande anrop debouncas, behöver du en ref för att hålla reda på om anropet har gjorts och återställa den efter timeouten. Detta är mer komplext men användbart för submit-knappar.

Generisk typparameter i TypeScript

Gör hooken generisk för typsäkerhet: function useDebounce(value: T, delay: number): T. Då kan TypeScript härleda typen för debouncedValue från typen för value. Den generiska parametern T förs automatiskt vidare genom det interna tillståndet och returtypen.

Vanlig bugg: cleanup saknas

Ett vanligt misstag är att glömma att returnera cleanup-funktionen från useEffect. Utan cleanup skapar varje värdeändring en ny timer utan att avbryta den gamla. Resultatet blir att flera timers körs och att setDebouncedValue anropas flera gånger med inaktuella värden, vilket helt motverkar debounce.

Jämförelse med useRef-baserade metoder

Ett alternativ är att lagra själva debounce-funktionen i en useRef med hjälp av lodash. Till skillnad från den tillståndsbaserade metoden debouncar ref-metoden callbacks (funktioner) i stället för värden. Använd den tillståndsbaserade hooken när du behöver ett härlett värde och callback-metoden när du behöver debounca en händelsehanterare.

Verifiera det faktiska beteendet

Verifiera att hooken fungerar genom att lägga till en console-logg i timeout-callbacken och titta i webbläsarens konsol medan du skriver snabbt. Du bör se en logg per "stopp"-händelse, inte en per tangenttryckning. Antalet loggar bör vara mycket mindre än antalet tangenttryckningar när du skriver snabbt.

Cleanup i useDebounce-useEffect

Varför måste useEffect i useDebounce returnera en cleanup-funktion som anropar clearTimeout?

Lektionssammanfattning: useDebounce-hooken

Hooken useDebounce(value, delay) innehåller ett debounced-tillstånd som uppdateras först efter delay ms av tystnad. Dess useEffect startar en timeout och rensar den i cleanup för att avbryta inaktuella timers. Använd det debounced-värdet som beroende i effekter som hämtar data från API:er. Lägg till en generisk TypeScript-parameter för fullständig typsäkerhet.

Gratis att börja

Lär dig React med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
88
Lektioner
324

Vanliga frågor

Är lektionen ”Implementera en anpassad useDebounce-hook” gratis?

Ja – hela texten till ”Implementera en anpassad useDebounce-hook” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i React Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i React Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Implementera en anpassad useDebounce-hook”?

Bygg en useDebounce-hook som fördröjer tillståndsuppdateringar tills användaren slutar skriva. Ni övar på React Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig React Academy?

Du behöver inga förkunskaper. Utbildningen i React Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Implementera en anpassad useDebounce-hook”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här React Academy-lektionen?

Ja. Varje React Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Varför debounce och throttle är viktiga i gränssnitt
  2. Implementera en anpassad useDebounce-hook
  3. Implementera en anpassad useThrottle-hook
  4. Praktiska tillämpningar: sökning, skrollning och storleksändring
← Tillbaka till React Academy