Intercepting routes permitem carregar uma rota dentro do layout atual durante a navegação do lado do cliente, preservando a página completa em acesso direto à URL ou atualização. O caso de uso clássico é um modal que abre inline, mas tem sua própria URL compartilhável.
Cartão de receita de referência rápida - pronto para copiar e colar.
Convenção Corresponde
(.)pasta Mesmo nível (como ./pasta)
(..)pasta Um nível acima (como ../pasta)
(..)(..)pasta Dois níveis acima (como ../../pasta)
(...)pasta Nível raiz (como /pasta de qualquer lugar)
app/
├── layout.tsx
├── @modal/
│ ├── default.tsx # Renderiza nada quando nenhum modal está ativo
│ └── (.)photo/[id]/page.tsx # Intercepta /photo/:id → renderiza no modal
├── photo/[id]/
│ └── page.tsx # Página completa para /photo/:id (acesso direto)
└── page.tsx # Página de galeria com miniaturas de fotos
Quando usar isso: Galerias de fotos com pré-visualizações em modal, modais de login com URLs /login, pré-visualizações de detalhes de itens em uma lista, ou qualquer padrão onde uma rota deve aparecer como um modal durante a navegação, mas como uma página completa em acesso direto.
A interceptação ocorre apenas na navegação do lado do cliente. Quando um usuário clica em um <Link>, o Next.js renderiza a rota interceptadora em vez da rota de destino.
Acesso direto à URL ou atualização ignora a interceptação. Digitar a URL ou atualizar carrega a versão completa da página em app/photo/[id]/page.tsx.
Rotas interceptadoras usam slots de rotas paralelas. A pasta @modal é uma rota paralela. A rota interceptadora (.)photo/[id] é colocada dentro dela.
A convenção de ponto indica a profundidade relativa.(.) significa o mesmo nível, (..) significa um nível acima. Isso é relativo ao segmento da rota, não ao sistema de arquivos.
default.tsx é necessário no slot. Sem ele, o slot renderiza nada em rotas não interceptadas, e o Next.js pode gerar erros na navegação direta.
router.back() fecha o modal. Como a interceptação usa navegação do lado do cliente, voltar restaura a visualização anterior.
A página completa ainda existe em sua URL. A interceptação não remove a rota original - ela a sombreia apenas durante a navegação suave.
A convenção de ponto se refere a segmentos de rota, não a diretórios do sistema de arquivos.(..) sobe um segmento de rota, o que pode não corresponder a um nível de diretório se grupos de rotas estiverem envolvidos.
default.tsx deve existir no slot. Sem ele, navegar para fora da rota interceptada e depois de volta pode causar erros.
Atualizar a página carrega a rota completa, não a interceptada. Usuários que compartilham a URL verão a página completa, não o modal - isso é intencional.
Grupos de rotas (group) contam como um segmento para a convenção de ponto. Se sua rota interceptadora estiver dentro de um grupo de rotas, você pode precisar de um nível (..) extra.
A navegação de volta pode não funcionar como esperado com históricos complexos. Se o usuário navegou por várias rotas interceptadas, router.back() remove a última entrada, que pode ser outro modal.
Rotas interceptadoras adicionam complexidade. Se você não precisa do comportamento de URL compartilhável como página completa, um estado de modal simples do lado do cliente é mais fácil.
Slots de rotas paralelas devem ser filhos diretos de um layout. Você não pode aninhar @modal arbitrariamente - ele deve ser um irmão do layout que o renderiza.
Quando a interceptação de rotas acontece e quando não acontece?
A interceptação ocorre apenas durante a navegação do lado do cliente (clicando em um <Link>)
Acesso direto à URL, atualização da página ou links compartilhados ignoram a interceptação e carregam a versão completa da página
O que significam as convenções de ponto (.), (..), (..)(..), e (...)?
(.) corresponde ao mesmo nível de rota
(..) corresponde a um nível de rota acima
(..)(..) corresponde a dois níveis de rota acima
(...) corresponde a partir do nível raiz
Por que default.tsx é necessário no slot @modal?
Sem default.tsx, navegar para fora da rota interceptada e depois de volta pode causar erros. Ele fornece um fallback (geralmente retornando null) quando nenhum modal está ativo.
Como você fecha um modal interceptado?
Chame router.back() do hook useRouter. Como a interceptação usa navegação do lado do cliente, voltar restaura a visualização anterior.
"use client";import { useRouter } from "next/navigation";const router = useRouter();// No botão de fechar:<button onClick={() => router.back()}>Fechar</button>
Armadilha: As convenções de ponto se referem a diretórios do sistema de arquivos ou segmentos de rota?
Segmentos de rota, não diretórios do sistema de arquivos. Essa distinção é importante quando grupos de rotas estão envolvidos, pois os grupos de rotas (group) contam como um segmento para a convenção de ponto e podem exigir um nível (..) extra.
A rota interceptadora substitui a rota original?
Não. A página completa original ainda existe em sua URL. A interceptação apenas a sombreia durante a navegação suave (do lado do cliente). A original é renderizada no acesso direto ou atualização.
Qual é a relação entre rotas interceptadoras e rotas paralelas?
Rotas interceptadoras são colocadas dentro de slots de rotas paralelas (por exemplo, @modal). O slot é renderizado como uma prop no layout pai ao lado de children, permitindo que o modal e a página sejam exibidos simultaneamente.
Quais são os tipos TypeScript para uma página de rota interceptada?
Como você digita os params em uma rota interceptada de Componente Cliente?
Use React.use() para desempacotar o Promise, pois você não pode usar await em Componentes Cliente.
"use client";import { use } from "react";export default function Modal({ params,}: { params: Promise<{ id: string }>;}) { const { id } = use(params); return <div>Item {id}</div>;}
Armadilha: O que acontece com históricos de navegação complexos e múltiplos rotas interceptadas?
router.back() remove a última entrada do histórico, que pode ser outro modal em vez da página não modal. Usuários que navegam por várias rotas interceptadas podem precisar voltar várias vezes.
Quando você deve usar um modal simples do lado do cliente em vez de interceptar rotas?
Quando você não precisa de uma URL compartilhável para o conteúdo do modal. Rotas interceptadoras adicionam complexidade ao sistema de arquivos. Se o modal não precisa de sua própria URL ou fallback de página completa, o estado do lado do cliente é mais simples.
O @modal pode ser aninhado dentro de outro @slot?
Não. Slots de rotas paralelas devem ser filhos diretos de um diretório de layout. Você não pode aninhar @modal dentro de outro slot.