DevPath · Aprenda a programar ESPTEN

React moderno: Suspense, lazy, Portals e concorrência

Portals: renderizar fora da árvore do DOM

O problema do recorte

Imagine um modal definido dentro de um card com overflow: hidden e position: relative. Embora no React o modal seja "filho" do card, no DOM ele ficaria recortado por esses estilos e preso no seu contexto de empilhamento (z-index). É o caso típico de um dropdown que se corta ou um modal que aparece atrás de outro elemento.

React.createPortal

Um Portal permite renderizar uns filhos em outro nó do DOM, fora da hierarquia visual do componente pai, sem deixar de pertencer à árvore do React:

import { createPortal } from "react-dom";

function Modal({ children }) {
  return createPortal(
    <div className="modal-overlay">{children}</div>,
    document.body // é montado diretamente no <body>
  );
}

createPortal(children, domNode) recebe o que renderizar e onde (um nó do DOM já existente, tipicamente document.body ou um <div id="modal-root">).

A chave: o DOM se move, não a árvore do React

Embora o modal apareça no <body>, ele continua sendo filho de Modal na árvore do React. Isso tem duas consequências importantes:

Casos de uso típicos

Nota do ambiente: a validação de createPortal não é confiável no runtime de testes, por isso neste módulo o trabalhamos de forma conceitual.

Coloque isto em prática

O DevPath é um curso prático: aqui você lê a teoria; no app você a coloca em prática com exercícios que rodam de verdade, offline.

Comece grátis no app →
← Code splitting com React.lazy e SuspenseRefs avançadas e concorrência →