Introduction aux Hooks
These docs are old and wonât be updated. Go to react.dev for the new React docs.
These new documentation pages teach React with Hooks:
Les Hooks sont arrivĂ©s avec React 16.8. Ils vous permettent de bĂ©nĂ©ficier dâun Ă©tat local et dâautres fonctionnalitĂ©s de React sans avoir Ă Ă©crire une classe.
import React, { useState } from 'react';
function Example() {
// DĂ©clare une nouvelle variable d'Ă©tat, quâon va appeler « count » const [count, setCount] = useState(0);
return (
<div>
<p>Vous avez cliqué {count} fois</p>
<button onClick={() => setCount(count + 1)}>
Cliquez ici
</button>
</div>
);
}
Cette nouvelle fonction useState
est le premier « Hook » que nous allons explorer, mais cet exemple est juste un petit aperçu. Ne vous inquiĂ©tez pas si vous nây comprenez rien pour le moment, ça va venir vite !
Vous pouvez commencer à apprendre les Hooks à la page suivante. Dans celle-ci, nous vous expliquons pourquoi nous avons ajouté les Hooks à React et comment ils vous aideront à écrire des applications géniales.
Remarque
Les Hooks sont apparus dans React 16.8.0. Lors de la mise Ă jour de React, nâoubliez pas de mettre Ă jour tous les modules, dont React DOM.
React Native prend en charge les Hooks depuis sa version 0.59.
Vidéo de présentation
Lors de la React Conf 2018, Sophie Alpert et Dan Abramov ont présenté les Hooks, suivis de Ryan Florence qui a montré comment refactoriser une application pour les utiliser. Regardez la vidéo ici :
Pas de rupture de compatibilité
Avant de continuer, remarquez bien que les hooks sont :
- ComplĂštement optionnels. Vous pouvez essayer les Hooks dans quelques composants sans réécrire le code existant. Mais vous nâavez pas Ă apprendre et utiliser les Hooks dĂšs maintenant si vous ne le souhaitez pas.
- 100% rétro-compatibles. Les Hooks préservent la compatibilité ascendante.
- Disponibles maintenant. Les Hooks sont disponibles depuis la version 16.8.0.
Les classes en React ne sont pas menacĂ©es. Vous pouvez en apprendre davantage sur la stratĂ©gie dâadoption progressive des Hooks en bas de cette page.
Les Hooks nâinvalident pas vos connaissances des concepts de React. Les Hooks fournissent plutĂŽt une API plus directe pour les concepts React que vous connaissez dĂ©jĂ : props, Ă©tat local, contexte, refs et cycle de vie. Comme nous le verrons plus tard, les Hooks offrent Ă©galement un nouveau moyen puissant de les combiner.
Si vous voulez juste commencer Ă apprendre les Hooks, nâhĂ©sitez pas Ă aller directement Ă la page suivante ! Vous pouvez Ă©galement continuer Ă lire cette page pour en apprendre davantage sur les raisons pour lesquelles nous ajoutons les Hooks et sur la façon dont nous allons commencer Ă les utiliser sans réécrire nos applications.
Raisons
Les Hooks rĂ©solvent une grande variĂ©tĂ© de problĂšmes apparemment sans rapports en React, que nous avons rencontrĂ©s pendant cinq ans dâĂ©criture et de maintenance de dizaines de milliers de composants. Que vous appreniez React, lâutilisiez quotidiennement ou prĂ©fĂ©riez une bibliothĂšque diffĂ©rente avec un modĂšle de composants similaire, vous pourriez reconnaĂźtre certains de ces problĂšmes.
Il est difficile de réutiliser la logique à état entre les composants
React nâoffre aucun moyen « dâattacher » un comportement rĂ©utilisable Ă un composant (par exemple, le connecter Ă un Ă©tat applicatif). Si vous utilisez dĂ©jĂ React depuis quelques temps, vous avez peut-ĂȘtre dĂ©jĂ rencontrĂ© les props de rendu et les composants dâordre supĂ©rieur qui tentent dâapporter une solution. Mais ces approches exigent la restructuration de vos composants lorsque vous les utilisez, ce qui rend le code plus lourd et difficile Ă maintenir.
Si vous examinez une application React typique dans les React DevTools, vous verrez un vĂ©ritable « enfer dâenrobage » de composants perdus dans des couches de fournisseurs et consommateurs de contexte, composants dâordre supĂ©rieur, props de rendu et autres abstractions. On pourrait les filtrer dans les DevTools, mais ils sont symptomatiques dâun problĂšme plus profond : React a besoin dâune meilleure primitive pour la rĂ©utilisation des logiques Ă Ă©tat.
Avec les Hooks, vous pouvez extraire la logique Ă Ă©tat dâun composant pour la rĂ©utiliser et la tester de façon indĂ©pendante. Les Hooks vous permettent de rĂ©utiliser de la logique Ă Ă©tat sans modifier la hiĂ©rarchie de vos composants. Ăa facilite le partage des Hooks entre plusieurs composants, voire avec la communautĂ©.
Nous parlerons de ça plus en détail dans Construire vos propres Hooks.
Les composants complexes deviennent difficiles Ă comprendre
Nous avons souvent dĂ» maintenir des composants qui Ă©taient simples au dĂ©part, pour devenir dâingĂ©rables ramassis de logiques Ă Ă©tat et dâeffets de bord. Chaque mĂ©thode de cycle de vie contient un mĂ©lange de logiques sans aucun rapport. Par exemple, des composants peuvent charger des donnĂ©es dans les mĂ©thodes componentDidMount
et componentDidUpdate
. Toutefois, cette mĂȘme mĂ©thode componentDidMount
pourrait contenir dâautres logiques dĂ©diĂ©es Ă la configuration dâĂ©couteurs dâĂ©vĂ©nements, qui seront Ă leur tour nettoyĂ©s dans la mĂ©thode componentWillUnmount
.
Le code mutuellement liĂ© dont les Ă©volutions doivent rester cohĂ©rentes est divisĂ© en plusieurs parties, alors que du code sans rapport finit par ĂȘtre combinĂ© en une seule mĂ©thode. Ăa ouvre grand la porte Ă lâintroduction de bugs et incohĂ©rences.
Il est frĂ©quemment impossible de dĂ©couper ces composants en dâautres plus petits, car la logique Ă Ă©tat est Ă©parpillĂ©e. Ils sont Ă©galement difficiles Ă tester. Câest la raison pour laquelle de nombreux utilisateurs de React prĂ©fĂšrent lâassocier Ă une bibliothĂšque externe de gestion dâĂ©tat applicatif. Toutefois, ça rajoute souvent encore davantage dâabstraction et vous oblige Ă jouer entre les fichiers, ce qui complexifie la rĂ©utilisation de ces composants.
Pour mettre un terme Ă ces soucis, les Hooks vous permettent de dĂ©couper un composant en petites fonctions basĂ©es sur les parties qui sont intrinsĂšquement liĂ©es (comme la configuration dâun abonnement ou le chargement de donnĂ©es), plutĂŽt que de forcer leur dĂ©coupe sur base des mĂ©thodes de cycle de vie. Il est aussi possible de gĂ©rer lâĂ©tat local dâun composant avec un rĂ©ducteur, pour le rendre plus prĂ©visible.
Nous verrons tout ça plus en dĂ©tail dans Utiliser le Hook dâeffet.
Les classes sont déroutantes pour les gens comme pour les machines
En plus de rendre plus difficiles la rĂ©utilisation et lâorganisation du code, nous avons remarquĂ© que les classes peuvent constituer une barriĂšre significative Ă lâapprentissage de React. Vous devez comprendre comment this
fonctionne en JavaScript, dâune façon trĂšs diffĂ©rente de la plupart des langages. Vous devez vous souvenir de lier les gestionnaires dâĂ©vĂ©nements. Sans certaines propositions de syntaxes encore instables, le code est trĂšs verbeux. Les gens peuvent parfaitement comprendre les props, lâĂ©tat local, et le flux de donnĂ©es descendant mais lutter nĂ©anmoins avec les classes. La distinction entre fonctions composants et composants Ă base de classes, ainsi que les situations oĂč leur usage respectif est appropriĂ©, conduisent Ă des dĂ©saccords mĂȘme entre dĂ©veloppeurs React expĂ©rimentĂ©s.
En outre, React est sorti il y a environ cinq ans, et nous voulons nous assurer quâil reste pertinent pour les cinq prochaines annĂ©es. Comme Svelte, Angular, Glimmer, et dâautres lâont montrĂ©, la compilation anticipĂ©e de composants recĂšle un fort potentiel, surtout si elle ne se limite pas aux gabarits. RĂ©cemment, nous avons expĂ©rimentĂ© autour du component folding en utilisant Prepack, et les premiers rĂ©sultats sont encourageants. Toutefois, nous avons constatĂ© que les composants Ă base de classes peuvent encourager des approches involontaires qui empĂȘchent de telles optimisations. Les classes prĂ©sentent aussi des problĂšmes pour lâoutillage actuel. Par exemple, les classes ne sont pas efficacement minifiĂ©es, et elles rendent le rechargement Ă chaud peu fiable. Nous voulons prĂ©senter une API qui permet au code de rester plus aisĂ©ment optimisable.
Pour rĂ©soudre ces problĂšmes, les Hooks nous permettent dâutiliser davantage de fonctionnalitĂ©s de React sans recourir aux classes. Conceptuellement, les composants React ont toujours Ă©tĂ© proches des fonctions. Les Hooks tirent pleinement parti des fonctions, sans sacrifier lâesprit pratique de React. Les Hooks donnent accĂšs Ă des Ă©chappatoires impĂ©ratives et ne vous obligent pas Ă apprendre des techniques complexes de programmation fonctionnelle ou rĂ©active..
Exemples
Lâaperçu des Hooks est un bon moyen de commencer Ă apprendre les Hooks.
StratĂ©gie dâadoption progressive
TL;DR : nous nâavons aucune intention de retirer les classes de React.
Nous savons que les dĂ©veloppeurs React se concentrent sur la sortie de leurs produits et nâont pas le temps dâexplorer chaque nouvelle API qui sort. Les Hooks sont tout nouveaux, et il serait peut-ĂȘtre sage dâattendre que davantage dâexemples et de tutoriels soient disponibles avant dâenvisager de les apprendre ou de les adopter.
Nous comprenons aussi que la barre pour ajouter une nouvelle primitive Ă React est extrĂȘmement haute. Pour les lecteurs curieux, nous avons prĂ©parĂ© une RFC dĂ©taillĂ©e qui explore plus en dĂ©tail les raisons derriĂšre les Hooks, et fournit une perspective supplĂ©mentaire sur certaines dĂ©cisions de conception et sur des sources dâinspiration.
Point trĂšs important : les Hooks fonctionnent cĂŽte Ă cĂŽte avec du code existant, vous pouvez donc les adopter progressivement. Il nây a aucune raison pressante de migrer vers les Hooks. Nous conseillons dâĂ©viter les « réécritures intĂ©grales », en particulier pour les composants existants complexes Ă base de classes. Il faut ajuster un peu son modĂšle mental pour commencer à « penser en Hooks ». Ă en croire notre expĂ©rience, il vaut mieux sâhabituer aux Hooks dans de nouveaux composants non-critiques, et sâassurer que toutes les personnes de lâĂ©quipe sont Ă lâaise avec. AprĂšs avoir essayĂ© les Hooks, nâhĂ©sitez pas Ă nous faire vos retours, quâils soient positifs ou nĂ©gatifs.
Nous voulons que les Hooks couvrent tout les cas dâusages des classes, mais nous continuerons Ă prendre en charge les composants Ă base de classes jusquâĂ nouvel ordre. Chez Facebook, nous avons des dizaines de milliers de composants Ă©crit en tant que classes, et nous nâavons absolument pas lâintention de les réécrire. Au lieu de ça, nous avons commencĂ© Ă utiliser les Hooks dans le nouveau code, cĂŽte Ă cĂŽte avec les classes.
Questions fréquemment posées
Nous avons préparé une FAQ des Hooks qui répond aux questions les plus couramment posées sur les Hooks.
Prochaines étapes
Arrivé·e sur cette fin de page, vous devriez avoir une idĂ©e plus claire des problĂšmes rĂ©solus par les Hooks, mais de nombreux dĂ©tails restent sans doute obscurs. Ne vous en faites pas ! En route pour la page suivante, dans laquelle nous commencerons Ă apprendre les Hooks par lâexemple.