We want to hear from you!Take our 2021 Community Survey!
This site is no longer updated.Go to react.dev

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 :

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 que return 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 si shouldComponentUpdate() renvoie false.


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 :

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 prop color 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 comme initialColor ou defaultColor. Vous pouvez ensuite forcer le composant Ă  « rĂ©initialiser Â» son Ă©tat interne en changeant sa key 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 si shouldComponentUpdate() renvoie false.


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 :

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ĂŽt componentDidCatch().


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 :

  1. error - L’erreur qui a Ă©tĂ© levĂ©e.
  2. 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 appelant setState, mais une future version de React dĂ©prĂ©ciera cette possibilitĂ©. Utilisez plutĂŽt static 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 codemod rename-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 codemod rename-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.

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 codemod rename-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 si shouldComponentUpdate() renvoie false.


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 :


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.

Avez-vous trouvĂ© cette page utile ?Modifier cette page