Implementar el hook personalizado useThrottle
Crear un hook useThrottle que limite la frecuencia de actualización de un valor durante eventos rápidos, como el desplazamiento
Implementar el hook personalizado useThrottle es una lección gratuita de React Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.
Throttle es más complejo que Debounce
Debounce simplemente reinicia un temporizador con cada evento. Throttle debe registrar activamente cuándo se produjo la última ejecución y decidir si ha transcurrido suficiente tiempo para realizar otra. Esto requiere conservar una marca de tiempo entre renderizados, por lo que la implementación es algo más compleja que la de Debounce.
Uso de useRef para lastRunTime
La marca de tiempo de la última ejecución debe conservarse entre renderizados sin provocar nuevos renderizados, por lo que useRef es la herramienta adecuada. Almacene la marca de tiempo como const lastRunTime = useRef(Date.now()). A diferencia del estado, actualizar una ref no provoca un nuevo renderizado, por lo que la lógica de Throttle se ejecuta eficientemente sin ciclos adicionales.
Firma del hook
El hook useThrottle(value, delay) devuelve una versión con Throttle del valor de entrada. Su contrato es similar al de useDebounce: acepta cualquier valor y un retraso en ms, y devuelve el valor con Throttle. Los componentes lo usan de la misma forma, por lo que constituye una alternativa de sustitución directa para otras semánticas temporales.
Implementación de trailing
Un throttle de trailing actualiza el valor al final de cada intervalo. Cuando llega un valor nuevo, programe un setTimeout para el tiempo restante del intervalo: delay - (Date.now() - lastRunTime.current). Cuando se ejecute el temporizador, actualice el estado y registre el nuevo lastRunTime. Cancele los temporizadores anteriores en la función de limpieza.
Implementación de leading
Un throttle de leading aplica el primer valor de inmediato e ignora los siguientes hasta que vence el intervalo. Compruebe si Date.now() - lastRunTime.current >= delay; si es así, actualice el estado y registre el momento. De lo contrario, omita la actualización. Esto proporciona una respuesta inmediata a la primera acción, seguida de un periodo de espera.
Combinación de leading y trailing
La mejor experiencia de usuario suele combinar ambos enfoques: responder de inmediato al primer evento (leading) y asegurarse después de que el estado final también se aplique al terminar el intervalo (trailing). Así, el usuario percibe una respuesta inicial rápida y el valor final siempre se aplica cuando cesa el movimiento, lo que evita que el estado final quede obsoleto.
Uso de useRef para el ID del temporizador
Guarde el ID del temporizador pendiente en un useRef: const timeoutRef = useRef(null). Antes de programar un temporizador nuevo, llame a clearTimeout(timeoutRef.current) para cancelar cualquier temporizador existente. Esto evita que haya varios temporizadores superpuestos, lo que provocaría varias actualizaciones dentro de un mismo intervalo de throttle.
Limpieza al desmontar
La función de limpieza de useEffect debe llamar a clearTimeout(timeoutRef.current) para cancelar cualquier actualización trailing pendiente cuando el componente se desmonte. De lo contrario, un temporizador pendiente se ejecutará después del desmontaje e intentará actualizar el estado de un componente desmontado, lo que puede provocar advertencias de React.
Alternativa con callback limitado
En lugar de un hook basado en valores, puede crear un hook de throttle basado en useCallback: useThrottledCallback(fn, delay) devuelve una versión limitada de una función. Esta opción es más flexible cuando lo que desea limitar es una llamada a una función, como la de un rastreador de analíticas, en lugar de un valor reactivo.
Pruebas de throttle con temporizadores simulados
En las pruebas de Jest, use jest.useFakeTimers() para controlar el tiempo. Configure un throttle con un retraso de 1000 ms, genere 10 cambios rápidos de valor, avance después el tiempo simulado 500 ms y compruebe que solo se hayan producido 1 o 2 actualizaciones. Avance otros 500 ms y verifique que se ejecute la actualización trailing. Así validará el comportamiento del throttle de forma determinista.
Throttle en el modelo de React
React procesa las actualizaciones de estado en lotes durante los renderizados. Un throttle que opera sobre actualizaciones de estado funciona correctamente dentro de este modelo. Sin embargo, tenga en cuenta que, en React 18 Concurrent Mode, los renderizados pueden interrumpirse. La lógica del throttle, basada en el tiempo real del reloj mediante Date.now(), no se ve afectada por la planificación de React.
¿En qué borde se ejecuta un throttle «trailing»?
¿En qué borde se ejecuta un throttle «trailing»?
Resumen de la lección: hook useThrottle
Throttle requiere controlar el momento de la última ejecución con useRef. El hook puede implementar el borde leading (inmediato), el borde trailing (diferido) o ambos. Guarde siempre el ID del temporizador en un ref y cancélelo en la función de limpieza. Para casos de uso basados en funciones, prefiera el patrón useThrottledCallback. Use temporizadores simulados en las pruebas para obtener resultados fiables.
Preguntas frecuentes
¿La lección «Implementar el hook personalizado useThrottle» es gratis?
Sí — el texto completo de «Implementar el hook personalizado useThrottle» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Implementar el hook personalizado useThrottle»?
Crear un hook useThrottle que limite la frecuencia de actualización de un valor durante eventos rápidos, como el desplazamiento Practicas React Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar React Academy?
No se requiere experiencia previa. React Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Implementar el hook personalizado useThrottle»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de React Academy?
Sí. Cada lección de React Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Por qué importan debounce y throttle en las interfaces
- Implementar el hook personalizado useDebounce
- Implementar el hook personalizado useThrottle
- Aplicaciones prácticas: búsqueda, desplazamiento y redimensionamiento