0Pricing
React Academy · Lección

Construcción de un componente modal con Portals

Cree un modal reutilizable que se renderice en document.body mediante createPortal.

Construcción de un componente modal con Portals es una lección gratuita de React Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.

Bienvenida

En esta lección creará un componente Modal reutilizable que usa React.createPortal para renderizarse en document.body, con compatibilidad para cerrarse al hacer clic en el backdrop o al pulsar la tecla Escape.

Estructura básica del componente Modal

Comience con la estructura básica: un componente Modal que acepta las props `isOpen`, `onClose` y `children`. Cuando `isOpen` sea false, no renderice nada.
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
  );
}

Backdrop y detención de la propagación

El div `backdrop` exterior cubre toda la pantalla. Al hacer clic en él se llama a `onClose`. El div `modal` interior llama a `e.stopPropagation()` para que los clics dentro del modal no se propaguen al backdrop ni lo cierren accidentalmente.

Cierre con la tecla Escape

Agregue un `useEffect` que escuche el evento `keydown`. Cuando se pulse la tecla Escape y el modal esté abierto, llame a `onClose`. Elimine el listener durante la limpieza.
useEffect(() => {
  if (!isOpen) return;
  const handle = (e) => { if (e.key === 'Escape') onClose(); };
  document.addEventListener('keydown', handle);
  return () => document.removeEventListener('keydown', handle);
}, [isOpen, onClose]);

Cómo impedir el desplazamiento del body

Cuando hay un modal abierto, normalmente querrá impedir que se desplace la página que queda detrás. Agregue y quite `overflow: hidden` en `document.body` dentro de un `useEffect`.
useEffect(() => {
  if (isOpen) {
    document.body.style.overflow = 'hidden';
  }
  return () => { document.body.style.overflow = ''; };
}, [isOpen]);

CSS básico para el Modal

El backdrop debe ser una superposición fija que cubra toda la pantalla. El cuadro del modal debe estar centrado. Un enfoque CSS mínimo usa flexbox en el backdrop para centrar el modal.
.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;
}

Uso del Modal

Controle el modal con una variable de estado booleana en el padre. Pase las props `isOpen` y `onClose` al Modal. Coloque cualquier contenido como 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>
    </>
  );
}

Agregar un botón de cierre dentro del modal

Incluya siempre un botón de cierre explícito dentro del modal para los usuarios que no puedan usar el teclado o no reparen en el backdrop. Pase `onClose` al contenido mediante children o una prop.

Animación con transiciones CSS

Para crear un efecto de aparición gradual, en lugar de devolver null cuando el modal está cerrado, renderice siempre el portal, pero alterne una clase CSS. Use una transición CSS de `opacity` y `transform` en el backdrop.
// Toggle class based on isOpen
<div className={`backdrop ${isOpen ? 'visible' : 'hidden'}`}>

Composición del encabezado y pie del Modal

Divida el modal en subcomponentes: `Modal.Header`, `Modal.Body`, `Modal.Footer`. Use el patrón de componentes compuestos para que los consumidores puedan componer el diseño del modal sin conocer los nombres de las clases.

Comprobación rápida

¿Por qué llamamos a e.stopPropagation() en el controlador onClick del div modal interior?

Resumen

Ha creado un Modal con createPortal: el clic en el backdrop lo cierra, la tecla Escape lo cierra, el desplazamiento del body se bloquea mientras está abierto y stopPropagation evita que los clics dentro del modal lo cierren.

A continuación

Siguiente lección: **Handling Focus & Keyboard Traps in Modals**: mantendrá el foco dentro del modal mientras esté abierto para cumplir los requisitos de accesibilidad.

Preguntas frecuentes

¿La lección «Construcción de un componente modal con Portals» es gratis?

Sí — el texto completo de «Construcción de un componente modal con Portals» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Construcción de un componente modal con Portals»?

Cree un modal reutilizable que se renderice en document.body mediante createPortal. Practicas React Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar React Academy?

No se requiere experiencia previa. React Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Construcción de un componente modal con Portals»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de React Academy?

Sí. Cada lección de React Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. ¿Qué son los React Portals?
  2. Construcción de un componente modal con Portals
  3. Gestión del foco y trampas de teclado en modales
  4. Tooltips y menús desplegables con Portals
← Volver a React Academy