Para poder realizar este taller ud debe:
Un esquema (layout) recurrente en las aplicaciones web es la presencia de un banner, un menú de navegación, una parte central donde se renderiza la mayoría del contenido y un footer.
La parte correspondiente al contenido cambia dependiendo de la ruta a donde navegue el usuario o a la opción del menú que haya seleccionado.
Para implementar este esquema usaremos la librería React Router, la cual instalamos con el siguiente comando: npm install react-router-dom --save
.
Tomaremos como referencia el ejemplo que desarrollamos en el tutorial del hook de efecto. Este será entonces el componente principal (app.js):
import { BrowserRouter, Routes, Route } from "react-router-dom";
import "./App.css";
import Detail from "./components/detail";
import Mascotas from "./components/mascotas";
import NavBar from "./components/navbar";
function App() {
return (
<div className="App">
<NavBar></NavBar>
<BrowserRouter>
<Routes>
<Route path="/" element={<Mascotas />} />
<Route path="/mascotas" element={<Mascotas />} />
<Route path="/mascotas/:mascotaId" element={<Detail />} />
</Routes>
</BrowserRouter>
</div>
);
}
export default App;
La modificación que hemos incluido acá es el uso de un componente denominado NavBar, el cual corresponde a la barra de navegación. Luego usamos el componente BrowserRouter que será el encargado de manejar la navegación. Dentro del componente Routes incluimos las rutas de la aplicación:
El componente NavBar tiene el siguiente contenido:
import Container from "react-bootstrap/Container";
import Navbar from "react-bootstrap/Navbar";
function NavBar() {
return (
<>
<Navbar bg="dark" variant="dark">
<Container>
<Navbar.Brand href="/mascotas">Adóptame</Navbar.Brand>
</Container>
</Navbar>
</>
);
}
export default NavBar;
Acá usamos un componente de Bootstrap para mostrar una barra de navegación.
Este es el contenido del componente Mascotas:
import Mascota from "./mascota";
import Row from "react-bootstrap/Row";
import Col from "react-bootstrap/Col";
const { useEffect, useState } = require("react");
function Mascotas() {
const [mascotas, setMascotas] = useState([]);
useEffect(() => {
const URL =
"https://gist.githubusercontent.com/josejbocanegra/829a853c6c68880477697acd0490cecc/raw/99c31372b4d419a855e53f0e891246f313a71b20/mascotas.json";
fetch(URL)
.then((data) => data.json())
.then((data) => {
setMascotas(data);
});
}, []);
return (
<div className="container">
<h2 className="mt-2">Listado de mascotas</h2>
<hr></hr>
<Row>
{mascotas.map((mascota) => (
<Col key={mascota.id}>
<Mascota mascota={mascota} />
</Col>
))}
</Row>
</div>
);
}
export default Mascotas;
Este es el contenido del componente mascota:
import Card from "react-bootstrap/Card";
import { Link } from "react-router-dom";
function Mascota(props) {
return (
<Card style={{ width: "18rem", height: "24rem" }} className="mb-3">
<Card.Img
style={{ height: "14rem" }}
variant="top"
src={props.mascota.foto}
alt={props.mascota.descripcion}
/>
<Card.Body>
<Card.Title>
<Link to={"/mascotas/" + props.mascota.id}>
{props.mascota.nombre}
</Link>
</Card.Title>
<Card.Text>{props.mascota.descripcion}</Card.Text>
</Card.Body>
</Card>
);
}
export default Mascota;
Acá podemos observar que en el nombre de la mascota hemos agregado un nuevo componente denominado Link, que navegará a la ruta /mascotas/ más el id de la mascota. Cuando se usa Link la navegación actualizará solo una parte de la página y no la página completa.
Este es el contenido del componente Detail:
import { useParams } from "react-router-dom";
export default function Detail() {
const params = useParams();
return (
<div>
<h1>I am {params.mascotaId}</h1>
</div>
);
}
En este componente usamos el hook useParams que captura los parámetros de la url. El componente mostrará entonces el valor del parámetro mascotaId.
Reto:
Modifique el componente Detail para mostrar los detalles de una mascota así: