React Router is the standard routing library for React. Let's master it from basics to advanced patterns.
Installation
bash
npm install react-router-domBasic Setup
typescript
import { BrowserRouter, Routes, Route } from 'react-router-dom';
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/contact" element={<Contact />} />
</Routes>
</BrowserRouter>
);
}Navigation
Link Component
typescript
import { Link } from 'react-router-dom';
<Link to="/" />Home</Link>
<Link to="/about" />About</Link>
<Link to="/contact" />Contact</Link>NavLink for Active States
typescript
import { NavLink } from 'react-router-dom';
<NavLink to="/" className={({ isActive }) => isActive ? 'active' : ''} />
Home
</NavLink>Programmatic Navigation
typescript
import { useNavigate } from 'react-router-dom';
function MyComponent() {
const navigate = useNavigate();
const handleClick = () => {
navigate('/about');
navigate(-1); // Go back
navigate('/about', { replace: true });
};
return <button onClick={handleClick} />Go to About</button>;
}Route Parameters
URL Parameters
typescript
// Route definition
<Route path="/users/:id" element={<UserDetail />} />
// Access parameter
import { useParams } from 'react-router-dom';
function UserDetail() {
const { id } = useParams();
// Fetch user data with id
}Query Parameters
typescript
import { useSearchParams } from 'react-router-dom';
function SearchResults() {
const [searchParams] = useSearchParams();
const query = searchParams.get('q');
const page = searchParams.get('page');
}Nested Routes
typescript
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<Home />} />
<Route path="about" element={<About />} />
<Route path="users" element={<Users />}>
<Route path=":id" element={<UserDetail />} />
</Route>
</Route>
</Routes>
</BrowserRouter>
);
}
function Layout() {
return (
<div>
<nav></nav>
<Outlet />
</div>
);
}Route Guards
Protected Routes
typescript
function ProtectedRoute({ children }: { children: React.ReactNode }) {
const { isAuthenticated } = useAuth();
const location = useLocation();
if (!isAuthenticated) {
return <Navigate to="/login" state={{ from: location }} replace />;
}
return <>{children}</>;
}
// Usage
<Route
path="/dashboard"
element={
<ProtectedRoute>
<Dashboard />
</ProtectedRoute>
}
/>Lazy Loading
typescript
import { lazy, Suspense } from 'react';
const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
</Routes>
</Suspense>
);
}Conclusion
React Router provides powerful routing capabilities. Master the basics, then explore advanced patterns like nested routes, guards, and lazy loading for optimal performance.