13-Implementar React Router y Navegación
Objetivo
Configurar React Router para crear una Single Page Application (SPA) con navegación entre componentes.
Paso 1: Preparar los componentes
Primero, vamos a agregar contenido básico a nuestros componentes para visualizar la navegación.
En Movie.js:
// Movie.js
import React from 'react';
const Movie = () => {
return (
<div>
<h1>Movie</h1>
</div>
);
};
export default Movie;En MovieList.js:
// MovieList.js
import React from 'react';
const MovieList = () => {
return (
<div>
<h1>Movie List</h1>
</div>
);
};
export default MovieList;En MovieDetail.js:
// MovieDetail.js
import React from 'react';
const MovieDetail = () => {
return (
<div>
<h1>Movie Detail</h1>
</div>
);
};
export default MovieDetail;Nota:
Usamos componentes funcionales (recomendados en React moderno).
Los nombres están en PascalCase (convención).
Exportamos cada componente como
export default.
Paso 2: Instalar React Router
En la terminal, ejecuta:
npm install react-router-domEsto añade la librería de enrutamiento a nuestro proyecto.
Paso 3: Configurar Router en index.js
Importa BrowserRouter y envuelve la aplicación:
// index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import { BrowserRouter } from 'react-router-dom'; // Importar BrowserRouter
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<BrowserRouter> {/* Envolver la App con BrowserRouter */}
<App />
</BrowserRouter>
</React.StrictMode>
);Paso 4: Configurar Navegación en App.js
4.1 Importar componentes y elementos de React Router
// App.js
import React from 'react';
import { Switch, Route, Link } from 'react-router-dom';
import Movie from './components/movies/Movie';
import MovieList from './components/movies/MovieList';
import MovieDetail from './components/movies/MovieDetail';4.2 Crear barra de navegación
Vamos a crear una barra de navegación con enlaces usando <Link>:
// App.js
function App() {
return (
<div>
{/* Barra de Navegación */}
<nav className="navbar navbar-expand-lg navbar-light bg-light">
<div className="container-fluid">
<Link className="navbar-brand" to="/">
Películas
</Link>
<div className="navbar-nav">
<Link className="nav-link" to="/">
Lista
</Link>
<Link className="nav-link" to="/add">
Agregar
</Link>
</div>
</div>
</nav>
{/* Contenedor para las rutas */}
<div className="container mt-3">
<Switch>
{/* Ruta para lista de películas */}
<Route exact path={["/", "/movies"]} component={MovieList} />
{/* Ruta para detalles de película (con parámetro id) */}
<Route path="/movies/:id" component={MovieDetail} />
{/* Ruta para agregar/editar película */}
<Route path="/add" component={Movie} />
</Switch>
</div>
</div>
);
}
export default App;Explicación:
<Link>: Reemplaza<a>para navegar sin recargar la página.to: Define la ruta de destino.
<Switch>: Renderiza solo la primera ruta que coincida.<Route>: Define las rutas y los componentes a mostrar.exact: Coincide exactamente con la ruta.path: Ruta URL.component: Componente a renderizar.:id: Parámetro dinámico (para detalles de película).
Paso 5: Probar la Navegación
Inicia el servidor:
npm startPrueba las rutas:
/o/movies→ MostraráMovieList./movies/1→ MostraráMovieDetail./add→ MostraráMovie.
Puedes cambiar la URL manualmente o usar los enlaces de la barra de navegación.
Errores Comunes y Soluciones
Error: "BrowserRouter is not defined"
Causa: Error de escritura en la importación.
Solución: Verifica que sea
BrowserRouter(con 'R' mayúscula).
Error: Etiquetas sin cerrar en JSX
Ejemplo:
<input>debe ser<input />.Solución: Cierra todas las etiquetas automáticamente o manualmente.
Error: El componente no se renderiza
Causa: Rutas mal definidas o importaciones incorrectas.
Solución:
Revisa los nombres de los componentes importados.
Verifica que las rutas en
<Route>coincidan con los enlaces<Link>.
Error: No se actualiza la vista al navegar
Causa: El servidor de desarrollo puede quedar en un estado inconsistente.
Solución: Detén el servidor (
Ctrl + C) y reinícialo connpm start.
Buenas Prácticas
PascalCase: Nombres de componentes y archivos en PascalCase.
Orden alfabético: En imports para mejor organización.
Componentes funcionales: Preferidos sobre clases (compatibilidad con Hooks).
export default: Úsalo al final del archivo del componente.
Resumen
Hemos implementado React Router para:
Crear una SPA con navegación sin recargas.
Configurar rutas básicas y dinámicas.
Usar
<Link>para navegación y<Route>para definir vistas.Manejar errores comunes durante la configuración.
En el siguiente paso, conectaremos la aplicación a una API para gestionar datos de películas.
¿Preguntas? ¡Déjalas en los comentarios
Comentarios
Publicar un comentario