Capítulo 09: Roteamento SPA com React Router 6+ (Routes, Outlet, Guards)
Especialização Frontend com React & TypeScript • React 19, Hooks, Estado Global e Next.js
🗺️ Mapa Conceitual do Tópico
flowchart LR
BROWSER["URL /dashboard/pedidos"] --> ROUTER["React Router Data Engine"]
ROUTER --> ROOT["RootLayout"]
ROOT --> OUTLET["<Outlet /> Renderiza a Rota Ativa: PedidosPage"]
🏛️ 1. O Paradigma de Roteamento no Cliente (Client-Side Routing)
Em uma Single-Page Application (SPA), a navegação entre telas não recarrega o documento HTML do servidor. O React Router intercepta as alterações na URL através da History API do navegador e substitui dinamicamente os componentes correspondentes.
🗂️ 2. Layouts Aninhados e o Componente <Outlet />
Com o conceito de Nested Routes, a hierarquia da URL reflete a hierarquia de componentes. O componente <Outlet /> atua como um espaço reservado (placeholder) onde as rotas filhas são renderizadas sem recriar os layouts comuns (como menus e headers).
🛡️ 3. Route Guards e Proteção de Acesso
Rotas protegidas autenticam o usuário antes de renderizar a página solicitada. Caso o usuário não possua privilégios, ele é redirecionado defensivamente via <Navigate to="/login" replace />.
⚠️ 4. Armadilhas Comuns e Anti-Padrões de Produção
- Uso de Links Tradicionais
<a>: Usar<a href="/sobre">força o navegador a fazer uma requisição HTTP completa e recarregar toda a aplicação JS, perdendo todo o estado em memória. Use sempre<Link to="/sobre">ou<NavLink>. - Redirecionamento sem a Propriedade
replace: Redirecionar em rotas de autenticação semreplacepolui o histórico de navegação, fazendo o botão “Voltar” do navegador entrar em um loop infinito.
💡 5. Diretrizes de Engenharia (Meta & React Docs)
- Adote a Nova Data API (
createBrowserRouter): Permite o uso de loaders de dados prévios e actions de formulário integradas diretamente na definição da rota. - Organize Rotas em Módulos de Feature: Isole rotas administrativas em módulos separados para viabilizar Code Splitting e Lazy Loading com
React.lazy().
💻 6. Demonstração Arquitetural do Conceito
// ProtectedLayout.tsx - Proteção de rotas corporativas
import React from "react";
import { Navigate, Outlet } from "react-router-dom";
export function ProtectedShell({ isAuth }: { isAuth: boolean }) {
if (!isAuth) {
return <Navigate to="/auth/login" replace />;
}
return (
<div className="shell-container">
<aside className="sidebar">Menu</aside>
<main className="content"><Outlet /></main>
</div>
);
}
📋 7. Cheat-Sheet do React Router 6+
| Hook / Componente | Função Primária |
|---|---|
<Link to="..."> |
Navegação declarativa sem recarregar a página. |
<Outlet /> |
Renderiza a rota filha ativa dentro de um layout pai. |
useNavigate() |
Navegação imperativa via código (ex: após login bem-sucedido). |
useParams() |
Captura parâmetros dinâmicos da URL (ex: /users/:id). |
useSearchParams() |
Lê e modifica query strings (?page=2&filter=active). |
🔍 8. Diagnóstico de Performance & React DevTools Profiler
Ao otimizar rotas SPA:
- Análise de Chunks (Code Splitting): Verifique na aba Network se a navegação para
/dashboardcarrega um arquivo.jsseparado sob demanda através deReact.lazy(). - Suspense Fallbacks: Meça o tempo em que o esqueleto de carregamento (Skeleton Screen) fica visível antes da resolução do loader da rota.
🧪 9. Casos de Teste e Cenários de Borda Recomendados
- 🔍 Rotas 404: Garanta que URLs inexistentes renderizem uma página de Not Found amigável e acessível.
- 🔍 Parâmetros Inválidos: Teste o comportamento de rotas
/users/:idquando o ID fornecido não for numérico ou UUID. - 🔍 Redirecionamento com Preservação de Rota: Após o login, certifique-se de que o usuário seja redirecionado para a página que tentava acessar originalmente.