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-domBasic 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>
);
}Navigation
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=reactNested 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
Q1: What's the difference between Link and NavLink?
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.
Q4: How does useNavigate differ from Link?
Link is declarative (JSX). useNavigate is imperative - navigate programmatically after events, form submissions.
Last updated on July 15, 2026