Les hooks React sont des fonctions dont le nom commence par use et qui permettent à un composant fonction d'utiliser les fonctionnalités de React : useState pour mémoriser une valeur, useEffect pour exécuter du code après le rendu, useRef pour garder un nœud DOM, useContext pour lire des données partagées. Vous les appelez en haut de votre composant, et React conserve leurs valeurs d'un rendu à l'autre.
Quatre hooks travaillent ensemble ici. useState stocke le texte, useRef pointe vers le champ pour que le bouton puisse lui donner le focus, useMemo garde la liste filtrée jusqu'à ce que la recherche change, et useEffect écrit dans la console après chaque rendu où la recherche a changé. Tapez an et regardez la console : une ligne par frappe, après la mise à jour de la liste.
Pourquoi les hooks existent
Avant React 16.8, un composant qui avait besoin d'un état ou d'un code de cycle de vie devait être une classe. La logique d'une même fonctionnalité était répartie entre componentDidMount, componentDidUpdate et componentWillUnmount, et la partager entre composants passait par des mixins (qui n'ont jamais fonctionné avec la syntaxe des classes), des higher order components ou des render props, qui enveloppaient tous votre arbre dans des couches supplémentaires.
// The class way: one feature, three methods
class Clock extends React.Component {
state = { now: new Date() };
componentDidMount() {
this.id = setInterval(() => this.setState({ now: new Date() }), 1000);
}
componentWillUnmount() {
clearInterval(this.id);
}
render() {
return <p>{this.state.now.toLocaleTimeString()}</p>;
}
}
Avec les hooks, la même fonctionnalité vit au même endroit : l'effet démarre le minuteur et son nettoyage l'arrête.
Masquez l'horloge et la console affiche timer stopped : React a exécuté le nettoyage quand Clock a quitté l'écran. Affichez-la à nouveau et un nouveau minuteur démarre. Les composants classes fonctionnent toujours dans React 19, mais le nouveau code utilise les hooks.
Tous les hooks intégrés
React 19.2 regroupe ses hooks selon ce qu'ils apportent à un composant. Vous utiliserez les deux premiers groupes tous les jours, et les autres quand un problème précis l'exige.
| Hook | Ce qu'il vous apporte | Page |
|---|---|---|
useState | Une valeur qui survit aux rendus et un setter qui refait le rendu | useState |
useReducer | Un état mis à jour par une fonction reducer et des actions envoyées | useReducer |
useContext | Une valeur fournie par un parent, sans passer de props | useContext |
useRef | Une boîte modifiable qui survit aux rendus, souvent un nœud DOM | useRef |
useImperativeHandle | Choisit ce qu'un parent voit à travers votre ref | forwardRef |
useEffect | Du code qui s'exécute en général après l'affichage : minuteurs, abonnements, récupération de données | useEffect |
useLayoutEffect | Du code qui s'exécute après la mise à jour du DOM mais avant l'affichage | useLayoutEffect |
useInsertionEffect | S'exécute avant les effets de layout, pour les bibliothèques CSS-in-JS | |
useEffectEvent | Une fonction qu'un effet peut appeler et qui voit toujours les dernières props et le dernier état | useEffect |
useMemo | Met en cache une valeur calculée entre les rendus | useMemo |
useCallback | Met en cache une fonction entre les rendus | useCallback |
useTransition | Marque une mise à jour comme non urgente et vous indique quand elle est en attente | useTransition |
useDeferredValue | Une copie d'une valeur qui prend du retard pendant les rendus lourds | useDeferredValue |
useId | Un identifiant unique identique sur le serveur et le client | useId |
useSyncExternalStore | S'abonne à un store qui vit hors de React | useSyncExternalStore |
useDebugValue | Un libellé pour un hook personnalisé dans React DevTools | |
use | Lit une promesse ou un contexte, et peut se trouver dans une condition | use |
useActionState | Un état mis à jour par une action de formulaire, avec un indicateur d'attente | useActionState |
useOptimistic | Affiche le résultat attendu avant la réponse du serveur | useOptimistic |
useFormStatus | L'état d'attente du formulaire parent (depuis react-dom) |
use, useActionState, useOptimistic et useFormStatus sont arrivés avec React 19, et useEffectEvent est devenu stable dans la 19.2. Tous les autres hooks de la liste fonctionnent aussi dans React 18.
L'état provoque des rendus, les refs non
Tous les hooks ne déclenchent pas un rendu. useState et useReducer, si : modifiez leur valeur et React redessine le composant. useRef vous donne un objet dont vous pouvez modifier librement le champ current, et React ne refait jamais de rendu à cause de lui. C'est donc le bon endroit pour un identifiant de minuteur, une valeur précédente ou un compteur que l'écran n'affiche pas.
useReducer contient le panier et useState contient la note ; les deux provoquent un rendu quand ils changent, et l'effet écrit une ligne par rendu. L'effet modifie aussi commits.current, mais ce changement ne provoque jamais de rendu à lui seul, donc la console ne boucle pas. Le compteur est mis à jour dans un effet plutôt que dans le corps du composant, car le corps ne doit rien modifier pendant le rendu.
Les règles des hooks
Chaque hook suit deux règles :
- Appelez les hooks au niveau supérieur de votre composant, jamais dans une condition, une boucle ou une fonction imbriquée.
- Appelez les hooks uniquement depuis des composants fonctions ou depuis vos propres hooks personnalisés.
React ne reconnaît pas les hooks par leur nom. Il les reconnaît par l'ordre dans lequel vous les appelez, et il attend que cet ordre soit le même à chaque rendu. Un hook dans un if décalerait tous les hooks suivants. La page sur les règles des hooks montre ce qui casse et comment le corriger. use est la seule exception : il peut être appelé dans une condition.
Votre premier hook personnalisé
Quand deux composants ont besoin de la même logique avec état, déplacez-la dans une fonction dont le nom commence par use. Cette fonction peut appeler n'importe quel autre hook. Chaque composant qui l'appelle obtient son propre état.
Les deux compteurs utilisent le même hook, mais cliquer sur l'un laisse l'autre tranquille : un hook personnalisé partage la logique, pas l'état. Ajoutez une fonction decrement à useCounter et un bouton qui l'appelle, et les deux compteurs en profitent d'un coup. D'autres patterns (useToggle, useDebounce, useLocalStorage) se trouvent sur la page des hooks personnalisés.
Quel hook choisir
- L'écran doit changer quand une valeur change :
useState, ouuseReducerquand de nombreux événements modifient le même état. - Vous devez communiquer avec quelque chose d'extérieur à React (un minuteur, un abonnement, une requête) :
useEffect. - Vous avez besoin d'un nœud DOM ou d'une valeur que l'écran n'affiche pas :
useRef. - De nombreux composants profonds dans l'arbre ont besoin de la même valeur :
useContext. - Un rendu est lent à cause d'un calcul ou parce qu'un enfant mémoïsé refait son rendu :
useMemoetuseCallback. React Compiler peut ajouter cette mémoïsation pour vous, mais l'écrire à la main fonctionne toujours et reste courant. - La saisie semble lente parce que la mise à jour qui la suit est lourde :
useTransitionouuseDeferredValue.
Questions fréquentes
Que sont les hooks dans React ?
Les hooks sont des fonctions dont le nom commence par use et qui permettent à un composant fonction d'utiliser les fonctionnalités de React : useState pour l'état, useEffect pour les effets de bord, useContext pour le contexte, useRef pour des valeurs qui survivent aux rendus sans en provoquer, et d'autres.
Pourquoi les hooks ont-ils été ajoutés à React ?
Avant les hooks (React 16.8), l'état et les méthodes de cycle de vie n'existaient que dans les composants classes, et partager une logique avec état nécessitait des mixins, des higher order components ou des render props. Les hooks placent cette logique dans de simples fonctions que vous pouvez appeler depuis n'importe quel composant fonction et partager sous forme de hooks personnalisés.
Combien de hooks React possède-t-il ?
React 19.2 fournit une vingtaine de hooks intégrés dans le paquet react, plus useFormStatus dans react-dom. La plupart des applications en utilisent quelques-uns au quotidien : useState, useEffect, useRef, useContext, useMemo et useCallback.
Peut-on utiliser des hooks dans des composants classes ?
Non. Les hooks ne fonctionnent que dans les composants fonctions et dans d'autres hooks. Vous pouvez toujours afficher un composant classe à côté de composants fonctions, et une classe peut afficher un composant fonction qui utilise des hooks.
Qu'est-ce qu'un hook personnalisé ?
Votre propre fonction dont le nom commence par use et qui appelle d'autres hooks. Elle permet à plusieurs composants de réutiliser la même logique avec état, tandis que chaque composant qui l'appelle obtient son propre état séparé.