DEV Community

Cover image for React Router Hooks - How To Use Them
Buddy Agyin šŸ¦
Buddy Agyin šŸ¦

Posted on

27 6

React Router Hooks - How To Use Them

I know I'm a little behind the ball, but a few months ago React-Router released a new update that introduced hooks to their API.

This update now allows users access to the state of the router and the ability to perform navigation from inside components by using the useHistory, useParams, useLocation, and useRouteMatch hooks.

Today, I'll be giving you a brief overview of each of the hooks and how they've changed the way we write routes.

useHistory

The useHistory hook gives you access to the history object that you can use to navigate routes.

import { useHistory } from "react-router-dom"

const Homepage = () => {
  let history = useHistory()

  function goBack(){
    history.goBack()
  }

  function goHome(){
    history.push('/')
  } 

  return(
    <div>
      <button onClick={goBack}>Previous</button>
      <button onClick={goHome}>Home</button>
    </div>
 )
}

export default Homepage
Enter fullscreen mode Exit fullscreen mode

The history object will give us access to the following properties and methods:

  • length - (number) The number of entries in the history stack
  • action - (string) The current action (PUSH, REPLACE, or POP)
  • location - (object) The current location. May have the following properties:
    • pathname - (string) The path of the URL
    • search - (string) The URL query string
    • hash - (string) The URL hash fragment
    • state - (object) location-specific state that was provided to e.g. push(path, state) when this location was pushed onto the stack. Only available in browser and memory history.
  • push(path, [state]) - (function) Pushes a new entry onto the history stack
  • replace(path, [state]) - (function) Replaces the current entry on the history stack
  • go(n) - (function) Moves the pointer in the history stack by n entries
  • goBack() - (function) Equivalent to go(-1)
  • goForward() - (function) Equivalent to go(1)
  • block(prompt) - (function) Prevents navigation

useParams

The useParams hook gives you access to the params of the given route. Params are just parameters on a given URL that is dynamically set.

Before the useParams hook was introduced by React-Router you had to access the params through props that were passed down to the component like so

import React from "react"
import ReactDOM from "react-dom"
import {
  BrowserRouter as Router,
  Switch,
  Route
} from "react-router-dom"

function Post(props) {
  let { id } = props.match.params
  return <div>Now showing post {id}</div>
}

function App(){
  return(
   <div className='app'>
    <Router>
      <Switch>
        <Route exact path="/" component={Homepage} />
        <Route 
          path="/blog/:id"
          render={routerProps => (
           <Post {...routerProps}/>
          )}
          />
      </Switch>
    </Router>
   </div>
 )
}
Enter fullscreen mode Exit fullscreen mode

Now all you need to do is call the useParams hook to have access to the params.

import React from "react"
import ReactDOM from "react-dom"
import {
  BrowserRouter as Router,
  Switch,
  Route,
  useParams
} from "react-router-dom"

function Post(props) {
  let { id } = useParams()
  return <div>Now showing post {id}</div>
}

function App(){
  return(
   <div className='app'>
    <Router>
      <Switch>
        <Route exact path="/" />
          <Homepage />
        </Route>
        <Route path="/blog/:id">
          <Post />
        </Route>
      </Switch>
    </Router>
   </div>
 );
}
Enter fullscreen mode Exit fullscreen mode

useLocation

Another hook that now ships with the React-Router update is the useLocation hook.

This hook will give you access to the location object that represents the current URL. The official documentation said that you can view the useLocation hook as useState that returns a new location every time the URL is updated.

import React from "react"
import ReactDOM from "react-dom"
import {
  BrowserRouter as Router,
  Switch,
  useLocation
} from "react-router-dom"

const LearnMore = () => {
  let location = useLocation()
  return(
    <div>
      You are currently at the following path {location.pathname}
    </div>
  )
 }

function App(){
 return(
  <div className='app'>
    <Router>
     <ul>
        <li>
            <Link to='/'>Home</Link>
        </li>
        <li>
            <Link to='/learn-more'>Learn More</Link>
        </li>
     </ul>
     <Switch>
       <Route exact path='/'>
          <HomePage />
       </Route>
       <Route path='/learn-more'>
          <LearnMore />
       </Route>
     </Switch>
    </Router>
  </div>
 )
}
Enter fullscreen mode Exit fullscreen mode

useRouteMatch

Finally, the useRouteMatch hook will give you access to the match property without actually rendering a <Route> component.

Previously you had to use the render prop function to handle this like so

import { Route } from "react-router-dom"

function AnimalCard() {
  return (
    <Route
      path="/animal/:id"
      render={({ match }) => {
        // Do some stuff with your match...
        return <div />
      }}
    />
  );
}
Enter fullscreen mode Exit fullscreen mode

Now you can just import the hook and render elements once the route matches

import { useRouteMatch } from "react-router-dom"

function AnimalCard() {
  let match = useRouteMatch("/animal/:id")

  // Do some stuff with your match...
  return <div />;
}
Enter fullscreen mode Exit fullscreen mode

One thing that is extremely helpful about the useRouteMatch hook is that it accepts strict, exact, path, and sensitive options as well.

Conclusion

Well, there you have it! A quick look at the React-Router hooks. Try these out with your next project and check out the full documentation here

SurveyJS custom survey software

Build Your Own Forms without Manual Coding

SurveyJS UI libraries let you build a JSON-based form management system that integrates with any backend, giving you full control over your data with no user limits. Includes support for custom question types, skip logic, an integrated CSS editor, PDF export, real-time analytics, and more.

Learn more

Top comments (0)

nextjs tutorial video

Youtube Tutorial Series

So you built a Next.js app, but you need a clear view of the entire operation flow to be able to identify performance bottlenecks before you launch. But how do you get started? Get the essentials on tracing for Next.js from @nikolovlazar in this video series šŸ‘€

Watch the Youtube series

AWS GenAI LIVE!

GenAI LIVE! is a dynamic live-streamed show exploring how AWS and our partners are helping organizations unlock real value with generative AI.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ā¤ļø