Docs LogoDocs

React Router Basics - Client-Side Routing

Documentation for React Router Basics - Client-Side Routing.

React Router Basics - Client-Side Routing

Setup

npm install react-router-dom

Basic Routing

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

function App() {
  return (
    <BrowserRouter>
      <nav>
        <Link to="/">Home</Link>
        <Link to="/about">About</Link>
        <Link to="/users">Users</Link>
      </nav>

      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/users" element={<Users />} />
        <Route path="*" element={<NotFound />} />
      </Routes>
    </BrowserRouter>
  );
}
import { Link, NavLink, useNavigate } from 'react-router-dom';

// Link - basic navigation
<Link to="/about">About</Link>

// NavLink - active styling
<NavLink to="/about" className={({ isActive }) => isActive ? 'active' : ''}>
  About
</NavLink>

// Programmatic navigation
function Form() {
  const navigate = useNavigate();

  const handleSubmit = () => {
    // Navigate after action
    navigate('/success');
    navigate(-1);  // Go back
  };
}

Route Parameters

// Define dynamic route
<Route path="/users/:id" element={<UserDetail />} />;

// Access params
import { useParams } from "react-router-dom";

function UserDetail() {
  const { id } = useParams();
  return <div>User ID: {id}</div>;
}

Query Parameters

import { useSearchParams } from "react-router-dom";

function Search() {
  const [searchParams, setSearchParams] = useSearchParams();
  const query = searchParams.get("q");

  return (
    <input
      value={query || ""}
      onChange={(e) => setSearchParams({ q: e.target.value })}
    />
  );
}
// URL: /search?q=react

Nested Routes

<Route path="/dashboard" element={<Dashboard />}>
  <Route index element={<DashboardHome />} />
  <Route path="settings" element={<Settings />} />
  <Route path="profile" element={<Profile />} />
</Route>;

// Dashboard component with Outlet
import { Outlet } from "react-router-dom";

function Dashboard() {
  return (
    <div>
      <h1>Dashboard</h1>
      <Outlet /> {/* Child routes render here */}
    </div>
  );
}

Interview Questions & Answers

Both prevent page reloads. NavLink adds active styling capabilities via className/style functions that receive isActive prop.


Q2: How do you access URL parameters?

useParams for path params (/users/:id), useSearchParams for query params (?q=value).


Q3: What is the Outlet component?

Renders child routes in nested routing. Parent defines layout, Outlet marks where children appear.


Link is declarative (JSX). useNavigate is imperative - navigate programmatically after events, form submissions.

Last updated on July 15, 2026

On this page