React Router 5.1+ Hooks

React Router 5.1+ Hooks

React Router 5.1 introduced four hooks to implement routing in a function-based way.

In this tutorial, we'll see how to use React Router 5 hooks by example.

Please note that you need to be using React 16.8+ version to use hooks either built-in or custom third-party hooks including the router hooks.

React Router 5/4 Example Without Hooks

Let's see how to route a component without in the old way i.e without using hooks.

If you need to map a component named Home as an example to the main path, you simply need to write the following line of code after you import the Route and Home components:

<Route path="/" component={Home} />

Now when you go to the / path, the Home component will be rendered.

The component will be passed various route props such as match, location and history which will allow you to access routing information in your component.

If you need to pass extra props. you'll have to use the render property insted of component:

<Route path="/" render={({ match }) => <Home match={match} mine={true} />}>

Our Example with React Router 5 Hooks

Now, let's write our previous example with hooks. We map the Home component to the / path using the following syntax:

<Route path="/">
  <Home />
</Route>

Route props such as match, history or location are not passed to the Home component so we need to use the new router hooks to access these features.

The useHistory Hook

The useHistory hook allows access to the history prop in React Router.

First, you need to import the hook from the react-router-dom package:

import { useHistory } from 'react-router-dom';

Next, you can call the hook inside the Home component as follows:

function Home() {
  const history = useHistory();
  return <button onClick={() => history.push('/user')}>User</button>;
}

The useLocation Hook

The useLocation hook enables access to the location prop in React Router that provides the router state and location.

You can use this hook to access the query parameters or the route string.

You need to start by importing the hook as follows:

import { useLocation } from 'react-router-dom';

Next, you need to use it inside your component as follows:

function User() {
  const location = useLocation();
  useEffect(() => {

    console.log("Location Info: ", location.pathname. location.search);

  }, [location]);
  return <div>User Info</div>;
}

Each time the location property changes, the location.pathname and location.search will be printed on the console.