DEV Community

Abhay Singh Kathayat
Abhay Singh Kathayat

Posted on

Understanding React Router v6: Features, Setup, and Best Practices

React Router v6: A Complete Guide

React Router is the most popular library used for routing in React applications. It allows you to navigate between different components based on the URL, providing a single-page application (SPA) experience where the content updates without reloading the entire page. React Router v6 is the latest major release and introduces a range of improvements, simplifications, and new features compared to previous versions.


Key Features and Changes in React Router v6

  1. Simplified API

    • React Router v6 introduces a simpler and more intuitive API for defining routes and navigation, eliminating the need for many workarounds present in v5.
  2. Route Element (element)

    • In v6, routes now use the element prop instead of the component or render prop. This allows you to directly pass the component to render.
    • Old (v5): component={ComponentName}
    • New (v6): element={<ComponentName />}
  3. Route Matching

    • Route matching is now more intuitive. In v6, the routes are matched exactly, meaning the best match is chosen, and it no longer requires a "catch-all" route for handling dynamic segments.
    • The <Switch> component is replaced with <Routes>, and it’s used to render only the first route that matches the URL.
  4. Nested Routes

    • React Router v6 makes it easier to define nested routes. Instead of using render or children for nesting, you can now directly define nested routes using the element prop.
  5. No More exact

    • In React Router v6, all routes match exactly by default, so there is no need to use the exact prop to specify exact matching.
  6. React Router Hooks

    • React Router v6 has updated the hooks to match its new architecture, including useNavigate, useParams, useLocation, useMatch, and useNavigate.

How to Set Up React Router v6

To get started with React Router v6, follow these steps:

1. Install React Router v6

You can install React Router v6 using npm or yarn.

npm install react-router-dom@6
# or
yarn add react-router-dom@6
Enter fullscreen mode Exit fullscreen mode

2. Define Routes and Components

Let’s look at an example of how to set up basic routing in React Router v6.

Step 1: Define the Main App Component
import React from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Home from './Home';
import About from './About';
import NotFound from './NotFound';

const App = () => {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="*" element={<NotFound />} />
      </Routes>
    </Router>
  );
};

export default App;
Enter fullscreen mode Exit fullscreen mode
  • <Routes>: This replaces the <Switch> component from previous versions. It ensures that only the first matching route is rendered.
  • <Route path="/" element={<Home />} />: This defines a route for the home page and renders the Home component.
  • <Route path="*": The * wildcard is used to handle 404 errors or unmatched routes, rendering the NotFound component when the URL does not match any route.
Step 2: Create Individual Components

Home.js

import React from 'react';

const Home = () => {
  return <h2>Home Page</h2>;
};

export default Home;
Enter fullscreen mode Exit fullscreen mode

About.js

import React from 'react';

const About = () => {
  return <h2>About Us</h2>;
};

export default About;
Enter fullscreen mode Exit fullscreen mode

NotFound.js

import React from 'react';

const NotFound = () => {
  return <h2>Page Not Found</h2>;
};

export default NotFound;
Enter fullscreen mode Exit fullscreen mode

Dynamic Routing with React Router v6

To handle dynamic routes, such as a user profile page where the user ID is part of the URL, React Router v6 provides the useParams hook.

Step 1: Define a Dynamic Route

import React from 'react';
import { Routes, Route, useParams } from 'react-router-dom';

const UserProfile = () => {
  const { userId } = useParams();  // Extract the userId from the URL

  return <h2>User Profile for ID: {userId}</h2>;
};

const App = () => {
  return (
    <Routes>
      <Route path="/user/:userId" element={<UserProfile />} />
    </Routes>
  );
};

export default App;
Enter fullscreen mode Exit fullscreen mode

Explanation:

  • :userId is a dynamic segment in the route path. The useParams hook allows you to access the value of userId in the UserProfile component.
  • When you navigate to /user/123, the UserProfile component will render and display the userId as 123.

Nested Routes in React Router v6

Nested routes allow you to build complex layouts by defining sub-routes within parent routes.

Step 1: Define Parent and Child Routes

import React from 'react';
import { Routes, Route } from 'react-router-dom';

const Dashboard = () => {
  return (
    <div>
      <h2>Dashboard</h2>
      <Routes>
        <Route path="overview" element={<Overview />} />
        <Route path="settings" element={<Settings />} />
      </Routes>
    </div>
  );
};

const Overview = () => <h3>Overview Page</h3>;
const Settings = () => <h3>Settings Page</h3>;

const App = () => {
  return (
    <Routes>
      <Route path="/dashboard/*" element={<Dashboard />} />
    </Routes>
  );
};

export default App;
Enter fullscreen mode Exit fullscreen mode

Explanation:

  • The Dashboard component contains nested routes for overview and settings.
  • The /* in the parent route ensures that all child routes are handled under /dashboard.

React Router v6 Hooks

React Router v6 introduces several hooks for navigating and accessing routing information:

  1. useNavigate: Programmatically navigate to different routes.
  2. useParams: Access dynamic URL parameters.
  3. useLocation: Get information about the current location (URL).
  4. useMatch: Matches the current URL to a given route.
  5. useResolvedPath: Resolve a path to an absolute URL.

Example: useNavigate Hook

The useNavigate hook allows programmatic navigation within your application.

import React from 'react';
import { useNavigate } from 'react-router-dom';

const RedirectToAbout = () => {
  const navigate = useNavigate();

  const goToAboutPage = () => {
    navigate('/about');  // Navigate to the About page programmatically
  };

  return (
    <div>
      <button onClick={goToAboutPage}>Go to About Page</button>
    </div>
  );
};

export default RedirectToAbout;
Enter fullscreen mode Exit fullscreen mode

React Router v6 Best Practices

  • Exact Matching by Default: React Router v6 matches routes exactly by default, making it easier to handle route matching without needing to specify exact.
  • Use element Prop: Pass JSX directly to the element prop instead of using the component prop, simplifying your code and reducing the need for render functions.
  • Nested Routing: Use nested routes to build complex page layouts with child routes, keeping your code modular and maintainable.
  • Handle 404s with Wildcard Route: Use the wildcard * to catch all unmatched routes and display a 404 page or redirect users to a default route.

Conclusion

React Router v6 introduces several improvements over previous versions, including a simpler API, better route matching, and enhanced support for dynamic and nested routes. By leveraging hooks like useNavigate, useParams, and useLocation, you can build powerful and flexible routing systems in your React applications.


Top comments (0)