📝 Exercices — R09 Custom Hooks

10 exercices pour créer vos propres hooks réutilisables.

EX 1

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.

EX 2

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).

EX 3

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.

EX 4

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.

EX 5

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.

EX 6

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.

EX 7

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.

EX 8

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.

EX 9

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).

EX 10

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 }.

← Cours R09 ▶ Mini-projet : Hook Library Suivant : Router →