DEV Community

Harsh Mishra
Harsh Mishra

Posted on

React Router: Concepts and Practical Guide(Part 1)

Ultimate Guide to React Router: Concepts and Practical Guide

Introduction

Routing is an essential feature in any modern web application. It allows users to navigate between different sections or pages seamlessly, creating a smooth and interactive experience. In React, this is achieved using React Router, a powerful library designed to handle routing in Single Page Applications (SPAs).

React Router simplifies the process of creating dynamic and nested routes, handling URL parameters, implementing protected routes, and much more. In this comprehensive guide, we’ll explore all aspects of React Router, breaking down its concepts step-by-step and implementing them with practical examples.


What is React Router?

React Router is a declarative, component-based library for managing routing in React applications. It uses a modern approach to map URLs to components, allowing developers to build scalable and dynamic SPAs with ease.

Key Features of React Router

  1. Declarative Routing: Define routes as components, which makes the routing system easy to understand and maintain.
  2. Dynamic Routing: Handle dynamic parameters in URLs like /user/:id to create flexible and reusable routes.
  3. Nested Routes: Organize your routes hierarchically, enabling parent-child relationships.
  4. Protected Routes: Secure specific routes behind authentication or authorization.
  5. Programmatic Navigation: Navigate between pages programmatically based on user actions.
  6. Support for Browser History: Sync with the browser’s navigation, including forward, backward, and refresh actions.

Installing React Router

Before we start, let’s set up React Router in your project. Install the library using npm or yarn:

# Using npm
npm install react-router-dom

# Using yarn
yarn add react-router-dom
Enter fullscreen mode Exit fullscreen mode

Once installed, you’re ready to integrate React Router into your application.


Core Concepts of React Router

React Router revolves around a few core concepts that form the foundation of its routing system. Let’s break them down step by step.


1. BrowserRouter and Router Components

At the top level of your React application, you need to wrap everything inside a Router. React Router provides multiple types of routers, but the most common one is BrowserRouter, which uses the browser’s history API to manage navigation.

Key Points about BrowserRouter

  • It provides the context required for routing.
  • It listens to changes in the browser’s URL and re-renders components accordingly.
  • Other types of routers, like HashRouter, use a hash (#) in the URL for navigation, but BrowserRouter is more commonly used in modern applications.

How to Use BrowserRouter

Here’s a basic example of using BrowserRouter:

import React from "react";
import { BrowserRouter } from "react-router-dom";

function App() {
    return (
        <BrowserRouter>
            <div>
                <h1>Welcome to My App</h1>
                <p>Routing starts here!</p>
            </div>
        </BrowserRouter>
    );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

Explanation:

  • We import BrowserRouter from react-router-dom.
  • The BrowserRouter component wraps the entire application to enable routing functionality.

Note: You can only have one BrowserRouter at the root of your application.


2. Routes and Route Components

After wrapping your app with BrowserRouter, you define individual routes using the Routes and Route components.

What are Routes and Route Components?

  • Routes: A container for all the routes in your application.
  • Route: Represents a single route and defines:
    • path: The URL path to match.
    • element: The React component to render if the path matches.

Basic Example

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

function Home() {
    return <h1>Home Page</h1>;
}

function About() {
    return <h1>About Page</h1>;
}

function App() {
    return (
        <BrowserRouter>
            <Routes>
                <Route path="/" element={<Home />} />
                <Route path="/about" element={<About />} />
            </Routes>
        </BrowserRouter>
    );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

Explanation:

  1. path="/": This route matches the root URL (/) and renders the Home component.
  2. path="/about": Matches /about and renders the About component.
  3. When the URL changes (e.g., /about), React Router automatically renders the corresponding component.

3. Link and NavLink Components

In a React application, using traditional <a> tags for navigation causes the browser to reload the page. React Router provides the Link and NavLink components for seamless navigation without a page refresh.

The Link Component

The Link component allows you to navigate between routes by updating the URL without reloading the page.

import React from "react";
import { BrowserRouter, Routes, Route, Link } from "react-router-dom";

function Home() {
    return <h1>Home Page</h1>;
}

function About() {
    return <h1>About Page</h1>;
}

function Navbar() {
    return (
        <nav>
            <Link to="/">Home</Link>
            <Link to="/about">About</Link>
        </nav>
    );
}

function App() {
    return (
        <BrowserRouter>
            <Navbar />
            <Routes>
                <Route path="/" element={<Home />} />
                <Route path="/about" element={<About />} />
            </Routes>
        </BrowserRouter>
    );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

Explanation:

  • Link replaces traditional <a> tags.
  • Use the to prop to specify the destination path.

The NavLink Component

The NavLink component is similar to Link, but it allows you to style the link based on whether it is active.

import React from "react";
import { NavLink } from "react-router-dom";

function Navbar() {
    return (
        <nav>
            <NavLink to="/" activeClassName="active">Home</NavLink>
            <NavLink to="/about" activeClassName="active">About</NavLink>
        </nav>
    );
}
Enter fullscreen mode Exit fullscreen mode

Key Difference:

  • The NavLink component adds an activeClassName (or isActive) prop to style active links.

Putting It All Together

Let’s combine these concepts into a small example application:

import React from "react";
import { BrowserRouter, Routes, Route, Link } from "react-router-dom";

function Home() {
    return <h1>Welcome to the Home Page!</h1>;
}

function About() {
    return <h1>Learn More About Us</h1>;
}

function Navbar() {
    return (
        <nav>
            <Link to="/">Home</Link>
            <Link to="/about">About</Link>
        </nav>
    );
}

function App() {
    return (
        <BrowserRouter>
            <Navbar />
            <Routes>
                <Route path="/" element={<Home />} />
                <Route path="/about" element={<About />} />
            </Routes>
        </BrowserRouter>
    );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

Output:

  • Navigate to / to see the Home Page.
  • Navigate to /about to see the About Page.
  • The page updates dynamically without reloading.

Next Steps

In this part, we covered the basics:

  1. What React Router is and how it works.
  2. Setting up BrowserRouter.
  3. Defining routes using Routes and Route.
  4. Adding navigation with Link and NavLink.

In the next article, we’ll explore:

  • Nested routing
  • Dynamic routes
  • Handling URL parameters

Stay tuned for the next installment of this Ultimate Guide to React Router series!

Top comments (0)