Implémenter le hook personnalisé useDebounce
Créez un hook useDebounce qui retarde les mises à jour d’état jusqu’à ce que l’utilisateur cesse de saisir du texte
Implémenter le hook personnalisé useDebounce est une leçon React Academy gratuite sur CoddyKit. Ceci est la leçon 2 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.
Signature du crochet
Le crochet useDebounce accepte une valeur et un délai en millisecondes, puis renvoie une version temporisée de cette valeur : function useDebounce(value, delay). La valeur debouncedValue renvoyée reste en retard sur la valeur réelle et ne se met à jour qu’une fois le délai indiqué écoulé sans autre changement.
État interne de debouncedValue
Dans le crochet, déclarez une variable d’état : const [debouncedValue, setDebouncedValue] = useState(value). Cet état contient la dernière valeur validée. Il commence avec la valeur initiale et ne se met à jour qu’après le déclenchement du minuteur de temporisation. Les composants qui lisent debouncedValue obtiennent une valeur stable et finalisée.
useEffect avec setTimeout
La logique principale se trouve dans un useEffect : créez un minuteur avec setTimeout(() => setDebouncedValue(value), delay) et stockez son identifiant. L’effet s’exécute chaque fois que value ou delay change. Le minuteur se déclenche delay millisecondes après le dernier changement et met à jour l’état temporisé.
Effacement du minuteur lors du nettoyage
La fonction de nettoyage de useEffect appelle clearTimeout(timerId). Lorsque value change avant le déclenchement du minuteur, React exécute le nettoyage et annule la mise à jour en attente. Un nouveau minuteur est ensuite programmé. C’est le mécanisme essentiel de la temporisation différée : les changements rapides réinitialisent constamment le minuteur.
Dépendances de l’effet
Le tableau de dépendances de useEffect doit contenir [value, delay]. L’effet est relancé chaque fois que la valeur d’entrée change, afin de programmer un nouveau minuteur, ainsi que chaque fois que le délai change, au cas où l’appelant ajusterait dynamiquement l’intervalle de temporisation. Les deux doivent être inclus pour éviter les problèmes liés aux fermetures obsolètes.
Utilisation du crochet dans un composant
L’utilisation est simple : const debouncedSearch = useDebounce(searchInput, 300). Un autre useEffect ayant [debouncedSearch] comme dépendance déclenche l’appel à l’interface de programmation. L’état du champ (searchInput) se met à jour immédiatement, ce qui maintient la réactivité du champ ; seul l’appel à l’interface de programmation attend la temporisation.
Cas particulier du premier appel immédiat
Par défaut, l’implémentation standard ne s’exécute que sur le front final. Pour un mode « immédiat » qui appelle la fonction au premier déclenchement, puis temporise les appels suivants, vous devez utiliser une référence pour suivre si l’appel a déjà été effectué et la réinitialiser après le délai d’attente. Cette approche est plus complexe, mais utile pour les boutons d’envoi.
Paramètre de type générique TypeScript
Rendez le crochet générique pour garantir la sûreté des types : function useDebounce(value: T, delay: number): T. Cela permet à TypeScript de déduire le type de debouncedValue à partir du type de value. Le paramètre générique T se propage automatiquement dans l’état interne et le type renvoyé.
Erreur courante : nettoyage manquant
Une erreur fréquente consiste à oublier de renvoyer la fonction de nettoyage depuis useEffect. Sans nettoyage, chaque changement de valeur crée un nouveau minuteur sans jamais annuler l’ancien. Plusieurs minuteurs se déclenchent alors et appellent plusieurs fois setDebouncedValue avec des valeurs obsolètes, ce qui annule complètement l’effet de la temporisation différée.
Comparaison avec les approches fondées sur useRef
Une autre possibilité consiste à stocker la fonction de temporisation elle-même dans un useRef à l’aide de lodash. Contrairement à l’approche fondée sur l’état, l’approche fondée sur une référence temporise des fonctions de rappel plutôt que des valeurs. Utilisez le crochet fondé sur l’état lorsque vous avez besoin d’une valeur dérivée ; utilisez l’approche fondée sur une fonction de rappel lorsque vous devez temporiser un gestionnaire d’événement.
Vérification du comportement réel
Vérifiez le fonctionnement de votre crochet en ajoutant une journalisation dans la fonction de rappel du minuteur, puis en observant la console du navigateur pendant une saisie rapide. Vous devez voir un journal par événement d’arrêt, et non un journal par frappe. Lors d’une saisie rapide, le nombre de journaux doit être bien inférieur au nombre de frappes.
Nettoyage de useEffect dans useDebounce
Pourquoi le useEffect de useDebounce doit-il renvoyer une fonction de nettoyage qui appelle clearTimeout ?
Récapitulatif de la leçon : crochet useDebounce
Le crochet useDebounce(value, delay) conserve un état temporisé qui ne se met à jour qu’après delay ms de silence. Son useEffect définit un délai d’attente et l’annule lors du nettoyage afin d’éliminer les minuteurs obsolètes. Utilisez la valeur temporisée comme dépendance des effets qui récupèrent des données via l’interface de programmation. Ajoutez un type générique TypeScript pour garantir une sûreté complète des types.
Questions Fréquemment Posées
La leçon « Implémenter le hook personnalisé useDebounce » est-elle gratuite ?
Oui — le texte complet de « Implémenter le hook personnalisé useDebounce » 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é useDebounce » ?
Créez un hook useDebounce qui retarde les mises à jour d’état jusqu’à ce que l’utilisateur cesse de saisir du texte 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 2 sur 4.
Combien de temps prend la leçon « Implémenter le hook personnalisé useDebounce » ?
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
- Pourquoi le debounce et le throttle sont importants dans les interfaces
- Implémenter le hook personnalisé useDebounce
- Implémenter le hook personnalisé useThrottle
- Applications pratiques : recherche, défilement, redimensionnement