Composants Fonctionnels dans React — La Norme Moderne de Développement

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

Functional Component — est une façon de créer des composants React à l'aide de fonctions JavaScript ordinaires, devenue la norme après la sortie de React 16.8 et l'introduction des hooks. Les composants fonctionnels acceptent des props et retournent des éléments React sans nécessiter d'héritage de React.Component. Selon React, 2024, 97% des nouveaux composants dans l'écosystème React sont écrits comme des fonctions.

Points Clés

  • Functional Component — une fonction JavaScript ordinaire qui accepte des props et retourne du JSX, sans extends Component.
  • Hooks (useState, useEffect, useContext) donnent aux composants fonctionnels un accès complet à l'état et au cycle de vie.
  • Lisibilité — les composants fonctionnels sont plus courts que les composants de classe, sans constructeur, bind ni méthodes de cycle de vie superflues.
  • Performance — React optimise les composants fonctionnels via la mémorisation et l'initialisation paresseuse.
  • Recommandation React — tous les nouveaux projets devraient utiliser uniquement des composants fonctionnels avec des hooks.

Qu'est-ce qu'un Functional Component ?

Functional Component est un composant React défini comme une fonction qui accepte un objet props et retourne un élément React. Avant React 16.8, ces composants étaient appelés stateless car ils ne pouvaient pas gérer d'état interne.

Avec l'introduction des hooks dans React 16.8 (février 2019), les composants fonctionnels ont obtenu l'accès à l'état (useState), aux effets secondaires (useEffect), au contexte (useContext) et aux refs (useRef). Le terme « stateless » est obsolète — les composants fonctionnels modernes gèrent entièrement l'état.

React recommande officiellement les composants fonctionnels comme moyen principal de créer des composants. Toute la documentation sur react.dev, les exemples, les tutoriels et les nouvelles API (Server Components, Actions) sont construits sur l'approche fonctionnelle. Les composants de classe n'ont pas été supprimés, mais les nouvelles fonctionnalités de React ne sont disponibles que via les hooks.

Création d'un Composant Fonctionnel

Le composant fonctionnel le plus simple est une fonction qui retourne du JSX. Il accepte les props comme argument, ne nécessite ni constructeur, ni appel super, ni liaison this. Les props sont accessibles directement via l'argument de la fonction — pas de this.props.

js
// Functional component without state
function Greeting({ name }) {
  return <h1>Hello, {name}!</h1>;
}

// Arrow function (common variant)
const Greeting = ({ name }) => (
  <h1>Hello, {name}!</h1>
);

Composant avec État

Pour ajouter un état, utilisez useState. Le hook retourne un tuple de deux valeurs : l'état actuel et une fonction setter. Contrairement au this.setState basé sur les classes, useState remplace la valeur entièrement plutôt que de la fusionner avec la précédente.

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

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Increment
      </button>
    </div>
  );
}

Hooks dans les Composants Fonctionnels

Les hooks sont le fondement de React moderne. Chaque hook résout une tâche spécifique : useState — état, useEffect — effets secondaires, useContext — accès au contexte, useRef — références aux éléments DOM, useCallback et useMemo — mémorisation.

useEffect pour les Effets Secondaires

useEffect remplace componentDidMount, componentDidUpdate et componentWillUnmount à la fois. Le premier argument est un callback avec l'effet, le second est un tableau de dépendances. Si le tableau est vide, l'effet s'exécute une fois après le montage. Si des dépendances sont spécifiées, il s'exécute à chaque modification de l'une d'elles.

js
import React, { useState, useEffect } from 'react';

function UserData({ userId }) {
  const [user, setUser] = useState(null);

  useEffect(() => {
    let cancelled = false;

    fetch(`/api/users/${userId}`)
      .then(res => res.json())
      .then(data => {
        if (!cancelled) setUser(data);
      });

    // Cleanup - analog of componentWillUnmount
    return () => { cancelled = true; };
  }, [userId]); // Dependency

  return <div>{user?.name}</div>;
}

Hooks Personnalisés

Le principal avantage des composants fonctionnels est la réutilisation de logique via des hooks personnalisés. Alors que dans un composant de classe, la logique était dupliquée entre componentDidMount et componentDidUpdate, dans un composant fonctionnel, elle est extraite dans une fonction séparée avec le préfixe use. Les hooks personnalisés sont l'alternative principale aux HOC et render props.

Composition plutôt qu'Héritage

React recommande la composition plutôt que l'héritage pour la réutilisation de code entre composants. Les composants fonctionnels sont idéaux pour la composition : un composant peut en contenir plusieurs autres, en leur passant des props et des children.

Le motif children — lorsqu'un composant reçoit des éléments enfants via la prop children — est implémenté naturellement : function Layout({ children }). L'analogue des slots de Vue est implémenté via des props de composants nommés : function Page({ header, sidebar, content }).

L'héritage est rarement utilisé dans React. Même les composants de classe, qui supportent techniquement extends, forment rarement des hiérarchies plus profondes qu'un niveau. Les composants fonctionnels avec composition couvrent entièrement les besoins de réutilisation de code sans héritage.

Optimisation des Performances

Les composants fonctionnels sont dotés de mécanismes d'optimisation intégrés. React.memo — l'équivalent de PureComponent pour les fonctions : empêche le re-rendu si les props n'ont pas changé (comparaison superficielle). useMemo met en cache les résultats de calcul entre les rendus.

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

