30. Routers

Routers en React

馃搶 Introducci贸n a las rutas en React

En React, las rutas nos permiten navegar entre diferentes p谩ginas o vistas dentro de una aplicaci贸n. Es similar a navegar de un lugar a otro en la vida real: vamos del punto A al punto B a trav茅s de diferentes caminos o rutas.

馃梻️ Estructura del proyecto

Para trabajar con rutas, necesitamos organizar nuestro proyecto de la siguiente manera:

text

src/

├── components/      # Componentes reutilizables

├── pages/           # P谩ginas completas

├── routers/         # Configuraci贸n de rutas

├── App.jsx

└── main.jsx

馃殌 Paso 1: Crear la estructura de carpetas

  1. Carpeta pages/: Contiene las vistas completas de nuestra aplicaci贸n

  2. Carpeta routers/: Contiene la configuraci贸n de las rutas





馃搫 Paso 2: Crear las p谩ginas

Pagina1.jsx:

jsx

export function Pagina1() {

    return <h1>Pagina 1</h1>;

}

Pagina2.jsx:

jsx

export function Pagina2() {

    return <h1>Pagina 2</h1>;

}

馃摝 Paso 3: Instalar React Router DOM

En la terminal, ejecuta:

bash

npm install react-router-dom

Verifica que en package.json aparezca en dependencias:

json

"dependencies": {

  "react-router-dom": "^6.0.0"

}

馃敡 Paso 4: Configurar las rutas

routes.jsx:

jsx

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

import { Pagina1 } from "../pages/Pagina1";

import { Pagina2 } from "../pages/Pagina2";


export function MyRoutes() {

    return (

        <BrowserRouter>

            <Routes>

                <Route path="/" element={<Pagina1 />} />

                <Route path="/pagina2" element={<Pagina2 />} />

            </Routes>

        </BrowserRouter>

    );

}

馃敆 Paso 5: Navegar entre p谩ginas

Para navegar entre p谩ginas, usamos el componente Link:

Pagina1.jsx actualizado:

jsx

import { Link } from "react-router-dom";


export function Pagina1() {

    return (

        <div>

            <h1>Pagina 1</h1>

            <Link to="/pagina2">Ir a pagina 2</Link>

        </div>

    );

}

Pagina2.jsx actualizado:

jsx

import { Link } from "react-router-dom";


export function Pagina2() {

    return (

        <div>

            <h1>Hola soy pagina 2</h1>

            <Link to="/">Ir a pagina 1</Link>

        </div>

    );

}

馃幆 Paso 6: Integrar las rutas en App.jsx

App.jsx:

jsx

import { MyRoutes } from "./routers/routes";


function App() {

    return <MyRoutes />;

}


export default App;

馃摑 Paso 7: Entender c贸mo funcionan las rutas

  1. BrowserRouter: Es el contenedor principal que habilita el enrutamiento

  2. Routes: Contiene todas las rutas de la aplicaci贸n

  3. Route: Define una ruta espec铆fica con:

    • path: La URL de la ruta

    • element: El componente a renderizar

  4. Link: Reemplaza al elemento <a> para navegar sin recargar la p谩gina

馃攳 Explicaci贸n de las rutas configuradas

  • Ruta principal (/): Muestra Pagina1

  • Ruta secundaria (/pagina2): Muestra Pagina2

馃挕 Consejos importantes

  1. Siempre en min煤sculas: Los paths deben estar en min煤sculas

  2. Importaciones correctas: Aseg煤rate de que las rutas de importaci贸n sean correctas

  3. Estructura clara: Mant茅n las p谩ginas en pages/ y la configuraci贸n en routers/

  4. Ruta por defecto: La ruta / suele ser la p谩gina principal

馃帹 Visualizaci贸n en el navegador

  • Al entrar a http://localhost:5173/ ver谩s "Pagina 1"

  • Al hacer clic en "Ir a pagina 2", la URL cambiar谩 a http://localhost:5173/pagina2

  • Ver谩s "Hola soy pagina 2" con un enlace para volver

馃毇 Errores comunes a evitar

  1. Olvidar instalar react-router-dom

  2. No envolver las rutas con <BrowserRouter>

  3. Usar <a> en lugar de <Link> (recargar铆a la p谩gina)

  4. Errores en las rutas de importaci贸n

✅ Resumen

Las rutas en React nos permiten crear aplicaciones de una sola p谩gina (SPA) con m煤ltiples vistas. Con react-router-dom podemos definir rutas, navegar entre ellas sin recargar la p谩gina y mantener una URL limpia y navegable.

Este sistema es fundamental para cualquier aplicaci贸n React que requiera m煤ltiples p谩ginas o vistas, manteniendo la experiencia de usuario fluida y profesiona

*************************************************************************

Routers en React

Los routers en React son librer铆as que permiten manejar la navegaci贸n en aplicaciones de una sola p谩gina (SPA), cambiando la vista sin recargar la p谩gina completa.

Librer铆as principales

1. React Router (la m谩s popular)

bash

npm install react-router-dom


2. TanStack Router (anteriormente React Location)

bash

npm install @tanstack/react-router

React Router (v6)

Configuraci贸n b谩sica

jsx

// App.jsx

import { BrowserRouter, Routes, Route } from 'react-router-dom';

import Home from './Home';

import About from './About';

import Contact from './Contact';


function App() {

  return (

    <BrowserRouter>

      <Routes>

        <Route path="/" element={<Home />} />

        <Route path="/about" element={<About />} />

        <Route path="/contact" element={<Contact />} />

      </Routes>

    </BrowserRouter>

  );

}

Navegaci贸n entre rutas

jsx

import { Link, useNavigate } from 'react-router-dom';


