28
loading...
This website collects cookies to deliver better user experience
npm install react-router-dom@6
BrowserRouter
to our index.js
:import React from "react";
import ReactDOM from "react-dom";
import "./index.css";
import App from "./App";
import { BrowserRouter } from "react-router-dom";
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById("root")
);
Link
from the react-router-dom
package we installed earlier.import { Link } from "react-router-dom";
import "./App.css";
const App = () => {
return <Link to="/hotels">Hotels</Link>;
};
Hotels list.
Form to add new hotels to the list.
Routes
and Route
from the react-router
package.import { useState } from "react";
import { Route, Routes } from "react-router";
import classes from "./app.module.css";
import Nav from "./components/Nav";
import Form from "./pages/Form";
import Hotels from "./pages/Hotels";
const App = () => {
const hotelsArray = [
{
name: "Hotel Barcelona",
rooms: 5,
rating: 8,
},
{
name: "Hotel Paris",
rooms: 41,
rating: 9,
},
{
name: "Hotel Munich",
rooms: 14,
rating: 10,
},
];
const [hotels, setHotels] = useState(hotelsArray);
const newHotelHandler = (hotel) => {
setHotels((prevState) => [...prevState, hotel]);
};
return (
<>
<Nav />
<div className={classes.container}>
<Routes>
<Route path="/hotels" element={<Hotels hotels={hotels} />} />
</Routes>
<Routes>
<Route path="/new" element={<Form onSubmit={newHotelHandler} />} />
</Routes>
</div>
</>
);
};
export default App;
nav
that contains all the Links
:import classes from "./Nav.module.css";
import { Link } from "react-router-dom";
const Nav = () => {
return (
<div className={classes.nav}>
<div className={classes.nav__container}>
<Link style={{textDecoration: 'none', color: 'white'}} to="/hotels">Hotels</Link>
<Link style={{textDecoration: 'none', color: 'white'}} to="/new">Add new</Link>
</div>
</div>
);
};
export default Nav;
app.js
. I want that url to be /hotels/hotelID
so my new route will be defined like this:<Routes>
<Route path="/hotels/:hotelId" element={<Details hotels={hotels} />} />
</Routes>
useParams
hook from the react-router-dom
package and read the params:import { useParams } from "react-router-dom";
const Details = () => {
const params = useParams();
return <h1>{params.hotelId}</h1>;
};
export default Details;
import classes from "./Details.module.css";
import { Link, useParams } from "react-router-dom";
const Details = ({ hotels }) => {
const params = useParams();
const hotel = hotels[params.hotelId];
return (
<div className={classes.container}>
<h1>Hotel: {hotel.name}</h1>
<h2>Rooms: {hotel.rooms}</h2>
<h3>Rating: {hotel.rating}/10</h3>
<Link to="/hotels">
<button className={classes.container__save}>Hotels</button>
</Link>
</div>
);
};
export default Details;
Link
:const Hotels = ({ hotels }) => {
return (
<div className={classes.container}>
{hotels.map((hotel, key) => {
return (
<Link to={`/hotels/${key}`} style={{textDecoration: 'none', color: 'black'}}>
<div key={key} className={classes.element}>
<h1>{hotel.name}</h1>
<h2>Rooms: {hotel.rooms}</h2>
<h3>Rating: {hotel.rating}/10</h3>
</div>
</Link>
);
})}
</div>
);
};
export default Hotels;
Form.js
component we have to import the useNavigate
hook from the react-router-dom
package.import { useState } from "react";
import { useNavigate } from "react-router-dom";
import classes from "./Form.module.css";
const Form = ({ onSubmit }) => {
const navigate = useNavigate();
const [name, setName] = useState("");
const [rooms, setRooms] = useState(0);
const [rating, setRating] = useState(0);
const nameHandler = (event) => {
setName(event.target.value);
};
const roomsHandler = (event) => {
setRooms(event.target.value);
};
const ratingHandler = (event) => {
setRating(event.target.value);
};
const onSubmitHandler = () => {
onSubmit({name: name, rooms: rooms, rating: rating});
// After saving the hotel redirect the user to the hotels list
navigate('/hotels')
}
return (
<div className={classes.container}>
<div className={classes.container__field}>
<label>Hotel Name</label>
<input onChange={nameHandler} type="text" />
</div>
<div className={classes.container__field}>
<label>Rooms</label>
<input onChange={roomsHandler} type="number" min="1" max="99" />
</div>
<div className={classes.container__field}>
<label>Rating</label>
<input onChange={ratingHandler} type="number" min="1" max="10" />
</div>
<button onClick={onSubmitHandler} className={classes.container__save}>Save</button>
</div>
);
};
export default Form;
/hotels
and /hotels/:hotelId
. import { useState } from "react";
import { Route, Routes } from "react-router";
import classes from "./app.module.css";
import Nav from "./components/Nav";
import Details from "./pages/Details";
import Form from "./pages/Form";
import Hotels from "./pages/Hotels";
const App = () => {
const hotelsArray = [
{
name: "Hotel Barcelona",
rooms: 5,
rating: 8,
},
{
name: "Hotel Paris",
rooms: 41,
rating: 9,
},
{
name: "Hotel Munich",
rooms: 14,
rating: 10,
},
];
const [hotels, setHotels] = useState(hotelsArray);
const newHotelHandler = (hotel) => {
setHotels((prevState) => [...prevState, hotel]);
};
return (
<>
<Nav />
<div className={classes.container}>
<Routes>
<Route path="/hotels">
<Route path="" element={<Hotels hotels={hotels} />} />
<Route path=":hotelId" element={<Details hotels={hotels} />} />
</Route>
</Routes>
<Routes>
<Route path="/new" element={<Form onSubmit={newHotelHandler} />} />
</Routes>
</div>
</>
);
};
export default App;