Skip to content
All essays
WebMarch 25, 202410 min

React Router Complete Guide

Master React Router: routing, navigation, nested routes, guards, and best practices

Ü
Ümit Uz
Mobile & Full Stack Developer

React Router is the standard routing library for React. Let's master it from basics to advanced patterns.

Installation

bash
npm install react-router-dom

Basic 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>
  );
}
typescript
import { Link } from 'react-router-dom';

<Link to="/" />Home</Link>
<Link to="/about" />About</Link>
<Link to="/contact" />Contact</Link>
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.

Related essays

Next essay
React Query Data Fetching Guide