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’strue
if 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’strue
if we want to render only if a path matches exactly.strict
— boolean prop that’strue
is 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.pathname
location
— an object prop that tries to match its path in the current history location.sensitive
— a boolean prop thattrue
if 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.to
can also be an object that has thepathname
,search
,state
andhash
properties. Thepathname
is a string that has the path to link to.search
is a string of the query parameters,hash
is a hash top put in the URL,state
is the state to persist to the location.to
can also be a function which takes the currentlocation
as the argument and returns thelocation
representation as a string as an object.replace
— a boolean prop that replaces the current entry in the history stack instead of adding one iftrue
innerRef
— 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 theref
of the component.- We can any other attribute to the
a
tag 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.