React.Component
These docs are old and wonât be updated. Go to react.dev for the new React docs.
These new documentation pages teach modern React:
Cette page fournit une rĂ©fĂ©rence dĂ©taillĂ©e de lâAPI pour la dĂ©finition de composants React Ă base de classes. Elle suppose que vous ĂȘtes Ă lâaise avec les concepts fondamentaux de React, tels que les Composants et props, ainsi que lâĂtat et cycle de vie. Si ce nâest pas le cas, lisez ces pages avant de continuer.
Aperçu de lâAPI
React vous permet de définir vos composants en tant que classes ou fonctions. Les composants définis par des classes fournissent pour le moment davantage de fonctionnalités, qui sont décrites en détail dans cette page. Pour définir un composant React avec une classe, vous devez étendre React.Component
:
class Welcome extends React.Component {
render() {
return <h1>Bonjour, {this.props.name}</h1>;
}
}
La seule méthode que vous devez définir dans une sous-classe de React.Component
sâappelle render()
. Toutes les autres méthodes décrites sur cette page sont optionnelles.
Nous vous recommandons fortement de ne pas créer vos propres classes de base pour vos composants. Dans les composants React, la réutilisation de code est obtenue principalement par composition plutÎt que par héritage.
Remarque
React ne vous force pas Ă utiliser la syntaxe de classes ES6. Si vous prĂ©fĂ©rez lâĂ©viter, vous pouvez utiliser Ă la place le module
create-react-class
ou une autre abstraction maison du mĂȘme genre. Allez faire un tour sur React sans ES6 pour en apprendre davantage.
Le cycle de vie du composant
Chaque composant a plusieurs « mĂ©thodes de cycle de vie » que vous pouvez surcharger pour exĂ©cuter du code Ă des moments prĂ©cis du processus. Vous pouvez utiliser ce diagramme de cycle de vie comme aide-mĂ©moire. Dans la liste ci-dessous, les mĂ©thodes de cycle de vie courantes sont indiquĂ©es en gras. Les autres sont lĂ pour des cas dâutilisation relativement rares.
Montage
Les mĂ©thodes suivantes sont appelĂ©es dans cet ordre lorsquâune instance dâun composant est créée puis insĂ©rĂ©e dans le DOM :
Remarque
Les méthodes suivantes sont considérées dépréciées et vous devriez les éviter dans vos nouveaux codes :
Mise Ă jour
Une mise Ă jour est dĂ©clenchĂ©e par des changements dans les props ou lâĂ©tat local. Les mĂ©thodes suivantes sont appelĂ©es dans cet ordre quand un composant se rafraĂźchit :
static getDerivedStateFromProps()
shouldComponentUpdate()
render()
getSnapshotBeforeUpdate()
componentDidUpdate()
Remarque
Les méthodes suivantes sont considérées dépréciées et vous devriez les éviter dans vos nouveaux codes :
Démontage
La méthode suivante est appelée quand un composant est retiré du DOM :
Gestion dâerreurs
Ces mĂ©thodes sont appelĂ©es lorsquâune erreur survient au sein de nâimporte quel composant enfant lors de son rendu, dans une mĂ©thode de cycle de vie, ou dans son constructeur.
Autres API
Chaque composant fournit par ailleurs quelques API supplémentaires :
Propriétés de classes
PropriĂ©tĂ©s dâinstances
Référence
Méthodes de cycle de vie couramment utilisées
Les mĂ©thodes de cette section couvrent la vaste majoritĂ© des cas dâutilisation que vous rencontrerez en crĂ©ant des composants React. Pour une rĂ©fĂ©rence visuelle, jetez un Ćil Ă ce diagramme de cycle de vie.
render()
render()
La méthode render()
est la seule méthode requise dans une classe de composant.
Lorsquâelle est appelĂ©e, elle examine en gĂ©nĂ©ral this.props
et this.state
et renvoie un des types suivants :
- ĂlĂ©ments React. Typiquement créés via JSX. Par exemple,
<div />
et<MyComponent />
sont des Ă©lĂ©ments React qui demandent Ă React de produire, respectivement, un nĆud DOM et un autre composant dĂ©fini par lâutilisateur. - Tableaux et fragments. Ils vous permettent de renvoyer plusieurs Ă©lĂ©ments racines depuis un rendu. Consultez la documentation des fragments pour plus de dĂ©tails.
- Portails. Ils permettent dâeffectuer le rendu des enfants dans une autre partie du DOM. Consultez la documentation des portails pour plus de dĂ©tails.
- ChaĂźnes de caractĂšres et nombres. Ils deviennent des nĆuds textuels dans le DOM.
- Booléens ou
null
. Ils ne produisent rien. (Ăa existe principalement pour permettre des motifs de code tels quereturn test && <Child />
, oĂčtest
serait booléen.)
La fonction render()
doit ĂȘtre pure, câest-Ă -dire quâelle ne doit rien changer Ă lâĂ©tat local du composant, doit renvoyer le mĂȘme rĂ©sultat chaque fois quâelle est invoquĂ©e (dans des conditions identiques), et ne doit pas interagir directement avec le navigateur.
Si vous avez besoin de telles interactions, faites-le plutĂŽt dans componentDidMount()
ou dâautres mĂ©thodes de cycle de vie. Sâassurer que render()
reste pure facilite la compréhension du fonctionnement des composants.
Remarque
render()
ne sera pas appelée sishouldComponentUpdate()
renvoiefalse
.
constructor()
constructor(props)
Si vous nâinitialisez pas dâĂ©tat local et ne liez pas de mĂ©thodes, vous nâavez pas besoin dâimplĂ©menter votre propre constructeur pour votre composant React.
Le constructeur dâun composant React est appelĂ© avant que celui-ci soit montĂ©. Quand on implĂ©mente le constructeur dâune sous-classe de React.Component
, il faut commencer par appeler super(props)
avant toute manipulation de this
. Dans le cas contraire, outre une éventuelle erreur de syntaxe ES6, this.props
sera undefined
dans le constructeur, ce qui peut causer des bugs.
Les constructeurs React sont habituellement utilisés pour deux raisons seulement :
- Initialiser lâĂ©tat local en affectant un objet Ă
this.state
. - Lier des mĂ©thodes gestionnaires dâĂ©vĂ©nements Ă lâinstance.
Vous ne devez pas appeler setState()
dans le constructor()
. Au lieu de ça, si votre composant a besoin dâutiliser lâĂ©tat local, affectez directement lâĂ©tat initial Ă this.state
dans le constructeur :
constructor(props) {
super(props);
// Nâappelez pas `this.setState()` ici !
this.state = { counter: 0 };
this.handleClick = this.handleClick.bind(this);
}
Le constructeur est le seul endroit oĂč vous devriez affecter directement une valeur Ă this.state
. Dans toutes les autres méthodes, utilisez plutÎt this.setState()
.
Ăvitez aussi de mettre en place des effets de bord ou abonnements dans le constructeur. Dans ces cas-lĂ , prĂ©fĂ©rez componentDidMount()
.
Remarque
Ăvitez de copier les props dans lâĂ©tat local ! Câest une erreur courante :
constructor(props) { super(props); // Ne faites pas ça ! this.state = { color: props.color }; }
Le problĂšme est double : dâune part, câest superflu (vous pouvez plutĂŽt utiliser directement
this.props.color
), dâautre part ça crĂ©e des bugs (les mises Ă jour de la propcolor
ne seront pas reflĂ©tĂ©es dans lâĂ©tat local).Nâutilisez cette approche que si vous avez lâintention dâignorer les mises Ă jour de la prop. Dans un tel cas, il serait judicieux de renommer la
prop
vers quelque chose commeinitialColor
oudefaultColor
. Vous pouvez ensuite forcer le composant à « réinitialiser » son état interne en changeant sakey
lorsque câest nĂ©cessaire.Pour apprendre quelle approche utiliser lorsque vous pensez quâune partie de votre Ă©tat doit dĂ©pendre des props, lisez notre article sur lâart dâĂ©viter un Ă©tat dĂ©rivĂ©.
componentDidMount()
componentDidMount()
componentDidMount()
est appelĂ©e immĂ©diatement aprĂšs que le composant est montĂ© (insĂ©rĂ© dans lâarbre). Câest ici que vous devriez placer les initialisations qui requiĂšrent lâexistence de nĆuds du DOM. Si vous avez besoin de charger des donnĂ©es depuis un point dâaccĂšs distant, câest aussi le bon endroit pour dĂ©clencher votre requĂȘte rĂ©seau.
Câest enfin lĂ que vous devriez mettre en place vos abonnements. Si vous en faites, nâoubliez pas de vous dĂ©sabonner dans componentWillUnmount()
.
Vous avez le droit dâappeler setState()
directement dans componentDidMount()
. Ăa dĂ©clenchera un rendu supplĂ©mentaire, mais il surviendra avant que le navigateur ne mette Ă jour lâĂ©cran. Ainsi, vous avez la garantie que mĂȘme si render()
est appelĂ©e deux fois dans ce cas prĂ©cis, lâutilisateur ne verra pas lâĂ©tat intermĂ©diaire. Utilisez toutefois cette façon de faire avec prĂ©caution parce quâelle nuit souvent Ă la performance. Dans la plupart des cas, vous devriez plutĂŽt pouvoir initialiser lâĂ©tat local dans le constructor()
. Ceci Ă©tant dit, dans certains cas tels que les boĂźtes de dialogues et infobulles, qui ont souvent besoin de mesurer un nĆud du DOM avant dâafficher quelque chose qui dĂ©pend de leur taille ou de leur position, ce second rendu peut sâavĂ©rer nĂ©cessaire.
componentDidUpdate()
componentDidUpdate(prevProps, prevState, snapshot)
componentDidUpdate()
est appelĂ©e immĂ©diatement aprĂšs que la mise Ă jour a eu lieu. Cette mĂ©thode nâest pas appelĂ©e pour le rendu initial.
Elle vous donne lâopportunitĂ© de travailler sur le DOM une fois que le composant a Ă©tĂ© mis Ă jour. Câest aussi un bon endroit pour faire des requĂȘtes rĂ©seau, du moment que vous prenez soin de vĂ©rifier que les props actuelles concernĂ©es diffĂšrent des anciennes props (dans le sens oĂč une requĂȘte rĂ©seau est peut-ĂȘtre superflue si les props en question nâont pas changĂ©).
componentDidUpdate(prevProps) {
// Utilisation classique (pensez bien Ă comparer les props) :
if (this.props.userID !== prevProps.userID) {
this.fetchData(this.props.userID);
}
}
Vous avez le droit dâappeler setState()
directement dans componentDidUpdate()
mais notez bien que vous devez lâenrober dans une condition, comme dans lâexemple ci-dessus, ou vous obtiendrez lâĂ©quivalent dâune boucle infinie. LĂ aussi, vous dĂ©clencherez un rendu supplĂ©mentaire qui, mĂȘme sâil nâest pas perceptible par lâutilisateur, peut affecter la performance du composant. Si vous essayez de « reflĂ©ter » dans lâĂ©tat local une prop venant de plus haut, voyez si vous ne pouvez pas plutĂŽt utiliser directement la prop. Vous pouvez en apprendre davantage sur les raisons pour lesquelles copier des props dans lâĂ©tat local est source de bugs.
Si votre composant implémente la méthode de cycle de vie getSnapshotBeforeUpdate()
(ce qui est rare), la valeur retournée par celle-ci sera passée comme troisiÚme argument snapshot
Ă componentDidUpdate()
. Dans le cas inverse, cet argument sera undefined
.
Remarque
componentDidUpdate()
ne sera pas appelée sishouldComponentUpdate()
renvoiefalse
.
componentWillUnmount()
componentWillUnmount()
componentWillUnmount()
est appelĂ©e immĂ©diatement avant quâun composant soit dĂ©montĂ© ou dĂ©truit. Mettez-y tout nettoyage nĂ©cessaire, tel que lâinvalidation de minuteurs, lâannulation de requĂȘtes rĂ©seau, ou la rĂ©siliation dâabonnements effectuĂ©s dans componentDidMount()
Vous ne devez pas appeler setState()
dans componentWillUnmount()
car le composant ne sera de toutes façons jamais rĂ©-affichĂ©. Une fois lâinstance du composant dĂ©montĂ©e, elle ne sera plus jamais re-montĂ©e.
Méthodes de cycle de vie rarement utilisées
Les mĂ©thodes de cette section sont liĂ©es Ă des cas dâutilisation peu frĂ©quents. Elles peuvent sâavĂ©rer utiles de temps en temps, mais la plupart de vos composants nâen auront sans doute jamais besoin. Vous pouvez voir la plupart de ces mĂ©thods dans ce diagramme de cycle de vie en cochant la case « Montrer les cycles de vie moins courants » au-dessus.
shouldComponentUpdate()
shouldComponentUpdate(nextProps, nextState)
Utilisez shouldComponentUpdate()
pour indiquer Ă React que la sortie dâun composant nâest pas affectĂ©e par la modification en cours de lâĂ©tat local ou des props. Le comportement par dĂ©faut consiste Ă rafraĂźchir Ă chaque modification, et pour la vaste majoritĂ© des cas vous devriez en rester lĂ .
shouldComponentUpdate()
est appelée avant le rendu quand de nouvelles props ou un nouvel état local sont reçues. Par défaut, elle renvoie true
. Cette mĂ©thode nâest pas appelĂ©e avant le rendu initial ou lorsque forceUpdate()
est utilisée.
Cette mĂ©thode nâexiste quâen tant quâoptimisation de performance. Ne vous en servez pas pour « empĂȘcher » un rafraĂźchissement, car ça finirait par causer des bugs. Utilisez alors plutĂŽt la classe de base prĂ©dĂ©finie PureComponent
. Celle-ci effectue une comparaison de surface des props et de lâĂ©tat local, ce qui rĂ©duit les risques de sauter une mise Ă jour nĂ©cessaire.
Si vous ĂȘtes certain·e de vouloir lâĂ©crire Ă la main, vous pouvez comparer this.props
avec nextProps
et this.state
avec nextState
, et renvoyer false
pour indiquer Ă React de sauter la mise Ă jour. Remarquez que renvoyer false
nâempĂȘche pas les composants fils de se rafraĂźchir quand leur Ă©tat change.
Nous vous déconseillons de recourir à une comparaison profonde ou à JSON.stringify()
dans shouldComponentUpdate()
. Ce sont des techniques coûteuses qui dégraderont les performances.
Ă lâheure actuelle, si shouldComponentUpdate()
renvoie false
, alors UNSAFE_componentWillUpdate()
, render()
, et componentDidUpdate()
ne seront pas appelĂ©es. Ă lâavenir React se rĂ©serve le droit de considĂ©rer shouldComponentUpdate()
comme étant « consultatif » plutÎt que contraignant, de sorte que renvoyer false
pourrait tout de mĂȘme aboutir Ă un rafraĂźchissement du composant.
static getDerivedStateFromProps()
static getDerivedStateFromProps(props, state)
getDerivedStateFromProps
est appelĂ©e juste avant dâappeler la mĂ©thode render()
, aussi bien pour le montage initial que lors des mises Ă jour ultĂ©rieures. Elle doit renvoyer un objet qui mette Ă jour lâĂ©tat, ou null
faute de mise Ă jour.
Cette mĂ©thode existe pour les rares cas oĂč lâĂ©tat dĂ©pend bien des changements de props au fil du temps. Par exemple, elle peut ĂȘtre utile pour implĂ©menter un composant <Transition>
qui comparerait les enfants précédents et suivants pour décider lesquels animer en entrée et en sortie.
DĂ©river lâĂ©tat entraĂźne gĂ©nĂ©ralement des composants au code verbeux et difficile Ă suivre. Assurez-vous quâune meilleure alternative nâexiste pas :
- Si vous avez besoin de réaliser un effet de bord (par exemple, charger des données ou dérouler une animation) en réponse à une modification des props, utilisez plutÎt la méthode de cycle de vie
componentDidUpdate
. - Si vous voulez recalculer des données seulement quand une prop change, utilisez plutÎt un utilitaire de mémoïsation.
- Si vous souhaitez « rĂ©initialiser » une partie de lâĂ©tat local quand une prop change, voyez sâil ne serait pas plutĂŽt judicieux de rendre le composant pleinement contrĂŽlĂ© ou pleinement non-contrĂŽlĂ© avec une
key
.
Cette mĂ©thode nâa pas accĂšs Ă lâinstance de composant. Si vous le souhaitez, vous pouvez rĂ©utiliser du code entre getDerivedStateFromProps()
et les autres mĂ©thodes de la classe en extrayant des fonctions pures appelĂ©es avec les props et lâĂ©tat local du composant, pour les placer hors de la dĂ©finition de la classe.
Remarquez que cette mĂ©thode est dĂ©clenchĂ©e avant chaque rendu, quelle quâen soit la cause. Câest le contraire de UNSAFE_componentWillReceiveProps
, qui nâest dĂ©clenchĂ©e que lorsque votre composant parent vous rafraĂźchit, et non comme rĂ©sultat dâun setState()
local.
getSnapshotBeforeUpdate()
getSnapshotBeforeUpdate(prevProps, prevState)
getSnapshotBeforeUpdate()
est appelĂ©e juste avant que le rendu le plus rĂ©cent ne soit validĂ©, par exemple envoyĂ© au DOM. Elle vous permet de capturer des infos du DOM courant (ex. la position de dĂ©filement) avant quâil ne subisse dâĂ©ventuelles modifications. Toute valeur renvoyĂ©e par cette mĂ©thode de cycle de vie sera passĂ©e comme argument Ă componentDidUpdate()
.
Câest un cas dâutilisation peu commun, mais il peut survenir dans des UI comme une discussion en ligne qui a besoin de gĂ©rer la position de dĂ©filement dâune façon spĂ©cifique.
Il faut renvoyer une valeur capturée (ou null
).
Par exemple :
class ScrollingList extends React.Component {
constructor(props) {
super(props);
this.listRef = React.createRef();
}
getSnapshotBeforeUpdate(prevProps, prevState) {
// Sommes-nous en train dâajouter de nouveaux Ă©lĂ©ments Ă la liste ?
// Sauvegardons la position de défilement pour la recaler plus tard.
if (prevProps.list.length < this.props.list.length) {
const list = this.listRef.current;
return list.scrollHeight - list.scrollTop;
}
return null;
}
componentDidUpdate(prevProps, prevState, snapshot) {
// Si nous avons une valeur sauvegardĂ©e, câest que nous venons dâajouter des
// éléments. Ajustons le défilement pour que ces nouveaux éléments ne
// décalent pas les anciens hors du champ de vision. (ici `snapshot` est la
// valeur renvoyée par getSnapshotBeforeUpdate.)
if (snapshot !== null) {
const list = this.listRef.current;
list.scrollTop = list.scrollHeight - snapshot;
}
}
render() {
return (
<div ref={this.listRef}>{/* ...contenu... */}</div>
);
}
}
Dans lâexemple ci-dessus, il est important quâon puisse lire la propriĂ©tĂ© scrollHeight
dans getSnapshotBeforeUpdate
, parce quâil peut y avoir un dĂ©lai entre les mĂ©thodes de cycle de vie de la « phase de rendu » (comme render
) et celles de la « phase de commit » (comme getSnapshotBeforeUpdate
et componentDidUpdate
).
PĂ©rimĂštres dâerreurs
Les pĂ©rimĂštres dâerreurs (error boundaries, NdT) sont des composants React qui interceptent toute erreur JavaScript survenant dans lâarbre de composants de leurs enfants, loguent ces erreurs, et affichent une UI de remplacement au lieu de lâarbre de composants qui a plantĂ©.
Les pĂ©rimĂštres dâerreurs capturent les erreurs survenant dans le rendu, les mĂ©thodes de cycle de vie, et les constructeurs de tout lâarbre en-dessous dâeux.
Un composant basĂ© classe devient un pĂ©rimĂštre dâerreur sâil dĂ©finit au moins une des mĂ©thodes de cycle de vie static getDerivedStateFromError()
ou componentDidCatch()
. Mettre Ă jour votre Ă©tat local au sein de ces mĂ©thodes vous permet dâintercepter une erreur JavaScript non gĂ©rĂ©e dans lâarbre en-dessous de vous, et dâafficher Ă la place une UI de remplacement.
Nâutilisez les pĂ©rimĂštres dâerreurs que pour retomber sur vos pieds lors dâexceptions inattendues ; ne les utilisez pas comme primitives de contrĂŽle de flux.
Pour en apprendre davantage, lisez Gestion dâErreurs dans React 16.
Remarque
Les pĂ©rimĂštres dâerreurs nâinterceptent que les erreurs dans les composants en-dessous dâeux dans lâarbre. Un pĂ©rimĂštre dâerreur ne peut pas capturer une erreur survenue en son propre sein.
static getDerivedStateFromError()
static getDerivedStateFromError(error)
Cette mĂ©thode de cycle de vie est appelĂ©e aprĂšs quâune erreur a Ă©tĂ© levĂ©e par un composant descendant. Elle reçoit lâerreur levĂ©e comme paramĂštre et doit renvoyer une valeur qui mette Ă jour lâĂ©tat.
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) { // On met Ă jour lâĂ©tat afin que le prochain rendu affiche // lâUI de remplacement. return { hasError: true }; }
render() {
if (this.state.hasError) { // Vous pouvez afficher ici nâimporte quelle UI de secours return <h1>Ăa sent le brĂ»lĂ©.</h1>; }
return this.props.children;
}
}
Remarque
getDerivedStateFromError()
est appelée pendant la « phase de rendu », de sorte que les effets de bord y sont interdits. Si vous en avez besoin, utilisez plutÎtcomponentDidCatch()
.
componentDidCatch()
componentDidCatch(error, info)
Cette mĂ©thode de cycle de vie est appelĂ©e aprĂšs quâune erreur a Ă©tĂ© levĂ©e par un composant descendant. Elle reçoit deux arguments :
error
- Lâerreur qui a Ă©tĂ© levĂ©e.info
- Un objet avec une propriétécomponentStack
contenant des informations sur le composant qui a levĂ© lâerreur.
componentDidCatch()
est appelĂ©e durant la « phase de commit », donc les effets de bord y sont autorisĂ©s. On peut lâutiliser par exemple pour loguer les erreurs :
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// On met Ă jour lâĂ©tat afin que le prochain rendu affiche
// lâUI de remplacement.
return { hasError: true };
}
componentDidCatch(error, info) { // Exemple de `componentStack` : // in ComponentThatThrows (created by App) // in ErrorBoundary (created by App) // in div (created by App) // in App logComponentStackToMyService(info.componentStack); }
render() {
if (this.state.hasError) {
// Vous pouvez afficher ici nâimporte quelle UI de secours
return <h1>Ăa sent le brĂ»lĂ©.</h1>;
}
return this.props.children;
}
}
Production and development builds of React slightly differ in the way componentDidCatch()
handles errors.
On development, the errors will bubble up to window
, this means that any window.onerror
or window.addEventListener('error', callback)
will intercept the errors that have been caught by componentDidCatch()
.
On production, instead, the errors will not bubble up, which means any ancestor error handler will only receive errors not explicitly caught by componentDidCatch()
.
Remarque
Si une erreur survient, vous pouvez dĂ©clencher lâaffichage dâune UI de remplacement avec
componentDidCatch()
en appelantsetState
, mais une future version de React dépréciera cette possibilité. Utilisez plutÎtstatic getDerivedStateFromError()
pour dĂ©clencher lâaffichage de lâUI de remplacement.
Méthodes de cycle de vie dépréciées
Les méthodes de cycle de vie ci-dessous sont « historiques » (legacy, NdT), et à ce titre sont considérées comme dépréciées. Elles fonctionnent encore, mais nous les déconseillons dans tout nouveau code. Vous pouvez en apprendre davantage sur la bonne façon de faire migrer ces méthodes dans cet article sur notre blog.
UNSAFE_componentWillMount()
UNSAFE_componentWillMount()
Remarque
Cette mĂ©thode de cycle de vie sâappelait Ă lâorigine
componentWillMount
. Ce nom continuera Ă fonctionner jusquâĂ la sortie de React 17. Utilisez le codemodrename-unsafe-lifecycles
pour mettre Ă jour automatiquement vos composants.
UNSAFE_componentWillMount()
est appelĂ©e juste avant que le montage nâait lieu. Elle est appelĂ©e avant render()
, de sorte quâappeler setState()
de façon synchrone au sein de cette mĂ©thode ne dĂ©clenchera pas un rendu supplĂ©mentaire. Mais gĂ©nĂ©ralement, nous conseillons plutĂŽt dâutiliser constructor()
pour initialiser lâĂ©tat.
Ăvitez dâintroduire des effets de bord ou dâeffectuer des abonnements dans cette mĂ©thode. Pour de tels besoins, utilisez plutĂŽt componentDidMount()
.
Câest la seule mĂ©thode de cycle de vie appelĂ©e lors dâun rendu cĂŽtĂ© serveur.
UNSAFE_componentWillReceiveProps()
UNSAFE_componentWillReceiveProps(nextProps)
Remarque
Cette mĂ©thode de cycle de vie sâappelait Ă lâorigine
componentWillReceiveProps
. Ce nom continuera Ă fonctionner jusquâĂ la sortie de React 17. Utilisez le codemodrename-unsafe-lifecycles
pour mettre Ă jour automatiquement vos composants.
Attention
Utiliser cette méthode de cycle de vie aboutit le plus souvent à des bugs de cohérence.
- Si vous aviez besoin de réaliser un effet de bord (par exemple, charger des données ou dérouler une animation) en réponse à une modification des props, utilisez plutÎt la méthode de cycle de vie
componentDidUpdate
.- Si vous utilisiez
componentWillReceiveProps
pour recalculer des données seulement quand une prop change, utilisez plutÎt un utilitaire de mémoïsation.- Si vous utilisiez
componentWillReceiveProps
pour « rĂ©initialiser » une partie de lâĂ©tat local quand une prop change, voyez sâil ne serait pas plutĂŽt judicieux de rendre le composant pleinement contrĂŽlĂ© ou pleinement non-contrĂŽlĂ© avec unekey
.Pour les autres cas, suivez les recommandations de notre article de blog sur la dĂ©rivation dâĂ©tat.
UNSAFE_componentWillReceiveProps()
est appelĂ©e avant que le composant dĂ©jĂ montĂ© reçoive de nouvelles props. Si vous avez besoin de mettre Ă jour lâĂ©tat en rĂ©ponse Ă des changements de props (par exemple, pour le rĂ©initialiser), vous pourriez comparer this.props
et nextProps
, et dĂ©clencher des transitions dâĂ©tat local en utilisant this.setState()
au sein de cette méthode.
Remarquez que si un composant parent dĂ©clenche le rafraĂźchissement du vĂŽtre, cette mĂ©thode sera appelĂ©e mĂȘme si les props nâont pas changĂ©. Assurez-vous donc de comparer les valeurs actuelles et futures si vous voulez ne traiter que les modifications.
React nâappelle pas UNSAFE_componentWillReceiveProps()
avec les props initiales lors du montage. Il ne lâappelle que si au moins une partie des props du composant est susceptible de changer. Appeler this.setState()
ne déclenche généralement pas UNSAFE_componentWillReceiveProps()
.
UNSAFE_componentWillUpdate()
UNSAFE_componentWillUpdate(nextProps, nextState)
Remarque
Cette mĂ©thode de cycle de vie sâappelait Ă lâorigine
componentWillUpdate
. Ce nom continuera Ă fonctionner jusquâĂ la sortie de React 17. Utilisez le codemodrename-unsafe-lifecycles
pour mettre Ă jour automatiquement vos composants.
UNSAFE_componentWillUpdate()
est appelĂ©e juste avant le rendu, quand de nouvelles props ou un nouvel Ă©tat ont Ă©tĂ© reçus. Câest lâoccasion de faire des travaux prĂ©paratoires avant que la mise Ă jour nâait lieu. Cette mĂ©thode nâest pas appelĂ©e avant le rendu initial.
Remarquez que vous ne pouvez pas appeler this.setState()
ici ; vous ne devez pas non plus faire quoi que ce soit (comme par exemple dispatcher une action Redux) qui entraĂźnerait une mise Ă jour dâun composant React avant que UNSAFE_componentWillUpdate()
ne se termine.
En gĂ©nĂ©ral, cette mĂ©thode peut ĂȘtre remplacĂ©e par componentDidUpdate()
. Si vous y lisiez des données provenant du DOM (par exemple, la position de défilement), vous pouvez en déplacer le code dans getSnapshotBeforeUpdate()
.
Remarque
UNSAFE_componentWillUpdate()
ne sera pas appelée sishouldComponentUpdate()
renvoiefalse
.
Autres API
Contrairement aux mĂ©thodes de cycle de vie ci-dessus (que React appelle pour vous), câest vous qui appelez les mĂ©thodes ci-dessous depuis vos composants.
Il nây en a que deux : setState()
et forceUpdate()
.
setState()
setState(updater[, callback])
setState()
planifie des modifications Ă lâĂ©tat local du composant, et indique Ă React que ce composant et ses enfants ont besoin dâĂȘtre rafraĂźchis une fois lâĂ©tat mis Ă jour. Câest en gĂ©nĂ©ral ainsi quâon met Ă jour lâinterface utilisateur en rĂ©action Ă des Ă©vĂ©nements ou rĂ©ponses rĂ©seau.
Visualisez setState()
comme une demande plutĂŽt que comme une commande immĂ©diate qui mettrait Ă jour le composant. Afin dâamĂ©liorer la performance perçue, React peut diffĂ©rer son traitement, pour ensuite mettre Ă jour plusieurs composants en une seule passe. React ne garantit pas que les mises Ă jour dâĂ©tat sont appliquĂ©es immĂ©diatement.
setState()
ne met pas toujours immédiatement le composant à jour. Il peut regrouper les mises à jour voire les différer. En conséquence, lire la valeur de this.state
juste aprÚs avoir appelé setState()
est une mauvaise idée. Utilisez plutÎt componentDidUpdate
ou la fonction de rappel de setState
(setState(updater, callback)
), les deux bĂ©nĂ©ficiant dâune garantie de dĂ©clenchement aprĂšs que la mise Ă jour aura Ă©tĂ© appliquĂ©e. Si vous avez besoin de mettre Ă jour lâĂ©tat sur base de sa valeur prĂ©cĂ©dente, lisez plus bas comment fonctionne lâargument updater
.
setState()
causera toujours un rendu, Ă moins que shouldComponentUpdate()
ne renvoie false
. Si vous y utilisez des objets modifiables et que la logique de rendu conditionnel ne peut pas ĂȘtre implĂ©mentĂ©e dans shouldComponentUpdate()
, appeler setState()
seulement quand le nouvel état diffÚre du précédent évitera des rafraßchissements superflus.
Le premier argument updater
est une fonction dont la signature est :
(state, props) => stateChange
state
est une rĂ©fĂ©rence Ă lâĂ©tat local du composant au moment oĂč cette modification est appliquĂ©e. Cet Ă©tat ne devrait pas ĂȘtre modifiĂ© directement. Au lieu de ça, on reprĂ©sente les changements Ă apporter en construisant un nouvel objet basĂ© sur les donnĂ©es entrantes de state
et props
. Par exemple, imaginons que nous voulions incrĂ©menter une valeur dans lâĂ©tat Ă raison de props.step
:
this.setState((state, props) => {
return {counter: state.counter + props.step};
});
Tant le state
que le props
reçus par la fonction de mise Ă jour sont garantis Ă jour au moment de lâappel. La valeur de retour de la fonction est fusionnĂ©e (en surface, pas rĂ©cursivement) avec state
.
Le second argument de setState()
est une fonction de rappel optionnelle qui sera exécutée une fois que setState
est terminĂ© et le composant rafraĂźchi. Dâune façon gĂ©nĂ©rale, nous vous recommandons plutĂŽt dâutiliser componentDidUpdate()
pour ce genre de besoin.
Vous pouvez choisir de passer un objet au lieu dâune fonction comme premier argument Ă setState()
:
setState(stateChange[, callback])
Ăa procĂšde Ă la fusion de surface de stateChange
dans le nouvel Ă©tat, par exemple pour ajuster la quantitĂ© dâune ligne de commande dans un panier dâachats :
this.setState({quantity: 2})
Cette forme dâappel Ă setState()
reste asynchrone, et des appels rĂ©pĂ©tĂ©s au sein du mĂȘme cycle pourraient ĂȘtre regroupĂ©s. Ainsi, si vous tentez dâincrĂ©menter une quantitĂ© plus dâune fois dans le mĂȘme cycle, vous obtiendrez lâĂ©quivalent de ceci :
Object.assign(
previousState,
{quantity: state.quantity + 1},
{quantity: state.quantity + 1},
...
)
Les appels ultĂ©rieurs vont Ă©craser les valeurs des appels prĂ©cĂ©dents du mĂȘme cycle, de sorte que la quantitĂ© ne sera rĂ©ellement incrĂ©mentĂ©e quâune fois. Lorsque lâĂ©tat suivant dĂ©pend de lâĂ©tat en vigueur, nous vous recommandons de toujours utiliser la forme fonctionnelle du paramĂštre updater
:
this.setState((state) => {
return {quantity: state.quantity + 1};
});
Pour explorer ce sujet plus en détail, vous pouvez consulter :
- Le guide Ătat et cycle de vie
- En profondeur : Quand et pourquoi les appels Ă
setState()
sont-ils regroupés ? (en anglais) - En profondeur : Pourquoi
this.state
ne déclenche-t-il pas une mise à jour immédiate ? (en anglais)
forceUpdate()
component.forceUpdate(callback)
Par dĂ©faut, lorsque lâĂ©tat local ou les props de votre composant changent, ce dernier se rafraĂźchit. Si votre mĂ©thode render()
dĂ©pend dâautres donnĂ©es, vous pouvez indiquer Ă React que le composant a besoin dâun rafraĂźchissement en appelant forceUpdate()
.
Appeler forceUpdate()
déclenchera le render()
du composant, en faisant lâimpasse sur shouldComponentUpdate()
. Ăa dĂ©clenchera les mĂ©thodes usuelles de cycle de vie des composants enfants, y compris la mĂ©thode shouldComponentUpdate()
de chaque enfant. React continuera Ă ne mettre Ă jour le DOM que si le balisage change.
De façon générale, vous devriez tout faire pour éviter de recourir à forceUpdate()
, et faire que votre render()
ne lise que this.props
et this.state
.
Propriétés de classes
defaultProps
defaultProps
peut ĂȘtre dĂ©finie comme propriĂ©tĂ© sur la classe du composant elle-mĂȘme, pour dĂ©finir les valeurs par dĂ©faut de props pour cette classe. On sâen sert pour les props undefined
, mais pas pour celles Ă null
. Par exemple :
class CustomButton extends React.Component {
// ...
}
CustomButton.defaultProps = {
color: 'blue'
};
Si props.color
nâest pas fournie, elle sera dĂ©finie par dĂ©faut Ă 'blue'
:
render() {
return <CustomButton /> ; // props.color sera définie à 'blue'
}
Si props.color
est définie à null
, elle restera Ă null
:
render() {
return <CustomButton color={null} /> ; // props.color reste Ă `null`
}
displayName
La chaĂźne de caractĂšres displayName
est utilisĂ©e dans les messages de dĂ©bogage. La plupart du temps, vous nâavez pas besoin de la dĂ©finir explicitement parce quâelle est dĂ©duite du nom de la fonction ou classe qui dĂ©finit le composant. Mais on peut vouloir la dĂ©finir lorsquâon veut afficher un nom diffĂ©rent pour des raisons de dĂ©bogage ou lorsquâon crĂ©e un composant dâordre supĂ©rieur : vous trouverez plus de dĂ©tails dans Enrober le nom dâaffichage pour faciliter le dĂ©bogage.
PropriĂ©tĂ©s dâinstances
props
this.props
contient les props dĂ©finies par lâappelant de ce composant. Consultez Composants et props pour une introduction aux props.
Cas particulier : this.props.children
est spĂ©ciale, gĂ©nĂ©ralement dĂ©finie par les balises enfants dans lâexpression JSX plutĂŽt que dans la balise du composant lui-mĂȘme.
state
LâĂ©tat local contient des donnĂ©es spĂ©cifiques Ă ce composant, qui sont susceptibles dâĂ©voluer avec le temps. Câest vous qui dĂ©finissez lâĂ©tat local, qui devrait ĂȘtre un objet JavaScript brut.
Lorsquâune valeur nâest utilisĂ©e ni par lâaffichage ni par le flux de donnĂ©es (par exemple, un ID de minuteur), vous nâavez pas Ă la mettre dans lâĂ©tat local. Ce genre de valeurs peuvent ĂȘtre stockĂ©es comme champs de lâinstance de composant.
Consultez Ătat et cycle de vie pour de plus amples informations sur lâĂ©tat local.
Ne modifiez jamais this.state
directement, car appeler setState()
par la suite risque dâĂ©craser les modifications que vous auriez apportĂ©es. Traitez this.state
comme sâil Ă©tait immuable.