React.Component — les composants de classe et leur fonctionnement

Auteur : IT Sectr Publié le : 2026-07-04 Temps de lecture : 9 min

React.Component est la classe de base pour créer des composants avec héritage dans React. Avant l'introduction des hooks dans la version 16.8, les composants de classe étaient le seul moyen de gérer l'état et le cycle de vie. Selon React, 2024, les composants de classe sont toujours pris en charge, bien que les composants fonctionnels avec hooks soient recommandés pour les nouveaux projets.

Points clés

  • React.Component est la classe de base dont héritent les composants de classe via extends Component.
  • État est géré via this.state et mis à jour uniquement via this.setState — la mutation directe est interdite.
  • Cycle de vie comprend les méthodes componentDidMount, componentDidUpdate et componentWillUnmount.
  • this dans les méthodes de classe nécessite une liaison de contexte — via bind, les fonctions fléchées ou les class fields.
  • Migration vers les composants fonctionnels peut être progressive : hooks et classes peuvent coexister dans un même projet.

Qu'est-ce que React.Component ?

React.Component est une classe abstraite qui fournit des méthodes intégrées pour travailler avec l'état, les props et le cycle de vie du composant. Pour créer un composant de classe, vous devez définir une classe qui étend React.Component et implémenter la méthode render.

React.Component est apparu dans la toute première version de React (2013) et est resté la méthode principale de création de composants pendant cinq ans. L'écosystème React a été construit autour des classes : les composants d'ordre supérieur (HOC), les render props, le contexte — tous ces modèles ont été implémentés avec la syntaxe de classe.

Avec la sortie de React 16.8 en 2019, l'équipe React a introduit les hooks comme alternative aux classes. Les hooks résolvaient les mêmes problèmes — état, effets, contexte — mais sans héritage ni liaison complexe de contexte. React.Component reste entièrement pris en charge, mais l'approche fonctionnelle est recommandée pour les nouveaux projets.

Créer un composant de classe

Le composant de classe minimal est une classe avec une seule méthode render qui retourne un élément React. render est la seule méthode obligatoire. Elle doit être une fonction pure de this.props et this.state : le même ensemble de props et d'état produit le même résultat.

js
import React, { Component } from 'react';

class Welcome extends Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

Constructeur et initialisation de l'état

Le constructeur s'exécute avant le montage. Il appelle super(props) pour passer les props à la classe parente et initialise this.state. Utiliser le constructeur à d'autres fins — abonnements, appels API — n'est pas recommandé ; componentDidMount existe pour cela.

js
class Counter extends Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  render() {
    return <p>Count: {this.state.count}</p>;
  }
}

Gestion d'état avec this.state et this.setState

this.state est un objet contenant les données du composant. Le muter directement (this.state.count = 1) est interdit — cela ne déclenche pas de nouveau rendu et brise la prévisibilité. L'état doit être mis à jour via this.setState, qui crée un nouvel objet d'état et déclenche un nouveau rendu.

setState peut accepter un objet ou une fonction. La forme fonctionnelle est préférée lorsque le nouvel état dépend du précédent : this.setState(prev => ({ count: prev.count + 1 })). React peut regrouper plusieurs appels setState en un seul lot pour optimiser les performances.

js
class Toggle extends Component {
  constructor(props) {
    super(props);
    this.state = { isOn: false };
  }

  handleClick() {
    this.setState(prev => ({ isOn: !prev.isOn }));
  }

