React

React

Tutorial React: Definición y manejo de rutas

React - Aprende a definir y manejar rutas en React utilizando React Router. Explora <Routes>, <Route>, parámetros dinámicos con useParams y redirecciones con <Navigate>.

Explicación de <Routes> y <Route>

En React Router, la gestión de rutas se realiza principalmente a través de los componentes <Routes> y <Route>. Estos componentes permiten definir y gestionar la navegación dentro de una aplicación de React de manera declarativa.

El componente <Routes> se utiliza para envolver a múltiples <Route>. Este contenedor asegura que solo una ruta se renderice a la vez. Por otro lado, el componente <Route> define una ruta específica y el componente que debe renderizarse cuando la URL coincide con el patrón especificado.

Uso básico de <Routes> y <Route>

Se configura el enrutador:

// App.jsx
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Home from './components/Home';
import About from './components/About';
import Contact from './components/Contact';

export default function App() {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/contact" element={<Contact />} />
      </Routes>
    </Router>
  );
}

En este ejemplo:

  • <Router> es el contenedor principal que envuelve a toda la aplicación y habilita la funcionalidad de enrutamiento.
  • <Routes> envuelve todos los <Route> y asegura que solo una ruta coincidente se renderice.
  • <Route> define una ruta específica y el componente que debe renderizarse cuando la URL coincide con el patrón path.

Atributos del componente <Route>

El componente <Route> acepta varios atributos importantes:

  • path: Especifica la URL que debe coincidir para que esta ruta se renderice.
  • element: Especifica el componente que debe renderizarse cuando la ruta coincide.
  • index: Define una ruta indexada, que se renderiza cuando no se especifica ninguna ruta secundaria.

Ejemplo de rutas indexadas y anidadas:

// App.jsx
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Home from './pages/Home/Home';
import Dashboard from './pages/Dashboard/Dashboard';
import Overview from './pages/Overview/Overview';
import Details from './pages/Details/Details';

export default function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/dashboard" element={<Dashboard />}>
          <Route index element={<Overview />} />
          <Route path="details" element={<Details />} />
        </Route>
      </Routes>
    </BrowserRouter>
  );
}

En este ejemplo, Dashboard actúa como una ruta principal que puede tener rutas secundarias. Cuando la URL es /dashboard, el componente Overview se renderiza por defecto. Si la URL es /dashboard/details, entonces se renderiza el componente Details.

Manejo de parámetros dinámicos en rutas y useParams

React Router facilita la gestión de rutas con parámetros dinámicos a través del componente <Route> y el hook useParams. Los parámetros dinámicos permiten crear rutas que pueden recibir valores variables en sus URLs, lo que es útil para mostrar contenido específico basado en el valor del parámetro.

Para definir una ruta con parámetros dinámicos, se utiliza la sintaxis :param en el atributo path del componente <Route>. Por ejemplo, si queremos crear una ruta que muestre el perfil de un usuario basado en su ID, podríamos definirla así:

// App.jsx
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import UserProfile from './components/UserProfile/UserProfile';

export default function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/user/:userId" element={<UserProfile />} />
      </Routes>
    </BrowserRouter>
  );
}

En este ejemplo, la ruta /user/:userId coincide con cualquier URL que siga el patrón /user/ seguido de algún valor (por ejemplo, /user/123). El componente UserProfile puede acceder al valor del parámetro userId utilizando el hook useParams.

El hook useParams se utiliza dentro de un componente funcional para acceder a los parámetros de la ruta. Aquí hay un ejemplo de cómo se puede usar useParams en el componente UserProfile para obtener y utilizar el userId:

// UserProfile.jsx
import { useParams } from 'react-router-dom';

export default function UserProfile() {
  const { userId } = useParams();

  return (
    <div>
      <h1>Perfil de usuario</h1>
      <p>ID del usuario: {userId}</p>
    </div>
  );
}

En este fragmento de código, el hook useParams devuelve un objeto con los parámetros de la ruta. Desestructuramos este objeto para obtener el valor de userId y lo usamos dentro del componente.

