📝 Exercices — R09 Custom Hooks
10 exercices pour créer vos propres hooks réutilisables.
useToggle — booléen avec toggle
Créez un hook useToggle(initial) qui retourne [value, toggle, setTrue, setFalse]. Utilisez useState et useCallback. Démontrez son usage dans un composant Modal.
useLocalStorage — persistance
Créez useLocalStorage(key, initialValue) qui se comporte comme useState mais persiste les valeurs dans localStorage. L'initialisation doit lire localStorage (avec try/catch).
useFetch — requête HTTP
Créez useFetch(url) qui retourne { data, loading, error }. Gérez l'annulation avec AbortController au nettoyage. Testez avec l'API JSONPlaceholder.
useDebounce — retarder une valeur
Créez useDebounce(value, delay) qui retourne la valeur uniquement après delay ms sans changement. Utilisez setTimeout + clearTimeout dans useEffect.
usePrevious — valeur précédente
Créez usePrevious(value) qui retourne la valeur du rendu précédent. Utilisez useRef pour stocker la valeur et useEffect sans tableau de dépendances pour la mettre à jour après chaque render.
useKeyPress — détecter une touche
Créez useKeyPress(targetKey) qui retourne true quand la touche ciblée est enfoncée. Utilisez addEventListener('keydown') et ('keyup') avec nettoyage dans useEffect.
useIntersection — visibilité DOM
Créez useIntersection(options) qui retourne [ref, isVisible]. Utilisez l'API IntersectionObserver pour détecter si l'élément référencé est visible dans le viewport. Parfait pour le lazy loading.
useInterval — setInterval déclaratif
Créez useInterval(callback, delay) — version déclarative de setInterval. Stockez le callback dans une ref pour éviter les closures obsolètes. Si delay est null, ne déclenchez pas l'intervalle.
Bibliothèque de hooks utilitaires
Créez au moins 2 hooks utilitaires différents : par exemple useWindowSize (largeur/hauteur de la fenêtre avec resize listener), useClipboard (copier dans le presse-papier), ou useOnline (statut réseau).
useSearch — hook avancé complet
Créez useSearch(items, searchFn, delay) combinant debounce, useMemo pour les résultats, useCallback pour les handlers, et useRef pour le focus. Le hook retourne { query, results, handleChange, clear, inputRef }.