React router

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.

El módulo react router nos va a permitir navegar por las distintas páginas de nuestra aplicación React. Cuando utilizamos un enlace programado con react router la url del navegador cambiará, sin embargo, la página no se refrescará en su totalidad; sólo serán cargados los componentes correspondientes a la nueva url.

Dicho de otra forma, react router nos permite cargar unos componentes u otros en función de la url.

npm i react-router-dom

Documentación de react-router

Configuración básica

src/app/Router.jsx
import { BrowserRouter, Route, Routes} from 'react-router-dom';
import Home from '../pages/Home';
import Page2 from '../pages/Page2';

const Router = () => (
    <BrowserRouter>
        <Routes>   
            <Route index element={<Home/>} />
            <Route path="/page2" element={<Page2/>} />
             { /* Es muy recomendable añadir esta ruta para obtener un mensaje de error en el caso de que la ruta no exista. De lo contrario, si la ruta no existe llegaremos a una página en blanco */}    
            <Route path="*" element={<div>404</div> } />
        </Routes>
    </BrowserRouter>
);

export default Router;

Para recuperar el valor del parámetro id, podemos hacer un console log de las props en la página destino y ahí veremos la propiedad match, en la que estará el valor.

src/App.js
import Router from './app/Router';

const App = () => <Router />;

export default App;
src/pages/Home.jsx
import { Link } from 'react-router-dom';

const Home = () => (
        <div>    
                <ul>
                        <li><Link to="/">Home</Link></li>
                        <li><Link to="/page2">Page2</Link></li>
                        <li><Link to="/ajksdfkjhasdk">Error en la url</Link></li>
                </ul>
        </div>
)

export default Home;
./src/pages/Page2.jsx
import { Link } from 'react-router-dom';

const Page2 = () => (
        <div>    
                <ul>
                        <li><Link to="/">Home</Link></li>
                        <li><Link to="/page2">Page2</Link></li>
                        <li><Link to="/ajksdfkjhasdk">Error en la url</Link></li>
                </ul>
        </div>
)

export default Page2;

Si deseas resaltar el enlace correspondiente a la página en la que estás, puedes usar la etiqueta NavLink, que añade el class active a dicho enlace.

Configurar un Layout

./src/components/Layout/Layout.jsx
import { Link } from 'react-router-dom'

const Layout = ({ children }) => {
    return (
        <div>
            <h1>Layout</h1>
            <nav>
                <ul>
                    <li><Link to="/">Home</Link></li>
                    <li><Link to="/page2" >Page 2</Link></li>
                </ul>
            </nav>
            <main>{children}</main>
        </div>
    )
}

export default Layout;
./src/app/Router.jsx
import { BrowserRouter, Route, Routes } from 'react-router-dom';
import Home from '../pages/Home';
import Page2 from '../pages/Page2';
import Layout from './Layout';

const Router = () => (
    <BrowserRouter>
        <Layout>
            <Routes>
                <Route index element={<Home />} />
                <Route path="/page2" element={<Page2 />} />
            </Routes>
        </Layout>
    </BrowserRouter>
);

export default Router;

Recogida de parámetros

Recoger un parámetro de React Router

En el enlace:

<Link to="/product/1">Producto 1</Link>

En el Router.js:

<Route path="/product/:id" element={<Product/>} />

En el fichero en el que queremos recoger los datos:

import { useParams } from 'react-router-dom';
...
const { id } = useParams();

Recoger un parámetro del tipo ?param=valor&…

En la página en la queremos recuperar parámetros de la url, usaremos el siguiente código:

import { useLocation } from "react-router-dom";
...
const query = new URLSearchParams(useLocation().search);
  • useLocation().search accede a los parámetros de la url en la que estamos
  • URLSearchParams alimenta el objeto query, que usaremos para acceder a los parámetros mediante getters y setters.

A partir de aquí, cuando querramos recuperar los parámetros de la url:

const questionId = query.get('questionId');

Redirección desde React

Definimos el método que ejecutará la redirección:

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

const Home = () => {
    const navigate = useNavigate();

    const pulsado = () => {
        navigate('/page2');
    }

    return(  
            <button onClick={pulsado}>Pulsame</button>
    )
}
export default Home;

Rutas para cuando el proyecto no está en la raíz del servidor

Puedes consultar como hacerlo en esta otra lección.

Enrutar a un enrutamiento

No olvidar, poner la barra con el asterisco en la ruta que enlaza al enrutamiento.

<Route path="swapi/*" element={<Swapi/>} />

No será necesario repetir toda la ruta en el enrutamiento de destino. Para el menú que lleva a la home de este enrutamiento, podemos usar la prop index, en lugar de path=»/».

const Router = () => (
  <Routes>
    <Route index element={<Home/>}/>
    <Route path="profile" element={<Profile/>}/>
    <Route path="*" element={<div>404 Swapi</div>}/>
  </Routes>
);

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.