Es importante tener en cuenta que los parámetros dinámicos pueden ser utilizados de manera anidada y en rutas secundarias. Por ejemplo, si tuviéramos un componente Dashboard que incluya rutas secundarias con parámetros dinámicos, podríamos definirlo así:

// App.jsx
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import UserProfile from './components/UserProfile/UserProfile';
import Dashboard from './pages/Dashboard/Dashboard';
import Settings from './pages/Settings/Settings';

export default function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/dashboard" element={<Dashboard />}>
          <Route path="user/:userId" element={<UserProfile />} />
          <Route path="settings" element={<Settings />} />
        </Route>
      </Routes>
    </BrowserRouter>
  );
}

En este ejemplo, la ruta /dashboard/user/:userId permite acceder al componente UserProfile dentro del contexto del Dashboard, utilizando el parámetro dinámico userId.

El uso de parámetros dinámicos en rutas proporciona una forma flexible y potente de construir aplicaciones React que pueden responder a diferentes URLs y proporcionar contenido específico basado en esos parámetros.

Rutas no coincidentes y <Navigate>

Es común encontrarse con escenarios en los que la URL del navegador no coincide con ninguna de las rutas definidas. Para manejar estas situaciones, se puede utilizar el componente <Navigate>, que permite redirigir al usuario a una ruta específica cuando no se encuentra una coincidencia.

El componente <Navigate> se utiliza para redirigir programáticamente a los usuarios a una ruta diferente. Esto es útil para manejar rutas no coincidentes, redirecciones después de acciones específicas (como el envío de un formulario), o para proteger rutas que requieren autenticación.

Uso de **<Navigate>** para redirección de rutas no coincidentes

Para redirigir a los usuarios cuando la URL no coincide con ninguna ruta definida, se puede utilizar un Route con el atributo path="*" junto con el componente <Navigate>. Este enfoque asegura que cualquier URL no coincidente redirija a una ruta específica, como una página de inicio o una página de error personalizada.

// App.jsx
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
import Home from './pages/Home/Home';
import About from './pages/About/About';
import Contact from './pages/Contact/Contact';
import NotFound from './pages/NotFound/NotFound';

export default function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/contact" element={<Contact />} />
        <Route path="/not-found" element={<NotFound />} />
        <Route path="*" element={<Navigate to="/not-found" />} />
      </Routes>
    </BrowserRouter>
  );
}

En este ejemplo:

  • La ruta path="*" se utiliza para capturar cualquier URL que no coincida con las rutas definidas.
  • El componente <Navigate> redirige a la ruta /not-found, donde renderizar un componente NotFound para informar al usuario que la página no fue encontrada.

Redirección condicional con <Navigate>

El componente <Navigate> también puede ser utilizado para redirecciones condicionales. Por ejemplo, si se desea redirigir a los usuarios a una página de inicio de sesión si no están autenticados, se puede hacer de la siguiente manera:

// ProtectedRoute.jsx
import { Navigate } from 'react-router-dom';

export default function ProtectedRoute({ isAuthenticated, children }) {
  if (!isAuthenticated) {
    return <Navigate to="/login" />;
  }
  return children;
}
// App.jsx
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import Home from './pages/Home/Home';
import Login from './pages/Login/Login';
import Dashboard from './pages/Dashboard/Dashboard';
import ProtectedRoute from './components/ProtectedRoute/ProtectedRoute';

export default function App() {
  const isAuthenticated = false; // Esta variable debería determinarse dinámicamente

  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/login" element={<Login />} />
        <Route path="/dashboard" element={
          <ProtectedRoute isAuthenticated={isAuthenticated}>
            <Dashboard />
          </ProtectedRoute>
        } />
      </Routes>
    </BrowserRouter>
  );
}

En este ejemplo:

  • ProtectedRoute es un componente que verifica si el usuario está autenticado (isAuthenticated).
  • Si el usuario no está autenticado, <Navigate> redirige a la página de inicio de sesión (/login).
  • Si el usuario está autenticado, se renderiza el componente hijo (Dashboard).

