React-router-dom es una de las más populares liberías de enrutamiento más populares para ReactJS, nos permite utilizar múltiples páginas. Esta es una herramienta conveniente para cuando hay que gestionar proyectos de gran envergadura.
La realidad es que react-router-dom es un monorepo que alberga las siguiente librerías :
Paso previos
Lo primero que se necesita es tener un proyecto de react, puedes hacerlo directamente con create-react-app o con vite
# create react app
npx create-react-app router-tutorial
# vite
npm init vite@latest router-tutorial --template react
Con este paso hecho, vamos Para instalar la librería vamos a la terminal encima de nuestro proyecto react, y tipeamos lo siguiente:
Una vez instalado, en el documento de [project-folder]\src\app.jsx importamos las siguientes dependencias:
import { BrowserRouter, Route, Routes } from "react-router-dom";
Para lo siguiente vamos a generar algunos componentes que nos sirvan de páginas para la aplicación, siguiendo la siguiente estructura de carpetas
\src
App.jsx
\layout
\pages
CreateClient.jsx
ListClient.jsx
En los documentos alojados en la carpeta \pages\ vamos a agregar lo siguiente:
import React from ' react ' ;
const CreateClient = () => {
return (
< div >
Create CLient
</ div >
);
};
export default CreateClient ;
import React from ' react ' ;
const ListClient = () => {
return (
< div >
Index CLient
</ div >
);
};
export default ListClient ;
Volvemos al documento src\App.jsx y lo primero que vamos a instanciar es BrowserRouter, para generar un nuevo routing, cargando diferentes endpoints y cargando los componentes que vamos a definir.
Una vez colocada la etiqueta de apertura y cierre de BrowserRouter, dentro vamos a colocar las etiquetas de Routes, que a su vez dentro va a contener las etiquetas Route. Así que nuestro código debería verse así:
import { BrowserRouter , Route , Routes } from " react-router-dom " ;
import Main from " ./layout/Main " ;
import CreateClient from " ./pages/CreateClient " ;
import EditClient from " ./pages/EditClient " ;
import ListClientfrom " ./pages/ListClient " ;
function App () {
return (
< BrowserRouter >
< Route >
< Route />
</ Route >
</ Routes >
< / BrowserRouter >
);
}
export default App;
💡 Anatomía de un ` `
Dentro de la etiqueta se definen los siguientes atributos:
`path=”/ruta”element={ }`
A partir de aquí vamos a aprovechar una de las virtudes de la nueva versión de react-route-dom, que se denomina nested route, que no sería más que rutas embebidas, o anidadas, con esto podemos hacer una ruta principal, y que de esta vayan generando nuevas sub-rutas.
💡 rutas con variables, por ejemplo, al momento de editar o mostrar un registro determinado, utilizamos identificadores, que transferimos por el método get (que generalmente se agrega al final de la cabecera), para manejar esto con react-route-dom, tenemos placeholder, en donde podemos definir que tipo de valor se espera en una URL
Ejemplo:
`<Route path="edit/**:id**" element={ } />`
para definir un placeholder, solo debemos colocar ***dos puntos (:)*** seguido de la variable esperada
💡 Anatomía de un ` `anidado
Para generar rutas anidadas solo tienes que colocar la etiqueta route con apertura y cierre, para que dentro de ella se contengan las rutas anidadas dentro de etiquetas sin cierre
`<Route path=”/client” element={ }><Route element={/}/></Route>`
</aside>
Ya con esto deberíamos tener un src\App.jsx de la siguiente manera:
Para definir la ruta principal dentro de las rutas anidadas, es importante destacar dos cosas, la primera (por convención) ruta no debe tener el atributo `path`, lo segundo es que puede especificar que es la principal con el atributo `index`, como se puede apreciar en el ejemplo
```jsx
import { BrowserRouter, Route, Routes } from "react-router-dom";
import Main from "./layout/Main";
import CreateClient from "./pages/CreateClient";
import EditClient from "./pages/EditClient";
import ListClientfrom "./pages/ListClient";
function App() {
return (
<Route path="/" element={ }>
<Route index element={ } />
<Route path="add" element={ } />
</Route>
</Routes>
);
}
export default App;
```
Aprovechando las nuevas características de react-router dom, vamos a manejar las vistas a través de un layout, para ello necesitamos utilizar otra nueva función de la librería que es ` `, que agregaremos a nuestro `layout\\Main.jsx`
💡 ` ` nos permite manejar una estructura de layout en donde cada que sea necesario se ira inyectando el componente solicitado
Esto nos permite desarrollar de forma modular, incluso mantener la estructura de la página seccionada, usando por ejemplo un componente para el ``, ``, ``, contenido y demás
También estaremos integrando al proyecto otras funcionalidades propias de react-route-dom, como `Link` o `NavLink`.
` ` es un conveniente sustituto de ``, ya que al usar anchor→ que cada que se clickea recarga la página y re-renderiza cada componente , en cambio, con link, se ahorra el recargar página y carga y actualiza solo los componentes correspondientes a la URL
💡 Anatomía [básica] de un ` `
Se asemeja mucho a anchor, solo que se plantea con algunas diferencias
`to` → `href` : el string u objeto con una ruta definida,
replace : remplaza
classname: para agregar clases
También podemos usar un hook, para mostrar en que parte de la app estamos ubicados o pasar parámetros a través de la URL, este es el hook `useLocation()`, en donde nos muestra si le damos `console.log()` nos devuelve un objeto con los siguientes valores:
```jsx
//token de seguridad
hash:""
key: "default"
//la dirección donde se encuentra ubicado
pahtname: "client/add"
//rescata los valores GET, como por ejemplo client?id:20
search: ""
state: null
```
Podemos instanciarlo de la siguiente manera:
```jsx
const location = useLocation();
```
Ya con estos nuevos elementos definidos podemos estructurar nuestro proyecto de la siguiente manera:
```jsx
import { Outlet, Link, useLocation} from "react-router-dom";
const Main = () => {
const location = useLocation();
const activeUrl = location.pathname;
return (
layout principal
Agenda de clientes</Link>
Crear de clientes</Link>
</div>
);
};
export default Main;
```
ya con esto tenemos disponible las rutas de nuestro proyecto
Creditos de la img: Mouse interactive vector field by frank [[link]](https://codepen.io/franksLaboratory/pen/VwWGbPo)