React is a library for creating front end views. It has a big ecosystem of libraries that work with it. Also, we can use it to enhance existing apps.
To build single-page apps, we have to have some way to map URLs to the React component to display.
In this article, we’ll look at the basic usage of React Router.
Installation
To use React Router, we have to install it. We can do that by running:
npm i react-router-dom
Basic Usage
React Router has a few basic components.
BrowserRouter
First, there’s the BrowserRouter to do the routing with the HTML5 history API.
It takes a few props:
basename— a string prop for the base URL for all locations.getUserConfirmation— a function prop we use to confirm navigation. Defaults to usingwindow.confirm.forceRefresh— a boolean prop that’strueif we want a full refresh on page navigation. It’s useful for imitating traditional server-render apps.keyLength— a number prop that sets the length oflocation.key. Defaults to 6.children— a React component to render. Before React 16, we can only use a single child element. If we want to render more than one element, we can wrap it in a div.
Switch
Next, there’s the Switch component. It renders the first child Route or Redirect that matches the location.
Switch renders a route exclusively. Route that matches the location renders inclusively.
Switch will only pick one Route to render.
Route
The Route component is the most important component in React Router.
It’s used to map URLs to components and takes the following props:
component— we pass in the component to map the URL to by passing in a component to it.render— this prop takes a function that returns something that we want to render.children— a function prop that lets us render something when the path matchesRoute‘s path and render something else otherwise.path— a string or array of strings that are paths to match.exact— a boolean prop to that’strueif we want to render only if a path matches exactly.strict— boolean prop that’strueis we only want to match a path with a trailing slash only when the URL entered has a trailing slash. It has no effect when there’re additional URL segments inlocation.pathnamelocation— an object prop that tries to match its path in the current history location.sensitive— a boolean prop thattrueif the path is case-sensitive.
Link
The Link component provides accessible navigation around our app.
It takes the following props:
to— a string prop with the path that we want to go to. It’s created by concatenating location’s pathname, search and hash properties.tocan also be an object that has thepathname,search,stateandhashproperties. Thepathnameis a string that has the path to link to.searchis a string of the query parameters,hashis a hash top put in the URL,stateis the state to persist to the location.tocan also be a function which takes the currentlocationas the argument and returns thelocationrepresentation as a string as an object.replace— a boolean prop that replaces the current entry in the history stack instead of adding one iftrueinnerRef— a function or ref object that we shouldn’t need if we’re using React Router 5.1 or later with React 16. It lets us access therefof the component.- We can any other attribute to the
atag liketitle,id,className, etc.
Example
We can use the components above together as follows:
import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter as Router, Switch, Route, Link } from "react-router-dom";
function Home() {
return <h2>Home</h2>;
}
function Foo() {
return <h2>Foo</h2>;
}
function Bar() {
return <h2>Bar</h2>;
}
function App() {
return (
<Router>
<div>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/foo">Foo</Link>
</li>
<li>
<Link to="/bar">Bar</Link>
</li>
</ul>
<Switch>
<Route exact path="/">
<Home />
</Route>
<Route path="/foo">
<Foo />
</Route>
<Route path="/bar">
<Bar />
</Route>
</Switch>
</div>
</Router>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
In the code above, we have the Home , Foo , and Bar components which display some text.
Then we add Router in App and put all our Route s inside so when we click on the Link s, they’ll display the component we specified.
We have:
<Switch>
<Route exact path="/">
<Home />
</Route>
<Route path="/foo">
<Foo />
</Route>
<Route path="/bar">
<Bar />
</Route>
</Switch>
In the Switch , we have exact in the first Route to only show Home when we go to / .
Then we define 2 more Route s to show Foo when we go to /foo and Bar when we go to /bar .
Conclusion
We can use React Router to map URLs to components. This lets us create a single-page app since we render components according to URLs on the client-side.
Therefore, we’ll have a self-contained app that works on its own without the server rendering things when we type in URLs.
We have the Link to render links, Route to map URLs to components. Router wraps around anything that needs routing.
Switch renders the first child Route or Redirect that matches the location.