In my recent project, I used Reach Router as it is the simplest way to implement routing in a React app. It provides an easier alternative to React Router, which I have used in the past. Here is a quick 5-minute tutorial to get started with Reach Router.
Installation
To get started, install Reach Router using the following command:
npm install @reach/router
In case you are unfamiliar with the @
syntax, it is an npm feature that allows the use of scoped packages.
Next, import Reach Router in your project:
import { Router } from '@reach/router'
Basic Usage
I typically use Reach Router in the top-level React file, such as index.js
in a create-react-app installation. Wrap all the components that you want to appear inside the Router component:
ReactDOM.render(
<Router>
<Form path="/" />
<PrivateArea path="/private-area" />
</Router>,
document.getElementById('root')
)
The path
attribute allows you to set the URL path for each component. When you type that path in the browser URL bar, Reach Router will display the corresponding component.
By default, the /
path is the index route and serves as the home page when no specific URL or path is specified beside the app domain.
Setting a Default Route
When a user visits an URL that does not match any defined route, Reach Router will automatically redirect to the /
route by default. To handle this scenario and display a custom “404” message, you can add a NotFound
component with the default
attribute:
<Router>
<Form path="/" />
<PrivateArea path="/private-area" />
<NotFound default />
</Router>
Programmatically Changing Routes
For programmatically changing the route in your app, you can make use of the navigate
function from Reach Router:
import { navigate } from '@reach/router'
navigate('/private-area')
Linking to Routes in JSX
To create links to your routes using JSX, you can utilize the Link
component provided by Reach Router:
import { Link } from '@reach/router'
<Link to="/">Home</Link>
<Link to="/private-area">Private Area</Link>
URL Parameters
You can add parameters to your routes using the :param
syntax:
<Router>
<User path="users/:userId" />
</Router>
In the User
component, you can access the userId
parameter as a prop:
const User = ({ userId }) => (
<p>User {userId}</p>
)
Nested Routes
Reach Router allows you to define nested routes by specifying them within a parent route component:
<Router>
<Form path="/" />
<PrivateArea path="/private-area">
<User path=":userId" />
</PrivateArea>
</Router>
In this example, the /private-area/23232
route would point to the User
component, passing 23232
as the userId
.
Additionally, you can allow a component to define its own routes by using the /*
wildcard after the route:
<Router>
<Form path="/" />
<PrivateArea path="/private-area/*" />
</Router>
Inside the PrivateArea
component, you can import Router again and define its own set of sub-routes:
// Import Router inside PrivateArea component
<Router>
<User path="/:userId" />
</router>
Any route starting with /private-area/something
will be handled by the User
component, with the remaining part sent as the userId
prop.
To display something in the /private-area
route, you also need to add a /
handler in the PrivateArea
component:
//component PrivateArea
<Router>
<User path="/:userId" />
<PrivateAreaDashboard path="/" />
</router>
Tags: reach router, react router, routing in react, react app, react tutorial