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
Carpeta pages/: Contiene las vistas completas de nuestra aplicaci贸n
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
BrowserRouter: Es el contenedor principal que habilita el enrutamiento
Routes: Contiene todas las rutas de la aplicaci贸n
Route: Define una ruta espec铆fica con:
path: La URL de la ruta
element: El componente a renderizar
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
Siempre en min煤sculas: Los paths deben estar en min煤sculas
Importaciones correctas: Aseg煤rate de que las rutas de importaci贸n sean correctas
Estructura clara: Mant茅n las p谩ginas en pages/ y la configuraci贸n en routers/
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
Olvidar instalar react-router-dom
No envolver las rutas con <BrowserRouter>
Usar <a> en lugar de <Link> (recargar铆a la p谩gina)
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
Organizaci贸n de rutas
jsx
// routes/index.js
export const ROUTES = {
HOME: '/',
ABOUT: '/about',
CONTACT: '/contact/:id?',
DASHBOARD: '/dashboard/*'
};
Validaci贸n de par谩metros
jsx
function UserProfile() {
const { id } = useParams();
if (!isValidUserId(id)) {
return <Navigate to="/not-found" />;
}
return <UserContent id={id} />;
}
Scroll restoration
jsx
import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
function ScrollToTop() {
const { pathname } = useLocation();
useEffect(() => {
window.scrollTo(0, 0);
}, [pathname]);
return null;
}
Comparaci贸n React Router vs TanStack Router
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
Publicar un comentario