Implementare un custom hook useThrottle
Creare un hook useThrottle che limiti la frequenza di aggiornamento di un valore durante eventi rapidi come lo scorrimento
Implementare un custom hook useThrottle è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 3 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.
Il throttle è più complesso del debounce
Il debounce si limita a reimpostare un timer a ogni evento. Il throttle deve tenere attivamente traccia del momento dell'ultima esecuzione e stabilire se è trascorso tempo sufficiente per eseguirne un'altra. È necessario conservare un timestamp tra una renderizzazione e l'altra, rendendo l'implementazione leggermente più complessa rispetto al debounce.
Utilizzo di useRef per lastRunTime
Il timestamp dell'ultima esecuzione deve persistere tra le renderizzazioni senza provocare a sua volta nuove renderizzazioni, quindi useRef è lo strumento più adatto. Memorizzi il timestamp come const lastRunTime = useRef(Date.now()). A differenza dello stato, l'aggiornamento di un ref non provoca una nuova renderizzazione, perciò la logica del throttle viene eseguita in modo efficiente e senza cicli aggiuntivi.
Firma dell'hook
L'hook useThrottle(value, delay) restituisce una versione con throttle del valore di input. Il suo contratto è simile a quello di useDebounce: accetta qualsiasi valore e un ritardo espresso in millisecondi e restituisce il valore con throttle. I componenti lo utilizzano nello stesso modo, rendendolo un'alternativa immediatamente utilizzabile per diverse semantiche temporali.
Implementazione del trailing edge
Un throttle trailing edge aggiorna il valore alla fine di ogni intervallo. Quando arriva un nuovo valore, si pianifica un setTimeout per il tempo rimanente dell'intervallo: delay - (Date.now() - lastRunTime.current). Quando il timer scatta, si aggiorna lo stato e si registra il nuovo lastRunTime. Si annullano i timer precedenti nella funzione di cleanup.
Implementazione del leading edge
Un throttle leading edge applica immediatamente il primo valore e ignora quelli successivi finché l'intervallo non scade. Si verifica se Date.now() - lastRunTime.current >= delay: in tal caso, si aggiorna lo stato e si registra l'istante. In caso contrario, si salta l'aggiornamento. In questo modo si ottiene un feedback immediato alla prima azione, seguito da un periodo di cooldown.
Combinazione di leading e trailing
La UX migliore spesso combina entrambi: rispondere immediatamente al primo evento (leading), quindi assicurarsi che anche lo stato finale venga applicato dopo l'intervallo (trailing). In questo modo l'utente vede una risposta iniziale rapida e il valore finale viene sempre applicato dopo che il movimento si è arrestato, evitando uno stato finale obsoleto.
Uso di useRef per l'ID del timeout
Memorizzare l'ID del timeout in un useRef: const timeoutRef = useRef(null). Prima di pianificare un nuovo timeout, chiamare clearTimeout(timeoutRef.current) per annullare quello eventualmente esistente. In questo modo si impedisce la sovrapposizione di più timer, che causerebbe più aggiornamenti durante un singolo intervallo di throttle.
Pulizia allo smontaggio
La funzione di cleanup di useEffect dovrebbe chiamare clearTimeout(timeoutRef.current) per annullare qualsiasi aggiornamento trailing in sospeso quando il componente viene smontato. In caso contrario, un timeout in sospeso scatta dopo lo smontaggio e tenta di aggiornare lo stato di un componente non montato, causando potenzialmente avvisi di React.
Alternativa con callback sottoposto a throttle
Invece di un hook basato sul valore, è possibile creare un hook basato su useCallback per il throttle: useThrottledCallback(fn, delay) restituisce una versione sottoposta a throttle di una funzione. È più flessibile quando l'operazione da sottoporre a throttle è una chiamata di funzione, come un tracker di analytics, anziché un valore reattivo.
Test del throttle con timer simulati
Nei test Jest, usare jest.useFakeTimers() per controllare il tempo. Configurare un throttle con un ritardo di 1000 ms, generare 10 rapidi cambiamenti di valore, quindi far avanzare il tempo simulato di 500 ms e verificare che si siano verificati solo 1 o 2 aggiornamenti. Far avanzare di altri 500 ms e verificare che venga eseguito l'aggiornamento trailing. In questo modo si convalida il comportamento del throttle in modo deterministico.
Throttle nel modello React
React elabora gli aggiornamenti di stato in batch durante i rendering. Un throttle che opera sugli aggiornamenti di stato si integra in modo lineare con questo modello. Tuttavia, si noti che in React 18 Concurrent Mode i rendering possono essere interrotti. La logica del throttle, basata sul tempo dell'orologio reale tramite Date.now(), non è influenzata dalla pianificazione di React.
Trailing edge vs leading edge del throttle
Su quale edge si attiva un throttle "trailing"?
Riepilogo della lezione: hook useThrottle
Il throttle richiede di tenere traccia dell'istante dell'ultima esecuzione con useRef. L'hook può implementare il leading edge (immediato), il trailing edge (differito) oppure entrambi. Memorizzare sempre l'ID del timeout in un ref e annullarlo nella funzione di cleanup. Per i casi d'uso basati su funzioni, preferire un approccio useThrottledCallback. Per una maggiore affidabilità, eseguire i test con timer simulati.
Impara React con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 88
- Lezioni
- 324
Domande Frequenti
La lezione «Implementare un custom hook useThrottle» è gratuita?
Sì — il testo completo di «Implementare un custom hook useThrottle» è 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 useThrottle»?
Creare un hook useThrottle che limiti la frequenza di aggiornamento di un valore durante eventi rapidi come lo scorrimento 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 3 di 4.
Quanto tempo richiede la lezione «Implementare un custom hook useThrottle»?
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