0Pricing
React Academy · Aula

Criação de um componente modal com Portals

Crie um modal reutilizável que seja renderizado em document.body por meio de createPortal.

Criação de um componente modal com Portals é uma aula grátis de React Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de React Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de React Academy inclui 4 aulas no total.

Boas-vindas

Nesta lição, você criará um componente modal reutilizável que usa React.createPortal para renderizar em document.body, com suporte para fechamento ao clicar no plano de fundo e ao pressionar a tecla Escape.

Estrutura básica do componente modal

Comece com a estrutura básica: um componente modal que aceita as propriedades `isOpen`, `onClose` e `children`. Quando `isOpen` for falso, não renderize 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
  );
}

Plano de fundo e interrupção da propagação

O elemento `backdrop` externo cobre toda a tela. Clicar nele chama `onClose`. O elemento `modal` interno chama `e.stopPropagation()` para que os cliques dentro do modal não se propaguem até o plano de fundo e não o fechem acidentalmente.

Fechando com a tecla Escape

Adicione um `useEffect` que escute o evento `keydown`. Quando a tecla Escape for pressionada e o modal estiver aberto, chame `onClose`. Remova o ouvinte durante a limpeza.
useEffect(() => {
  if (!isOpen) return;
  const handle = (e) => { if (e.key === 'Escape') onClose(); };
  document.addEventListener('keydown', handle);
  return () => document.removeEventListener('keydown', handle);
}, [isOpen, onClose]);

Impedindo a rolagem do corpo da página

Quando um modal está aberto, geralmente você quer impedir a rolagem da página atrás dele. Adicione e remova `overflow: hidden` em `document.body` dentro de um `useEffect`.
useEffect(() => {
  if (isOpen) {
    document.body.style.overflow = 'hidden';
  }
  return () => { document.body.style.overflow = ''; };
}, [isOpen]);

CSS básico para o modal

O plano de fundo deve ser uma sobreposição fixa que ocupe a tela inteira. A caixa do modal deve ficar centralizada. Uma abordagem mínima em CSS usa flexbox no plano de fundo para centralizar o 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;
}

Usando o modal

Controle o modal com uma variável de estado booleana no componente pai. Passe as propriedades `isOpen` e `onClose` ao modal. Coloque qualquer conteúdo como filho.
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>
    </>
  );
}

Adicionando um botão de fechamento interno

Sempre forneça um botão de fechamento explícito dentro do modal para usuários que não possam usar o teclado ou que não percebam o plano de fundo. Passe `onClose` ao conteúdo por meio de `children` ou de uma propriedade.

Animação com transições CSS

Para obter um efeito de aparecimento gradual, em vez de retornar null quando o modal estiver fechado, renderize o portal sempre, mas alterne uma classe CSS. Use uma transição de `opacity` e `transform` no plano de fundo.
// Toggle class based on isOpen
<div className={`backdrop ${isOpen ? 'visible' : 'hidden'}`}>

Compondo o cabeçalho e o rodapé do modal

Divida o modal em subcomponentes: `Modal.Header`, `Modal.Body`, `Modal.Footer`. Use o padrão de componente composto para que os consumidores possam compor o layout do modal sem conhecer os nomes das classes.

Verificação rápida

Por que chamamos e.stopPropagation() no manipulador onClick do elemento modal interno?

Recapitulação

Você criou um modal com createPortal: o clique no plano de fundo o fecha, a tecla Escape o fecha, a rolagem do corpo da página fica bloqueada enquanto ele está aberto e stopPropagation impede que cliques dentro do modal o fechem.

A seguir

Próxima lição: **Controlando o foco e as armadilhas de teclado em modais** — você manterá o foco dentro do modal enquanto ele estiver aberto para atender aos requisitos de acessibilidade.

Perguntas Frequentes

A aula “Criação de um componente modal com Portals” é grátis?

Sim — o texto completo de “Criação de um componente modal com Portals” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de React Academy, atualize para CoddyKit PRO. O curso de React Academy inclui 4 aulas no total.

O que vou aprender em “Criação de um componente modal com Portals”?

Crie um modal reutilizável que seja renderizado em document.body por meio de createPortal. Você pratica React Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar React Academy?

Nenhuma experiência prévia é necessária. React Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Criação de um componente modal com Portals”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de React Academy?

Sim. Cada aula de React Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. O que são os Portals do React
  2. Criação de um componente modal com Portals
  3. Tratamento de foco e armadilhas de teclado em modais
  4. Dicas de ferramentas e menus suspensos com Portals
← Voltar para React Academy