Learn how to programmatically navigate between routes and pass data in your React application using React Router V4.
This guide will walk you through the process of programmatic navigation in React Router. We'll explore two primary methods: the useNavigate Hook for React Router v6 and the history object for React Router v5 and earlier. You'll learn how to import necessary components, access navigation functions, and navigate to different routes within your React application. Examples will be provided to illustrate each method, along with additional considerations such as passing state and replacing history entries. Finally, we'll discuss how to choose the appropriate method based on your React Router version.
React Router offers powerful tools for managing navigation within your React applications. While declarative routing using <Link> components is common, there are situations where programmatic navigation is necessary. Let's explore two primary methods for achieving this: the useNavigate Hook (React Router v6) and the history object (React Router v5 and earlier).
Method 1: useNavigate Hook (React Router v6)
import { useNavigate } from 'react-router-dom';const navigate = useNavigate();navigate('/home'); // Navigates to the "/home" routeExample:
import React from 'react';
import { useNavigate } from 'react-router-dom';
function MyComponent() {
  const navigate = useNavigate();
  const handleClick = () => {
    navigate('/profile'); // Navigate to the profile page on click
  };
  return (
    <button onClick={handleClick}>Go to Profile</button>
  );
}Method 2: History Object (React Router v5 and earlier)
history package:npm install historyimport { createBrowserHistory } from 'history';
const history = createBrowserHistory();history.push('/about'); // Navigates to the "/about" routeExample:
import React from 'react';
import { createBrowserHistory } from 'history';
const history = createBrowserHistory();
function MyComponent() {
  const handleClick = () => {
    history.push('/dashboard'); // Navigate to the dashboard page on click
  };
  return (
    <button onClick={handleClick}>Go to Dashboard</button>
  );
}Additional Considerations:
navigate('/details', { state: { id: 123 } });
history.push('/details', { id: 123 });Replacing History: Use history.replace instead of history.push to replace the current history entry instead of creating a new one.
Accessing History in Components: In React Router v5, you can use the withRouter Higher-Order Component (HOC) to inject the history object into your component's props.
Choosing the Right Method:
useNavigate is the recommended approach due to its simplicity and integration with the latest React features.history object provides similar functionality.By understanding these methods, you can effectively implement programmatic navigation in your React Router applications, enabling dynamic and interactive user experiences.
This code demonstrates two ways to navigate programmatically in React Router. The first method uses the useNavigate hook (for React Router v6 and above) to navigate to different routes within a React application. The second method, for React Router v5 and earlier, uses the history object to achieve the same result. Both methods involve defining a function that is triggered by a button click, which then uses either navigate or history.push to redirect the user to the specified route.
Here's a breakdown of the JavaScript code for both methods mentioned in the article, along with explanations:
Method 1: useNavigate Hook (React Router v6)
import React from 'react';
import { useNavigate } from 'react-router-dom';
function MyComponent() {
  const navigate = useNavigate(); // Access the navigate function
  const handleClick = () => {
    navigate('/profile'); // Navigate to "/profile" on button click
  };
  return (
    <button onClick={handleClick}>Go to Profile</button>
  );
}Explanation:
useNavigate: We import the useNavigate hook from react-router-dom which allows us to navigate programmatically.useNavigate inside our component to get the navigate function.handleClick function that will be triggered when the button is clicked. Inside this function, we use navigate('/profile') to navigate to the "/profile" route.Method 2: History Object (React Router v5 and earlier)
import React from 'react';
import { createBrowserHistory } from 'history';
const history = createBrowserHistory(); // Create history object
function MyComponent() {
  const handleClick = () => {
    history.push('/dashboard'); // Navigate to "/dashboard" on click
  };
  return (
    <button onClick={handleClick}>Go to Dashboard</button>
  );
}Explanation:
history:  You need to install the history package using npm or yarn: npm install history
createBrowserHistory from the history package and create a history object.handleClick function. This time, we use history.push('/dashboard') to navigate to the "/dashboard" route.Key Differences:
useNavigate is for v6 and above, while history object is for v5 and earlier.useNavigate is generally considered simpler and more integrated with React.history object requires installing the history package separately.Choosing the Right Method:
useNavigate.history object.Beyond the Basics:
/users/123 would allow you to access the user ID (123) in the Users component.navigate('/search?q=react') would navigate to the search page with the query "react".Prompt component from react-router-dom.Advanced Use Cases:
history object or useNavigate hook within non-component files, such as utility functions or event handlers, by leveraging React's Context API or a global state management solution.Error Handling:
ErrorBoundary component from react-router-dom to gracefully handle navigation errors, such as navigating to a non-existent route.Testing:
react-testing-library to simulate user interactions and ensure your programmatic navigation works as expected.Accessibility:
Additional Tips:
Remember: Choose the method that aligns with your React Router version and project requirements. Consider factors like simplicity, maintainability, and the need for additional features when making your decision.
| Method | React Router Version | Description | Example | 
|---|---|---|---|
| useNavigateHook | v6+ | Provides a function to navigate to different routes. | navigate('/home') | 
| historyObject | v5 and earlier | Requires installing the historypackage. Offers methods likepushandreplacefor navigation. | history.push('/about') | 
In conclusion, mastering programmatic navigation in React Router empowers you to create dynamic and responsive web applications. Whether you opt for the useNavigate Hook in React Router v6 or the history object in earlier versions, you gain the ability to control navigation flow based on user interactions, application state, or other factors. By understanding the nuances of each method, passing state, handling navigation history, and addressing potential errors, you can elevate the user experience and build more interactive and engaging React applications. Remember to choose the approach that aligns best with your project's requirements and React Router version, and don't hesitate to explore advanced use cases and best practices to further enhance your navigation implementation.
 How to Programmatically Navigate with React Router | In this up-to-date guide, you'll learn the two ways to programmatically navigate with React Router - the Navigate component and the useNavigate Hook.
 How to Programmatically Navigate with React Router | In this up-to-date guide, you'll learn the two ways to programmatically navigate with React Router - the Navigate component and the useNavigate Hook. javascript - How to programmatically navigate using React Router ... | Jun 26, 2015 ... With v4 of React Router, there are three approaches that you can take to programmatic routing within components. Use the withRouter higher-order ...
 javascript - How to programmatically navigate using React Router ... | Jun 26, 2015 ... With v4 of React Router, there are three approaches that you can take to programmatic routing within components. Use the withRouter higher-order ... reactjs - Navigating Programmatically in React-Router v4 - Stack ... | Oct 6, 2016 ... import React from 'react'; class NavigateNext extends React.Component { constructor() { super(); this.navigateProgramatically = this.
 reactjs - Navigating Programmatically in React-Router v4 - Stack ... | Oct 6, 2016 ... import React from 'react'; class NavigateNext extends React.Component { constructor() { super(); this.navigateProgramatically = this. How to Programmatically Navigate with React Router | by Umesh ... | With react-router I can use the Link element to create links which are natively handled by react router.
 How to Programmatically Navigate with React Router | by Umesh ... | With react-router I can use the Link element to create links which are natively handled by react router. Nested routes with React Router v4 | by Tyler McGinnis | We've ... | React Router v4 introduced a new declarative, component based approach to routing. With that approach came some confusion around nested…
 Nested routes with React Router v4 | by Tyler McGinnis | We've ... | React Router v4 introduced a new declarative, component based approach to routing. With that approach came some confusion around nested… useNavigate v6.23.0 | React Router | The useNavigate hook returns a function that lets you navigate programmatically, for example in an effect: import { useNavigate } from "react-router-dom ...
 useNavigate v6.23.0 | React Router | The useNavigate hook returns a function that lets you navigate programmatically, for example in an effect: import { useNavigate } from "react-router-dom ... Programmatically navigate using React router | by Hafil | Medium | React Router v6.6.1 with useNavigate
 Programmatically navigate using React router | by Hafil | Medium | React Router v6.6.1 with useNavigate