// React.memo - memoize component
const ExpensiveList = React.memo(({ items }) => {
  return <ul>
    {items.map(item =>
      <li key={item.id}>{item.name}</li>
    )}
  </ul>;
});

// useMemo - caching result
function Dashboard({ transactions }) {
  const summary = useMemo(() => {
    return transactions.reduce((acc, t) => acc + t.amount, 0);
  }, [transactions]);

  return <p>Total: {summary}</p>;
}

useCallback mémorise les fonctions callback afin qu'elles ne soient pas recréées à chaque rendu. C'est crucial lors du passage de fonctions à des composants enfants enveloppés dans React.memo : sans useCallback, le composant enfant sera re-rendu à chaque fois car la référence de la fonction change.

Composants Fonctionnels vs de Classe

La différence entre les approches va au-delà de la syntaxe. Les composants fonctionnels sont des fermetures : l'état et les effets sont liés à un rendu spécifique. Les composants de classe utilisent this : l'état est toujours extrait de this.state, qui peut être obsolète au moment de l'exécution d'un callback asynchrone.

AspectFonctionnelClasse
ÉtatuseState (isolé)this.state + this.setState
EffetsuseEffect avec dépendancescomponentDidMount + componentDidUpdate
ContexteuseContextContext.Consumer ou static contextType
OptimisationReact.memo + useMemoPureComponent + shouldComponentUpdate
RéutilisationHooks personnalisésHOC / Render props
thisAucunbind dans le constructeur

Les composants fonctionnels offrent un flux d'exécution linéaire. Dans un composant de classe, la logique connexe est souvent dispersée sur plusieurs méthodes de cycle de vie. Par exemple, un abonnement WebSocket est configuré dans componentDidMount et supprimé dans componentWillUnmount. Dans un composant fonctionnel, les deux opérations sont dans un seul useEffect avec une fonction de nettoyage de retour.

TypeScript et Composants Fonctionnels

TypeScript fonctionne plus naturellement avec les composants fonctionnels qu'avec les classes. Typage des props — une interface pour l'argument de la fonction. Le type de retour est JSX.Element ou ReactNode. useState déduit automatiquement le type de la valeur initiale.

ts
import React, { useState } from 'react';

interface ButtonProps {
  label: string;
  variant?: 'primary' | 'secondary';
  onClick: () => void;
}

const Button: React.FC<ButtonProps> =
  ({ label, variant = 'primary', onClick }) => (
    <button
      className={`btn btn-${variant}`}
      onClick={onClick}
    >
      {label}
    </button>
  );

TypeScript moderne permet de typer useReducer avec des types union discriminés, des génériques dans les hooks personnalisés et une validation stricte des enfants via React.PropsWithChildren. Les composants fonctionnels avec TypeScript offrent une sécurité de type complète sans abstractions supplémentaires.

Questions Fréquentes

Pourquoi React recommande-t-il les composants fonctionnels ?

Les composants fonctionnels sont plus simples : pas de constructeur, bind, this ni de méthodes de cycle de vie dispersées. Les hooks permettent de regrouper la logique connexe. React investit des ressources dans le développement des hooks, pas des classes. Les Server Components et les nouvelles fonctionnalités ne sont disponibles que dans les fonctions.

Puis-je utiliser setInterval dans un composant fonctionnel ?

Oui, via useEffect avec un timer à l'intérieur et une fonction de nettoyage pour clearInterval. Attention à la fermeture : si vous incrémentez un compteur, utilisez la forme fonctionnelle de setState : setCount(c => c + 1) pour ne pas dépendre de l'ancienne valeur dans la fermeture.

Comment obtenir les props précédentes dans un composant fonctionnel ?

Utilisez useRef pour stocker la valeur précédente. Mettez à jour la ref dans useEffect après chaque rendu. Un hook personnalisé usePrevious aide pour une comparaison propre : const prev = usePrevious(value);

Quelle est la différence entre React.memo et useMemo ?

React.memo est un HOC pour mémoriser un composant entier : empêche le re-rendu si les props n'ont pas changé. useMemo est un hook pour mémoriser une valeur spécifique à l'intérieur d'un composant : met en cache le résultat d'une fonction entre les rendus selon un tableau de dépendances.

Comment simuler getDerivedStateFromProps dans un composant fonctionnel ?

La façon la plus simple est useState avec initialisation à partir des props + useEffect avec une dépendance aux props pour la synchronisation. Pour les cas rares, React recommande d'utiliser une key pour forcer la recréation du composant lorsque les données d'entrée changent.

Résumé

  • Functional Component — la norme React moderne : une fonction qui accepte des props et retourne du JSX.
  • Hooks (useState, useEffect) donnent aux composants fonctionnels état, effets et contexte sans classes.
  • Composition via children et hooks personnalisés remplace l'héritage et les motifs HOC.
  • React.memo et useMemo offrent une optimisation des performances pour les composants fonctionnels.
  • TypeScript avec les composants fonctionnels offre un typage strict des props et une inférence automatique des types.
  • useEffect remplace toutes les méthodes de cycle de vie des composants de classe en un seul endroit.
  • Hooks personnalisés permettent d'extraire et de réutiliser la logique entre composants sans HOC.

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