  render() {
    return (
      <button onClick={() => this.handleClick()}>
        {this.state.isOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}

Une propriété importante de setState est qu'il est asynchrone. Après avoir appelé setState, l'état n'est pas mis à jour immédiatement. Si vous devez effectuer une action après la mise à jour, passez un callback en second argument : this.setState(newState, () => console.log(this.state)).

Méthodes du cycle de vie

Les composants de classe ont des méthodes prédéfinies que React appelle à des moments spécifiques. Montage — constructor → render → componentDidMount. Mise à jour — render → componentDidUpdate. Démontage — componentWillUnmount.

MéthodePhaseObjectif
constructorMontageInitialiser l'état et lier les méthodes
renderChaque foisRetourner des éléments React (obligatoire)
componentDidMountAprès montageRequêtes API, abonnements, temporisateurs
componentDidUpdateAprès mise à jourRéagir aux changements de props/état
componentWillUnmountAvant suppressionNettoyer abonnements, temporisateurs, écouteurs d'événements

ComponentDidMount — récupération de données

componentDidMount est l'endroit principal pour les effets de bord après le premier rendu. Ici, vous effectuez des requêtes HTTP, établissez des connexions WebSocket et démarrez des temporisateurs. Si vous ne nettoyez pas l'abonnement dans componentWillUnmount, une fuite de mémoire se produit.

js
class UserProfile extends Component {
  componentDidMount() {
    fetch(`/api/users/${this.props.userId}`)
      .then(res => res.json())
      .then(data => this.setState({ user: data }));
  }

  componentWillUnmount() {
    // Cancel request on unmount
  }

  render() {
    return <div>{this.state.user?.name}</div>;
  }
}

Liaison du contexte this dans les méthodes

En JavaScript, les méthodes de classe ne sont pas liées à l'instance par défaut. Si vous passez une méthode comme callback — à un gestionnaire d'événement, à un temporisateur — this sera undefined (en mode strict) ou window (sans mode strict). Sans liaison, this.setState lancera une erreur.

Il y a trois façons de lier : bind dans le constructeur, une fonction fléchée dans le callback et un class field avec fonction fléchée. La première méthode est la recommandation officielle de React : lier une fois dans le constructeur, sans recréer la fonction à chaque rendu.

js
// Method 1: bind in constructor (recommended)
class MyComponent extends Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState({ clicked: true });
  }

  render() {
    return <button onClick={this.handleClick}>Click</button>;
  }
}

Class fields — syntaxe moderne avec liaison automatique. Une fonction fléchée dans une propriété de classe capture this depuis la portée du constructeur. L'inconvénient est que la méthode est créée sur chaque instance, pas sur le prototype, ce qui augmente l'utilisation mémoire pour des centaines de composants du même type.

Composants de classe vs fonctionnels

Le choix entre classe et fonction n'est pas qu'une question de syntaxe. Les composants fonctionnels avec hooks résolvent des problèmes inhérents aux classes : duplication de logique dans différentes méthodes du cycle de vie (componentDidMount + componentDidUpdate), complexité avec this et incapacité d'extraire la logique connexe dans un bloc réutilisable.

Les composants fonctionnels sont plus faciles à tester — ils n'ont pas d'état interne (qui avant les hooks n'était disponible que dans les classes) et ne nécessitent pas de montage dans le DOM pour vérifier les callbacks. React recommande les composants fonctionnels pour tous les nouveaux projets ; la documentation et les exemples sont écrits avec eux.

Les composants de classe restent le meilleur choix lorsqu'on travaille avec du code legacy. Si un projet a été démarré avant 2019, il contient probablement des milliers de composants de classe. Les réécrire tous en hooks en un seul sprint est risqué. React garantit la rétrocompatibilité : les composants de classe ne seront pas supprimés.

Stratégie de migration des classes vers les hooks

La migration progressive commence par l'analyse du composant. Les composants simples sans état sont traduits en premier — ils sont trivialement remplacés par des fonctions. Ensuite — les composants avec un ou deux champs d'état, où useState remplace directement this.state et this.setState.

Les composants complexes avec plusieurs méthodes du cycle de vie sont traduits en utilisant useEffect. La logique de componentDidMount + componentDidUpdate est divisée en appels useEffect séparés avec différentes dépendances. componentWillUnmount est remplacé par une fonction de retour dans useEffect. Pour une logique d'état complexe, utilisez useReducer.

Les outils de migration automatisée — @phenomnomnominal/ts-react-class-to-hook ou les scripts codemod — peuvent convertir automatiquement les classes simples. Pour les cas complexes, la migration reste un travail manuel nécessitant une compréhension de la logique du composant source.

Questions fréquentes

Est-il obligatoire d'appeler super(props) dans le constructeur ?

Oui. super(props) transmet les props au React.Component parent. Sans cet appel, this.props sera undefined à l'intérieur du constructeur. Dans render et les méthodes du cycle de vie, les props sont disponibles même sans super, mais c'est un comportement incident de l'implémentation.

Pourquoi setState est-il asynchrone ?

React regroupe plusieurs appels setState en un seul lot pour réduire les rendus inutiles. Si setState était synchrone, chaque appel déclencherait un rendu immédiat, réduisant les performances lors des mises à jour massives.

Puis-je utiliser des hooks dans un composant de classe ?

Non. Les hooks ne fonctionnent que dans les composants fonctionnels. Pour les projets avec des composants de classe, tous les anciens modèles sont disponibles : render props, HOC et Consumer pour le contexte. Migrer vers les hooks nécessite de convertir la classe en fonction.

Qu'est-ce que PureComponent et en quoi diffère-t-il de Component ?

React.PureComponent implémente shouldComponentUpdate avec une comparaison superficielle des props et de l'état. Contrairement à Component, qui refait toujours le rendu avec setState, PureComponent saute le rendu si les données n'ont pas changé. C'est une optimisation pour les composants sans imbrication complexe.

Comment gérer une erreur dans un composant de classe ?

Utilisez componentDidCatch et getDerivedStateFromError. componentDidCatch(error, info) enregistre l'erreur. getDerivedStateFromError met à jour l'état pour afficher une interface de secours. Ces méthodes ne fonctionnent que dans les composants de classe — les fonctions nécessitent un composant ErrorBoundary enveloppant.

Résumé

  • React.Component est la classe de base pour les composants avec héritage, état et méthodes du cycle de vie.
  • this.state est initialisé dans le constructeur, mis à jour uniquement via this.setState — la mutation directe est interdite.
  • componentDidMount est l'endroit principal pour les requêtes API, les abonnements et les temporisateurs après le premier rendu.
  • componentWillUnmount est le nettoyage obligatoire des abonnements et temporisateurs pour éviter les fuites mémoire.
  • Lier this est obligatoire : bind dans le constructeur est l'approche recommandée pour les méthodes callback.
  • Hooks ont remplacé les composants de classe pour les nouveaux projets, mais les classes restent entièrement prises en charge.
  • Migration vers les hooks se fait progressivement : les composants sans état d'abord, les complexes via useReducer et useEffect.

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi