Un Portal en React permite renderizar contenido en un contenedor del DOM fuera de la jerarquía del componente principal. Esto se logra usando el método ReactDOM.createPortal
, el cual toma dos parámetros:
1. Contenido: Los elementos React que se desean renderizar (pueden ser JSX o componentes).
2. Destino del DOM: Un nodo del DOM existente en el que se va a insertar el contenido del Portal.
ReactDOM.createPortal(child, container);
child
: El elemento React que se desea renderizar (puede ser un componente o JSX).
container
: Un elemento del DOM (por ejemplo, document.getElementById('portal-root')
).
Los Portals son útiles en situaciones donde el componente necesita estar visualmente fuera del DOM principal pero lógicamente dentro de la jerarquía React, como por ejemplo:
En este ejemplo, creamos un componente modal que se renderiza en un nodo separado del DOM:
1. Primero, añade un contenedor en el HTML:
<!-- index.html -->
<body>
<div id="root"></div>
<div id="modal-root"></div> <!-- Contenedor para el Portal -->
</body>
2. Ahora, implementa el componente con Portal:
import React from 'react';
import ReactDOM from 'react-dom';
function Modal({ children }) {
// Crear el portal en el contenedor "modal-root"
return ReactDOM.createPortal(
<div style={modalStyle}>
{children}
</div>,
document.getElementById('modal-root') // Nodo del DOM destino
);
}
const modalStyle = {
position: 'fixed',
top: '50%',
left: '50%',
transform: 'translate(-50%, -50%)',
background: 'white',
padding: '20px',
boxShadow: '0px 0px 10px rgba(0, 0, 0, 0.25)',
zIndex: 1000,
};
function App() {
return (
<div>
<h1>Componente Principal</h1>
<Modal>
<h2>Modal usando Portals</h2>
<p>Este contenido se renderiza fuera del DOM del componente principal.</p>
</Modal>
</div>
);
}
export default App;
En este ejemplo, el contenido del componente Modal
se renderiza dentro de un div
con el ID modal-root
, que se encuentra fuera del root
principal. A pesar de que el modal está en un nodo diferente en el DOM, sigue formando parte de la jerarquía React del componente App
.
1. Superposición controlada: Los Portals permiten que los modales y tooltips se muestren por encima de otros elementos sin interferir con el diseño del DOM.
2. Aislamiento de estilos: Puedes mantener el estilo del componente principal separado del Portal.
3. Manejo adecuado de eventos: Los Portals mantienen la relación jerárquica en términos de eventos, lo que significa que la propagación de eventos y contextos funciona de manera consistente.
Aunque los Portals permiten una mayor flexibilidad en la renderización, es importante tener en cuenta lo siguiente:
onClick
se propagan desde los elementos del Portal hacia los ancestros del componente React, incluso si se encuentran fuera del DOM visualmente.
Para más información y ejemplos avanzados de uso de Portals, visita la documentación oficial de React.
Jorge García
Fullstack developer