function Navbar() {

  const navigate = useNavigate();

  

  return (

    <nav>

      {/* Navegaci贸n declarativa */}

      <Link to="/">Inicio</Link>

      <Link to="/about">Acerca de</Link>

      

      {/* Navegaci贸n program谩tica */}

      <button onClick={() => navigate('/contact')}>

        Contacto

      </button>

      

      {/* Navegaci贸n con par谩metros */}

      <Link to="/users/123">Usuario 123</Link>

    </nav>

  );

}

Rutas din谩micas y par谩metros

jsx

// App.jsx

<Routes>

  <Route path="/users/:id" element={<UserProfile />} />

  <Route path="/products/:category/:id" element={<ProductDetail />} />

</Routes>


// UserProfile.jsx

import { useParams } from 'react-router-dom';


function UserProfile() {

  const { id } = useParams(); // Obtiene el par谩metro :id

  return <h1>Perfil del usuario {id}</h1>;

}

Rutas anidadas (Layouts)

jsx

// App.jsx

<Routes>

  <Route path="/" element={<Layout />}>

    <Route index element={<Home />} />

    <Route path="dashboard" element={<Dashboard />}>

      <Route path="stats" element={<Stats />} />

      <Route path="settings" element={<Settings />} />

    </Route>

  </Route>

</Routes>


// Layout.jsx

import { Outlet } from 'react-router-dom';


function Layout() {

  return (

    <div>

      <header>Mi Aplicaci贸n</header>

      <main>

        {/* Aqu铆 se renderizan las rutas hijas */}

        <Outlet />

      </main>

      <footer>Pie de p谩gina</footer>

    </div>

  );

}

Hook de navegaci贸n avanzado

jsx

import { useLocation, useSearchParams, useMatch } from 'react-router-dom';


function ProductPage() {

  const location = useLocation(); // Informaci贸n de la ruta actual

  const [searchParams, setSearchParams] = useSearchParams(); // Query params

  const match = useMatch('/products/:id'); // Pattern matching

  

  // Ejemplo: Obtener par谩metros de query

  const sortBy = searchParams.get('sort');

  

  // Ejemplo: Actualizar query params

  const handleSort = (value) => {

    setSearchParams({ sort: value });

  };

  

  return (

    <div>

      <p>Ruta actual: {location.pathname}</p>

      <button onClick={() => handleSort('price')}>

        Ordenar por precio

      </button>

    </div>

  );

}

Caracter铆sticas avanzadas

1. Lazy Loading de rutas

jsx

import { lazy, Suspense } from 'react';


const LazyComponent = lazy(() => import('./HeavyComponent'));


<Routes>

  <Route path="/heavy" element={

    <Suspense fallback={<div>Cargando...</div>}>

      <LazyComponent />

    </Suspense>

  } />

</Routes>

2. Protecci贸n de rutas

jsx

// PrivateRoute.jsx

import { Navigate } from 'react-router-dom';


function PrivateRoute({ children, isAuthenticated }) {

  return isAuthenticated ? children : <Navigate to="/login" />;

}


// Uso

<Route path="/dashboard" element={

  <PrivateRoute isAuthenticated={user}>

    <Dashboard />

  </PrivateRoute>

} />



3. Manejo de errores

jsx

<Routes>

  <Route path="/" element={<Home />} />

  <Route path="*" element={<NotFound />} />

  <Route path="/error" element={<ErrorBoundary />} />

</Routes>

Mejores pr谩cticas

  1. Organizaci贸n de rutas

  2. jsx

// routes/index.js

export const ROUTES = {

  HOME: '/',

  ABOUT: '/about',

  CONTACT: '/contact/:id?',

  DASHBOARD: '/dashboard/*'

  1. };

  2. Validaci贸n de par谩metros

  3. jsx

function UserProfile() {

  const { id } = useParams();

  

  if (!isValidUserId(id)) {

    return <Navigate to="/not-found" />;

  }

  

  return <UserContent id={id} />;

  1. }

  2. Scroll restoration

  3. jsx

import { useEffect } from 'react';

import { useLocation } from 'react-router-dom';


function ScrollToTop() {

  const { pathname } = useLocation();

  

  useEffect(() => {

    window.scrollTo(0, 0);

  }, [pathname]);

  

  return null;

  1. }

Comparaci贸n React Router vs TanStack Router

Caracter铆stica

React Router

TanStack Router

Tama帽o

~18KB

~14KB

Tipado

TypeScript incluido

TypeScript-first

Loaders

S铆 (v6.4+)

S铆

DevTools

No

S铆

Curva aprendizaje

Media

Media-Alta

Popularidad

Muy alta

Creciente

Ejemplo completo

jsx

// App.jsx

import { BrowserRouter, Routes, Route } from 'react-router-dom';

import Layout from './Layout';

import Home from './Home';

import About from './About';

import Users from './Users';

import UserDetail from './UserDetail';

import NotFound from './NotFound';


function App() {

  return (

    <BrowserRouter>

      <Routes>

        <Route element={<Layout />}>

          <Route index element={<Home />} />

          <Route path="about" element={<About />} />

          <Route path="users">

            <Route index element={<Users />} />

            <Route path=":userId" element={<UserDetail />} />

          </Route>

          <Route path="*" element={<NotFound />} />

        </Route>

      </Routes>

    </BrowserRouter>

  );

}

Los routers son esenciales para crear SPAs profesionales en React, proporcionando una experiencia de usuario fluida mientras mantienen la estructura y organizaci贸n del c贸digo. React Router sigue siendo la opci贸n m谩s popular, pero TanStack Router ofrece caracter铆sticas modernas interesantes para proyectos complejos


Comentarios

Entradas m谩s populares de este blog

29. useEffect

11. Creando un proyecto react con create-react-app

21. Props para objetos