Manejo de redirecciones con estado

El componente <Navigate> también permite pasar estado a la ruta de destino, lo que puede ser útil para mostrar mensajes o mantener información sobre la navegación previa. Este estado se puede acceder en el componente de destino a través del hook useLocation.

// App.jsx
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom';
import Home from './pages/Home/Home';
import Login from './pages/Login/Login';
import Dashboard from './pages/Dashboard/Dashboard';

export default function App() {
  const isAuthenticated = false; // Esta variable debería determinarse dinámicamente

  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/login" element={<Login />} />
        <Route path="/dashboard" element={
          !isAuthenticated ? (
            <Navigate to="/login" state={{ from: '/dashboard' }} />
          ) : (
            <Dashboard />
          )
        } />
      </Routes>
    </BrowserRouter>
  );
}
// Login.jsx
import { useLocation } from "react-router-dom";

export default function Login() {
  const location = useLocation();
  const from = location.state?.from || '/';

  return (
    <div>
      <h1>Inicio de sesión</h1>
      <p>Redirigido desde: {from}</p>
    </div>
  );
}

En este ejemplo:

  • Se pasa un estado { from: '/dashboard' } al redirigir a la página de inicio de sesión.
  • El componente Login accede a este estado utilizando el hook useLocation y muestra la URL desde la cual se redirigió al usuario.

El uso del componente <Navigate> proporciona una manera flexible y declarativa de manejar redirecciones en aplicaciones React, asegurando una navegación fluida y controlada en diversas situaciones.

Certifícate en React con CertiDevs PLUS

Ejercicios de esta lección Definición y manejo de rutas

Evalúa tus conocimientos de esta lección Definición y manejo de rutas con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Todas las lecciones de React

Accede a todas las lecciones de React y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A React Y Su Ecosistema

React

Introducción Y Entorno

Instalar React Y Crear Nuevo Proyecto

React

Introducción Y Entorno

Introducción A Jsx

React

Componentes

Introducción A Componentes

React

Componentes

Componentes Funcionales

React

Componentes

Eventos En React

React

Componentes

Props Y Manejo De Datos Entre Componentes

React

Componentes

Renderizado Condicional

React

Componentes

Renderizado Iterativo Con Bucles

React

Componentes

Manejo De Clases Y Estilos

React

Componentes

Introducción A Los Hooks

React

Hooks

Estado Y Ciclo De Vida De Los Componentes

React

Hooks

Hooks Para Manejo De Estado Y Efectos Secundarios

React

Hooks

Hooks Para Gestión De Estado Complejo Y Contexto

React

Hooks

Hooks Para Optimización Y Actualizaciones Concurrentes

React

Hooks

Introducción A React Router

React

Navegación Y Enrutamiento

Definición Y Manejo De Rutas

React

Navegación Y Enrutamiento

Rutas Anidadas Y Rutas Dinámicas

React

Navegación Y Enrutamiento

Navegación Programática Y Redireccionamiento

React

Navegación Y Enrutamiento

Nuevos Métodos Create De React Router

React

Navegación Y Enrutamiento

Solicitudes Http Con Fetch Api

React

Interacción Http Con Backend

Solicitudes Http Con Axios

React

Interacción Http Con Backend

Estado Local Con Usestate Y Usereducer

React

Servicios Y Gestión De Estado

Estado Global Con Context Api

React

Servicios Y Gestión De Estado

Estado Global Con Redux Toolkit

React

Servicios Y Gestión De Estado

Custom Hooks Para Servicios Compartidos

React

Servicios Y Gestión De Estado

Certificados de superación de React

Supera todos los ejercicios de programación del curso de React y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.

En esta lección

Objetivos de aprendizaje de esta lección

  • Entender la estructura y el uso de los componentes <Routes> y <Route> en React Router.
  • Configurar rutas básicas, indexadas y anidadas.
  • Manejar parámetros dinámicos utilizando el hook useParams.
  • Implementar redirecciones con el componente <Navigate>.
  • Gestionar rutas no coincidentes y redirección condicional basada en autenticación.