Docs LogoDocs

React Router Advanced - Protected Routes & Lazy Loading

Documentation for React Router Advanced - Protected Routes & Lazy Loading.

React Router Advanced - Protected Routes & Lazy Loading

Protected Routes

import { Navigate, Outlet } from "react-router-dom";

function ProtectedRoute({ isAuthenticated }) {
  if (!isAuthenticated) {
    return <Navigate to="/login" replace />;
  }
  return <Outlet />;
}

// Usage
<Routes>
  <Route path="/login" element={<Login />} />

  <Route element={<ProtectedRoute isAuthenticated={isLoggedIn} />}>
    <Route path="/dashboard" element={<Dashboard />} />
    <Route path="/profile" element={<Profile />} />
  </Route>
</Routes>;

Lazy Loading Routes

import { lazy, Suspense } from "react";

const Dashboard = lazy(() => import("./pages/Dashboard"));
const Settings = lazy(() => import("./pages/Settings"));

function App() {
  return (
    <Suspense fallback={<Loading />}>
      <Routes>
        <Route path="/dashboard" element={<Dashboard />} />
        <Route path="/settings" element={<Settings />} />
      </Routes>
    </Suspense>
  );
}

Data Loading with Loaders (v6.4+)

import { createBrowserRouter, RouterProvider } from "react-router-dom";

const router = createBrowserRouter([
  {
    path: "/users/:id",
    element: <UserDetail />,
    loader: async ({ params }) => {
      return fetch(`/api/users/${params.id}`);
    },
    errorElement: <ErrorPage />,
  },
]);

// Access loaded data
import { useLoaderData } from "react-router-dom";

function UserDetail() {
  const user = useLoaderData();
  return <div>{user.name}</div>;
}

// Render
<RouterProvider router={router} />;

Route Guards with Context

const AuthContext = createContext();

function RequireAuth({ children, redirectTo }) {
  const { user } = useContext(AuthContext);
  return user ? children : <Navigate to={redirectTo} />;
}

// Usage
<Route
  path="/admin"
  element={
    <RequireAuth redirectTo="/login">
      <AdminPanel />
    </RequireAuth>
  }
/>;

Interview Questions & Answers

Q1: How do you protect routes?

Create wrapper component checking auth, return Navigate to login if not authenticated, Outlet to render children if authenticated.


Q2: What is lazy loading routes?

Use React.lazy() with dynamic import to load route components only when needed. Wrap in Suspense with fallback.


Q3: What are loaders in React Router v6.4?

Data loading functions that run before route renders. Access with useLoaderData. Enables parallel data fetching.


Q4: How to handle 404 pages?

Add <Route path="*" element={<NotFound />} /> at end of Routes. The * matches any unmatched path.

Last updated on July 15, 2026

On this page