0Pricing
React Academy · Leçon

Implémenter le hook personnalisé useThrottle

Créez un hook useThrottle qui limite la fréquence de mise à jour d’une valeur lors d’événements rapides comme le défilement

Implémenter le hook personnalisé useThrottle est une leçon React Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage React Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours React Academy comprend 4 leçons au total.

La limitation de fréquence est plus difficile que la temporisation différée

La temporisation différée réinitialise simplement un minuteur à chaque événement. La limitation de fréquence doit suivre activement le moment de la dernière exécution et déterminer si suffisamment de temps s’est écoulé avant d’en autoriser une autre. Cela nécessite de conserver un horodatage entre les rendus, ce qui rend l’implémentation légèrement plus complexe que celle de la temporisation différée.

Utilisation de useRef pour lastRunTime

L’horodatage de la dernière exécution doit persister entre les rendus sans provoquer lui-même de nouveaux rendus, ce qui fait de useRef l’outil approprié. Stockez l’horodatage avec const lastRunTime = useRef(Date.now()). Contrairement à l’état, la mise à jour d’une référence ne provoque pas de nouveau rendu ; la logique de limitation de fréquence s’exécute donc efficacement, sans cycles supplémentaires.

Signature du crochet

Le crochet useThrottle(value, delay) renvoie une version limitée de la fréquence de mise à jour de la valeur d’entrée. Son contrat est similaire à celui de useDebounce : accepter n’importe quelle valeur et un délai en millisecondes, puis renvoyer la valeur limitée. Les composants l’utilisent de la même manière, ce qui en fait une solution de remplacement directe pour d’autres sémantiques temporelles.

Implémentation en fin d’intervalle

Un limiteur de fréquence en fin d’intervalle met à jour la valeur à la fin de chaque intervalle. Lorsqu’une nouvelle valeur arrive, planifiez un setTimeout pour la durée restante de l’intervalle : delay - (Date.now() - lastRunTime.current). Lorsque le minuteur se déclenche, mettez à jour l’état et enregistrez le nouveau lastRunTime. Annulez les minuteurs précédents lors du nettoyage.

Implémentation en début d’intervalle

Un limiteur de fréquence en début d’intervalle applique immédiatement la première valeur et ignore les suivantes jusqu’à l’expiration de l’intervalle. Vérifiez que si Date.now() - lastRunTime.current >= delay, vous mettez à jour l’état et enregistrez l’instant. Sinon, ignorez la mise à jour. Cela fournit un retour instantané lors de la première action, suivi d’une période d’attente.

Combinaison du début et de la fin d’intervalle

La meilleure expérience utilisateur combine souvent les deux approches : répondez immédiatement au premier événement (début), puis veillez à ce que l’état final soit également appliqué après l’intervalle (fin). L’utilisateur bénéficie ainsi d’une réponse initiale rapide, et la valeur finale est toujours appliquée une fois le mouvement terminé, ce qui évite un état final obsolète.

Utilisation de useRef pour l’ID du délai

Stockez l’ID du délai en attente dans un useRef : const timeoutRef = useRef(null). Avant de planifier un nouveau délai, appelez clearTimeout(timeoutRef.current) pour annuler celui qui existe déjà. Cela évite plusieurs minuteurs qui se chevauchent, lesquels entraîneraient plusieurs mises à jour au cours d’un même intervalle de limitation.

Nettoyage lors du démontage

Le nettoyage de useEffect doit appeler clearTimeout(timeoutRef.current) pour annuler toute mise à jour en fin d’intervalle en attente lorsque le composant est démonté. Sinon, un délai en attente se déclenche après le démontage et tente de définir l’état d’un composant démonté, ce qui peut provoquer des avertissements de React.

Alternative avec un rappel limité

Au lieu d’une fonction de limitation basée sur une valeur, vous pouvez créer une fonction de limitation basée sur useCallback : useThrottledCallback(fn, delay) renvoie une version limitée d’une fonction. Cette approche est plus flexible lorsque l’opération à limiter est un appel de fonction, par exemple un outil de suivi analytique, plutôt qu’une valeur réactive.

Tester la limitation avec des minuteurs simulés

Dans les tests Jest, utilisez jest.useFakeTimers() pour contrôler le temps. Configurez une limitation avec un délai de 1000 ms, déclenchez 10 changements rapides de valeur, puis avancez le temps simulé de 500 ms et vérifiez qu’une ou deux mises à jour seulement ont eu lieu. Avancez encore de 500 ms et vérifiez que la mise à jour en fin d’intervalle se déclenche. Cela valide de manière déterministe le comportement de la limitation.

La limitation dans le modèle React

React traite les mises à jour d’état par lots pendant les rendus. Une limitation appliquée aux mises à jour d’état s’intègre proprement à ce modèle. Toutefois, notez que, dans le mode concurrent de React 18, les rendus peuvent être interrompus. La logique de limitation elle-même, fondée sur le temps réel de l’horloge via Date.now(), n’est pas affectée par la planification de React.

Limitation en fin ou en début d’intervalle

Sur quelle extrémité un limiteur en fin d’intervalle se déclenche-t-il ?

Récapitulatif de la leçon : fonction useThrottle

La limitation nécessite de suivre le dernier instant d’exécution avec useRef. La fonction peut implémenter le début d’intervalle, immédiat, la fin d’intervalle, différée, ou les deux. Stockez toujours l’ID du délai dans une référence et annulez-le lors du nettoyage. Pour les cas d’utilisation fondés sur des fonctions, préférez un modèle useThrottledCallback. Effectuez des tests avec des minuteurs simulés pour garantir la fiabilité.

Questions Fréquemment Posées

La leçon « Implémenter le hook personnalisé useThrottle » est-elle gratuite ?

Oui — le texte complet de « Implémenter le hook personnalisé useThrottle » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours React Academy, passe à CoddyKit PRO. Le cours React Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Implémenter le hook personnalisé useThrottle » ?

Créez un hook useThrottle qui limite la fréquence de mise à jour d’une valeur lors d’événements rapides comme le défilement Tu pratiques React Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer React Academy ?

Aucune expérience préalable n'est requise. React Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.

Combien de temps prend la leçon « Implémenter le hook personnalisé useThrottle » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon React Academy ?

Oui. Chaque leçon React Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Pourquoi le debounce et le throttle sont importants dans les interfaces
  2. Implémenter le hook personnalisé useDebounce
  3. Implémenter le hook personnalisé useThrottle
  4. Applications pratiques : recherche, défilement, redimensionnement
← Retour à React Academy