Set Up
We will need to setup React and this will be done using vite ( a build tool for modern web projects). Go to your CLI and install vite. Note, you'll need need nodejs install for the npm command line tools
With NPM 7+:
npm create vite@latest my-react-app -- --template react
With Yarn:
yarn create vite@latest my-react-app -- --template react
Then run the following prompts
cd my-react-app
npm install
npm run dev
We can see the response we have below in our CLI, this shows that dev server is ready.
VITE v4.3.8 ready in 1025 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose
➜ press h to show help
One more package we need to install is react-router-dom which allows us to define route & navigate to different pages in your application"
With NPM:
npm install react-router-dom
With Yarn:
yarn add react-router-dom
Our setup is pretty much done, now let's move forward
Our Folder Structure
This is the folder structure found in src/
src
|——— assets
|——— react.svg
|——— App.css
|——— App.jsx
|——— index.css
|——— main.jsx
We need to delete unsed file like index.css and we end up having something like this
src
|——— assets
|——— react.svg
|——— App.css
|——— App.jsx
|——— main.jsx
Defining our routes
In the main.js file, we import BrowserRouter from react-router-dom and wrap our whole app with it.
//main.jsx
import { BrowserRouter } from "react-router-dom";
ReactDOM.createRoot(document.getElementById("root")).render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>
);
We need to create two new files (Home.jsx and About.jsx) in our src folder. When that's done, let's go back to our App.js where we will import the <Routes> and <Route>components from react-router-dom.
//App.jsx
import { Routes, Route } from "react-router-dom";
import Home from "./Home";
import About from "./About";
import "./App.css";
const App = () => {
return (
<Routes>
<Route path="/" index element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
);
};
export default App;
What we've done here is when the location changes we use <Routes> to looks through all its child routes to find the best match and renders that branch of the UI.
How It Works
In our Home.jsx file, import Link component from react-router-dom and use it to define the link to the about page.
We use the # symbol followed by the
idof the section we want to scroll to (section2 of the about page in this case).
//Home.jsx
import { Link } from "react-router-dom";
const Home = () => {
return (
<div>
<Link to={"/about#section2"}>About Page</Link>
</div>
);
};
export default Home;
Scrolling to section
In the component that contains the section we want to scroll to (About.jsx in this example), We check if id is present in the URL. We can do this inside the useEffect Hook
//About.jsx
import { useEffect } from "react";
import { useLocation } from "react-router-dom";
const About = () => {
const location = useLocation();
const { hash } = location;
useEffect(() => {
if (hash) {
const section = document.querySelector(hash);
if (section) {
section.scrollIntoView({ behavior: "smooth" });
}
} else {
window.scroll(0, 0);
}
}, [hash]);
return (
<div>
<div
style={{
width: "100vw",
height: "100vh",
display: "grid",
placeContent: "center",
background: "gray",
}}
>
<div style={{ textAlign: "center" }}>
<h1>Section 1</h1>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Rerum
odio, facilis iste quaerat quisquam ex mollitia impedit dolore.
Deleniti, optio!
</p>
</div>
</div>
<div
id="section2"
style={{
width: "100vw",
height: "100vh",
display: "grid",
placeContent: "center",
background: "#fcfcfc",
}}
>
<div style={{ textAlign: "center" }}>
<h1>Section 2</h1>
<p>
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Rerum
odio, facilis iste quaerat quisquam ex mollitia impedit dolore.
Deleniti, optio!
</p>
</div>
</div>
</div>
);
};
export default About;
We use the useLocation hook from react-router-dom to get access to the current location object, which includes the hash value of the URL (if any). Then we check if the hash value is present, scroll to section2 otherwise scroll to top