0Pricing
React Academy · Lezione

Creazione di un componente modale con i Portal

Creare una modale riutilizzabile che esegua il rendering in document.body tramite createPortal.

Creazione di un componente modale con i Portal è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento React Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso React Academy include 4 lezioni in totale.

Benvenuto

In questa lezione creerà un componente Modal riutilizzabile che utilizza React.createPortal per eseguire il rendering in document.body, con supporto alla chiusura tramite clic sullo sfondo e pressione del tasto Escape.

Struttura di base del componente Modal

Inizi dalla struttura di base: un componente Modal che accetta le props `isOpen`, `onClose` e `children`. Quando `isOpen` è false, non esegua alcun rendering.
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
  );
}

Sfondo e interruzione della propagazione

Il div `backdrop` esterno copre l'intero schermo. Facendo clic su di esso si chiama `onClose`. Il div `modal` interno chiama `e.stopPropagation()` affinché i clic al suo interno non si propaghino allo sfondo e non lo chiudano accidentalmente.

Chiusura con il tasto Escape

Aggiunga un `useEffect` che ascolti l'evento `keydown`. Quando viene premuto il tasto Escape e il modale è aperto, chiami `onClose`. Rimuova il listener durante la pulizia.
useEffect(() => {
  if (!isOpen) return;
  const handle = (e) => { if (e.key === 'Escape') onClose(); };
  document.addEventListener('keydown', handle);
  return () => document.removeEventListener('keydown', handle);
}, [isOpen, onClose]);

Blocco dello scorrimento del body

Quando un modale è aperto, di solito è opportuno impedire lo scorrimento della pagina sottostante. Aggiunga e rimuova `overflow: hidden` su `document.body` all'interno di un `useEffect`.
useEffect(() => {
  if (isOpen) {
    document.body.style.overflow = 'hidden';
  }
  return () => { document.body.style.overflow = ''; };
}, [isOpen]);

CSS di base per il modale

Lo sfondo dovrebbe essere un overlay fisso a schermo intero. Il riquadro del modale dovrebbe essere centrato. Un approccio CSS minimo utilizza flexbox sullo sfondo per centrare il 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;
}

Utilizzo del modale

Controlli il modale con una variabile di stato booleana nel genitore. Passi le props `isOpen` e `onClose` al Modal. Inserisca qualsiasi contenuto come children.
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>
    </>
  );
}

Aggiunta di un pulsante di chiusura interno

Fornisca sempre un pulsante di chiusura esplicito all'interno del modale per gli utenti che non possono utilizzare la tastiera o che non notano lo sfondo. Passi `onClose` al contenuto tramite children o una prop.

Animazione con transizioni CSS

Per ottenere un effetto di dissolvenza in entrata, invece di restituire null quando il modale è chiuso, esegua sempre il rendering del Portale, alternando però una classe CSS. Utilizzi una transizione CSS di `opacity` e `transform` sullo sfondo.
// Toggle class based on isOpen
<div className={`backdrop ${isOpen ? 'visible' : 'hidden'}`}>

Composizione dell'intestazione e del piè di pagina del modale

Suddivida il modale in sottocomponenti: `Modal.Header`, `Modal.Body`, `Modal.Footer`. Utilizzi il pattern dei componenti composti, così chi usa il componente può comporre il layout del modale senza conoscere i nomi delle classi.

Verifica rapida

Perché chiamiamo e.stopPropagation() nel gestore onClick del div modal interno?

Riepilogo

Ha creato un Modal con createPortal: il clic sullo sfondo lo chiude, il tasto Escape lo chiude, lo scorrimento del body viene bloccato quando è aperto e stopPropagation impedisce che i clic all'interno del modale lo chiudano.

Prossimo argomento

Prossima lezione: **Gestione del focus e delle trappole da tastiera nei modali**: manterrà il focus all'interno del modale mentre è aperto, per soddisfare i requisiti di accessibilità.

Domande Frequenti

La lezione «Creazione di un componente modale con i Portal» è gratuita?

Sì — il testo completo di «Creazione di un componente modale con i Portal» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso React Academy, passa a CoddyKit PRO. Il corso React Academy include 4 lezioni in totale.

Cosa imparerò in «Creazione di un componente modale con i Portal»?

Creare una modale riutilizzabile che esegua il rendering in document.body tramite createPortal. Eserciti React Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare React Academy?

Non è richiesta alcuna esperienza precedente. React Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Creazione di un componente modale con i Portal»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione React Academy?

Sì. Ogni lezione React Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Cosa sono i React Portal?
  2. Creazione di un componente modale con i Portal
  3. Gestione del focus e dei blocchi da tastiera nelle modali
  4. Tooltip e menu a discesa con i Portal
← Torna a React Academy