0Pricing
React Academy · Leçon

Créer un composant modal avec des portails

Créer une fenêtre modale réutilisable rendue dans document.body via createPortal.

Créer un composant modal avec des portails est une leçon React Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage React Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours React Academy comprend 4 leçons au total.

Bienvenue

Dans cette leçon, vous allez créer un composant Modal réutilisable qui utilise React.createPortal pour effectuer un rendu dans document.body, avec la prise en charge de la fermeture par clic sur l'arrière-plan et par la touche Échap.

Structure de base du composant modal

Commencez par la structure de base : un composant Modal qui accepte les propriétés `isOpen`, `onClose` et `children`. Lorsque `isOpen` vaut false, n'effectuez aucun rendu.
function Modal({ isOpen, onClose, children }) {
  if (!isOpen) return null;
  return createPortal(
    <div className="backdrop" onClick={onClose}>
      <div className="modal" onClick={e => e.stopPropagation()}>
        {children}
      </div>
    </div>,
    document.body
  );
}

Arrière-plan et arrêt de la propagation

Le `backdrop` extérieur couvre tout l'écran. Un clic dessus appelle `onClose`. Le `modal` intérieur appelle `e.stopPropagation()` afin que les clics à l'intérieur de la fenêtre modale ne se propagent pas jusqu'à l'arrière-plan et ne la ferment pas accidentellement.

Fermer avec la touche Échap

Ajoutez un `useEffect` qui écoute l'événement `keydown`. Lorsque la touche Échap est enfoncée et que la fenêtre modale est ouverte, appelez `onClose`. Supprimez l'écouteur lors du nettoyage.
useEffect(() => {
  if (!isOpen) return;
  const handle = (e) => { if (e.key === 'Escape') onClose(); };
  document.addEventListener('keydown', handle);
  return () => document.removeEventListener('keydown', handle);
}, [isOpen, onClose]);

Empêcher le défilement du corps de la page

Lorsqu'une fenêtre modale est ouverte, vous souhaitez généralement empêcher le défilement de la page située derrière elle. Ajoutez et supprimez `overflow: hidden` sur `document.body` dans un `useEffect`.
useEffect(() => {
  if (isOpen) {
    document.body.style.overflow = 'hidden';
  }
  return () => { document.body.style.overflow = ''; };
}, [isOpen]);

CSS de base pour la fenêtre modale

L'arrière-plan doit être une surcouche fixe couvrant tout l'écran. La fenêtre modale doit être centrée. Une approche CSS minimale consiste à utiliser flexbox sur l'arrière-plan pour centrer la fenêtre modale.
.backdrop {
  position: fixed; inset: 0;
  background: rgba(0,0,0,0.5);
  display: flex; align-items: center; justify-content: center;
  z-index: 1000;
}
.modal {
  background: white;
  border-radius: 8px;
  padding: 24px;
  min-width: 320px;
}

Utiliser la fenêtre modale

Contrôlez la fenêtre modale avec une variable d'état booléenne dans le parent. Transmettez les propriétés `isOpen` et `onClose` à Modal. Placez n'importe quel contenu comme enfants.
function App() {
  const [open, setOpen] = useState(false);
  return (
    <>
      <button onClick={() => setOpen(true)}>Open Modal</button>
      <Modal isOpen={open} onClose={() => setOpen(false)}>
        <h2>Hello from the modal!</h2>
        <button onClick={() => setOpen(false)}>Close</button>
      </Modal>
    </>
  );
}

Ajouter un bouton de fermeture à l'intérieur

Prévoyez toujours un bouton de fermeture explicite à l'intérieur de la fenêtre modale pour les utilisateurs qui ne peuvent pas utiliser le clavier ou qui ne remarquent pas l'arrière-plan. Transmettez `onClose` au contenu par l'intermédiaire des enfants ou d'une propriété.

Animation avec des transitions CSS

Pour obtenir un effet de fondu, au lieu de renvoyer null lorsque la fenêtre est fermée, rendez toujours le portail, mais faites basculer une classe CSS. Utilisez une transition CSS de `opacity` et de `transform` sur l'arrière-plan.
// Toggle class based on isOpen
<div className={`backdrop ${isOpen ? 'visible' : 'hidden'}`}>

Composition de l'en-tête et du pied de page d'une fenêtre modale

Divisez la fenêtre modale en sous-composants : `Modal.Header`, `Modal.Body`, `Modal.Footer`. Utilisez le modèle des composants composés afin que les utilisateurs puissent composer la mise en page de la fenêtre modale sans connaître les noms de classes.

Vérification rapide

Pourquoi appelons-nous e.stopPropagation() dans le handler onClick du div modal intérieur ?

Récapitulatif

Vous avez créé une fenêtre modale avec createPortal : un clic sur l'arrière-plan la ferme, la touche Échap la ferme, le défilement du corps de la page est bloqué lorsqu'elle est ouverte, et stopPropagation empêche les clics à l'intérieur de la fenêtre de la fermer.

Ensuite

Prochaine leçon : **Gérer le focus et les pièges clavier dans les fenêtres modales** — vous maintiendrez le focus à l'intérieur de la fenêtre modale lorsqu'elle est ouverte afin de respecter les exigences d'accessibilité.

Questions Fréquemment Posées

La leçon « Créer un composant modal avec des portails » est-elle gratuite ?

Oui — le texte complet de « Créer un composant modal avec des portails » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours React Academy, passe à CoddyKit PRO. Le cours React Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Créer un composant modal avec des portails » ?

Créer une fenêtre modale réutilisable rendue dans document.body via createPortal. Tu pratiques React Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer React Academy ?

Aucune expérience préalable n'est requise. React Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Créer un composant modal avec des portails » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon React Academy ?

Oui. Chaque leçon React Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Que sont les portails React ?
  2. Créer un composant modal avec des portails
  3. Gérer le focus et les pièges clavier dans les fenêtres modales
  4. Infobulles et menus déroulants avec des portails
← Retour à React Academy