CodeForge

React 19 de Cero a Experto / Routing

React Router: rutas, Link y navegación

Teoría22 min20 XP

React Router es el estándar para enrutar apps de React (fuera de un framework como Next.js). Convierte el mini-router que hiciste a mano en algo declarativo y robusto: declaras "esta URL muestra este componente" con <Routes> y <Route>, y navegas con <Link> en vez de <a> para no recargar. Hoy dominas lo esencial: definir rutas, enlazar entre ellas y navegar por código.

Declarar el mapa de la app

Rutas: la configuración básica

Envuelves la app en <BrowserRouter>, y dentro declaras las rutas: cada <Route> asocia un path con el element que se muestra cuando la URL coincide:

rutas.tsx
import { BrowserRouter, Routes, Route } from "react-router-dom";

export default function App() {
return (
  <BrowserRouter>
    <Routes>
      <Route path="/" element={<Inicio />} />
      <Route path="/gastos" element={<Gastos />} />
      <Route path="/perfil" element={<Perfil />} />
      {/* comodín: cualquier ruta no encontrada muestra el 404 */}
      <Route path="*" element={<NoEncontrado />} />
    </Routes>
  </BrowserRouter>
);
}

<BrowserRouter> conecta con la History API (la de la lección anterior) por ti. <Routes> mira la URL actual y renderiza el element del <Route> cuyo path coincide —solo uno, el que mejor encaja—. El path="*" es el comodín para el 404: coincide con cualquier ruta que no matchee las anteriores. Declaras el mapa; el router muestra la vista correcta según la URL.

Navegar sin recargar: Link y NavLink

Para navegar NUNCA usas <a href> (eso recarga la página y mata la SPA). Usas <Link>, que cambia la ruta con la History API:

link.tsx
import { Link, NavLink } from "react-router-dom";

function Menu() {
return (
  <nav>
    {/* Link: navega sin recargar */}
    <Link to="/">Inicio</Link>
    <Link to="/gastos">Gastos</Link>

    {/* NavLink: como Link, pero sabe si SU ruta está activa (para resaltarla) */}
    <NavLink
      to="/perfil"
      className={({ isActive }) => (isActive ? "activo" : "")}
    >
      Perfil
    </NavLink>
  </nav>
);
}

<Link to="/gastos"> renderiza un <a> por debajo (accesible, clic derecho para abrir en pestaña nueva funciona) pero intercepta el clic para navegar sin recargar. <NavLink> es un <Link> que además sabe si su destino es la ruta ACTUAL —recibes isActive para aplicarle un estilo de "estás aquí"—, ideal para menús. Regla de oro: dentro de una app con router, enlaces internos con <Link>/<NavLink>; <a href> solo para enlaces EXTERNOS.

Navegar por código: useNavigate

A veces navegas sin un clic en un enlace: tras enviar un formulario, tras loguearse, tras un timeout. Para eso está useNavigate:

usenavigate.tsx
import { useNavigate } from "react-router-dom";

function FormularioGasto() {
const navegar = useNavigate();

async function guardar() {
  await api.crearGasto(datos);
  navegar("/gastos");        // redirige tras guardar
  // navegar(-1) iría "atrás", como el botón del navegador
}

return <button onClick={guardar}>Guardar</button>;
}

useNavigate te da una función para navegar imperativamente: navegar("/gastos") va a una ruta, navegar(-1) retrocede una posición en el historial (como el botón atrás). Úsalo para navegación que ocurre por LÓGICA (después de una acción), no por un clic directo del usuario en un enlace —para eso está <Link>—. La distinción es la misma que viste en efectos: acción del usuario en un enlace → <Link>; navegación como consecuencia de lógica → useNavigate.

¿Por qué usar <Link to='/gastos'> en vez de <a href='/gastos'> dentro de una app con React Router?

Mini-reto

En un proyecto con React Router instalado (o razonando la API): 1) declara tres rutas (/, /gastos, /perfil) y un comodín * para el 404; 2) haz un menú con <NavLink> que resalte la ruta activa; 3) en un botón "Cerrar sesión", usa useNavigate para redirigir a / por código. Explica por qué el menú usa <NavLink> y el botón usa useNavigate en vez de un <Link>.

Qué sigue

Ya navegas entre rutas fijas. Pero las apps reales tienen rutas DINÁMICAS: /gastos/5, /gastos/12 —una misma vista para muchos ids—. La próxima lección trae los parámetros de URL (useParams) y las query strings (useSearchParams): cómo tu componente lee la parte variable de la dirección.