Implementare un custom hook useDebounce
Creare un hook useDebounce che ritardi gli aggiornamenti dello stato finché l'utente non smette di digitare
Implementare un custom hook useDebounce è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento React Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso React Academy include 4 lezioni in totale.
Firma dell'hook
L'hook useDebounce accetta un valore e un ritardo espresso in millisecondi e restituisce una versione con debounce di quel valore: function useDebounce(value, delay). Il debouncedValue restituito rimane indietro rispetto al valore reale e viene aggiornato solo dopo che è trascorso il ritardo specificato senza ulteriori modifiche.
Stato interno di debouncedValue
All'interno dell'hook, dichiari una variabile di stato: const [debouncedValue, setDebouncedValue] = useState(value). Questo stato contiene l'ultimo valore confermato. Inizia con lo stesso valore iniziale e viene aggiornato solo dopo l'attivazione del timer del debounce. I componenti che leggono debouncedValue ricevono un input stabile e consolidato.
useEffect con setTimeout
La logica principale risiede in un useEffect: crei un timer con setTimeout(() => setDebouncedValue(value), delay) e ne memorizzi l'ID. L'effetto viene eseguito ogni volta che cambiano value o delay. Il timer scatta delay millisecondi dopo l'ultima modifica e aggiorna lo stato con debounce.
Cancellazione del timer nella pulizia
La funzione di pulizia di useEffect chiama clearTimeout(timerId). Quando value cambia prima che il timer scatti, React esegue la pulizia annullando l'aggiornamento in attesa. Viene quindi pianificato un nuovo timer. Questo è il meccanismo fondamentale alla base del debounce: le modifiche rapide continuano a reimpostare il timer.
Le dipendenze dell'effetto
L'array delle dipendenze di useEffect dovrebbe contenere [value, delay]. L'effetto viene eseguito nuovamente ogni volta che cambia il valore di input, così da pianificare un nuovo timer, e ogni volta che cambia il ritardo, nel caso in cui il chiamante modifichi dinamicamente l'intervallo del debounce. È necessario includerli entrambi per evitare problemi causati da closure obsolete.
Utilizzo dell'hook in un componente
L'utilizzo è semplice: const debouncedSearch = useDebounce(searchInput, 300). Un useEffect separato, con [debouncedSearch] come dipendenza, effettua la chiamata API. Lo stato di input (searchInput) viene aggiornato immediatamente, mantenendo reattivo il campo; solo la chiamata API attende il debounce.
Caso limite della prima chiamata immediata
Per impostazione predefinita, l'implementazione standard viene eseguita solo sul trailing edge. Per una modalità "immediata", che chiami la funzione al primo trigger ma applichi il debounce alle chiamate successive, è necessario un ref per tenere traccia dell'avvenuta chiamata e reimpostarlo dopo il timeout. È più complesso, ma utile per i pulsanti di invio.
Parametro di tipo generico TypeScript
Renda l'hook generico per garantire la sicurezza dei tipi: function useDebounce(value: T, delay: number): T. In questo modo TypeScript può dedurre il tipo di debouncedValue dal tipo di value. Il parametro generico T viene propagato automaticamente attraverso lo stato interno e il tipo restituito.
Errore comune: pulizia mancante
Un errore frequente consiste nel dimenticare di restituire la funzione di pulizia da useEffect. Senza la pulizia, ogni modifica del valore crea un nuovo timer, ma non annulla mai quello precedente. Di conseguenza, vengono attivati più timer e setDebouncedValue viene chiamato più volte con valori obsoleti, annullando di fatto il debounce.
Confronto con gli approcci basati su useRef
Un'alternativa consiste nel memorizzare la funzione di debounce in un useRef utilizzando lodash. A differenza dell'approccio basato sullo stato, quello basato sul ref applica il debounce alle callback (funzioni) anziché ai valori. Utilizzi l'hook basato sullo stato quando le serve un valore derivato; utilizzi l'approccio basato sulla callback quando deve applicare il debounce a un gestore di eventi.
Verifica del comportamento effettivo
Verifichi il funzionamento dell'hook aggiungendo un log della console all'interno della callback del timeout e osservando la console del browser mentre digita rapidamente. Dovrebbe visualizzare un log ogni volta che smette di digitare, non uno per ogni pressione di un tasto. Durante la digitazione rapida, il numero di log dovrebbe essere molto inferiore al numero di pressioni dei tasti.
Pulizia di useEffect in useDebounce
Perché useEffect in useDebounce deve restituire una funzione di pulizia che chiama clearTimeout?
Riepilogo della lezione: hook useDebounce
L'hook useDebounce(value, delay) mantiene uno stato con debounce, aggiornato solo dopo delay ms di silenzio. Il suo useEffect imposta un timeout e lo cancella durante la pulizia per annullare i timer obsoleti. Utilizzi il valore con debounce come dipendenza degli effetti che recuperano dati dalle API. Aggiunga un generico TypeScript per garantire la completa sicurezza dei tipi.
Domande Frequenti
La lezione «Implementare un custom hook useDebounce» è gratuita?
Sì — il testo completo di «Implementare un custom hook useDebounce» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso React Academy, passa a CoddyKit PRO. Il corso React Academy include 4 lezioni in totale.
Cosa imparerò in «Implementare un custom hook useDebounce»?
Creare un hook useDebounce che ritardi gli aggiornamenti dello stato finché l'utente non smette di digitare Eserciti React Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare React Academy?
Non è richiesta alcuna esperienza precedente. React Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Implementare un custom hook useDebounce»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione React Academy?
Sì. Ogni lezione React Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Perché debounce e throttle sono importanti nelle UI
- Implementare un custom hook useDebounce
- Implementare un custom hook useThrottle
- Applicazioni pratiche: ricerca, scorrimento, ridimensionamento