Advanced React Development

Master advanced React patterns, state management, performance optimization, and testing.

advanced Frontend Frameworks 8 hours

Chapter 8: React Router Advanced

Chapter 8 of 15

Chapter 8: React Router Advanced

8.1 Protected Routes

Protected routes restrict access based on authentication status or user permissions.

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

function ProtectedRoute({ isAuthenticated, redirectTo = '/login' }) {
    return isAuthenticated ? <Outlet /> : <Navigate to={redirectTo} replace />;
}

// Usage
<Routes>
    <Route path="/login" element={<Login />} />
    <Route element={<ProtectedRoute isAuthenticated={isAuth} />}>
        <Route path="/dashboard" element={<Dashboard />} />
        <Route path="/profile" element={<Profile />} />
    </Route>
</Routes>

8.2 Route Guards

function PrivateRoute({ children, requiredRole }) {
    const { user, isAuthenticated } = useAuth();
    
    if (!isAuthenticated) {
        return <Navigate to="/login" />;
    }
    
    if (requiredRole && user.role !== requiredRole) {
        return <Navigate to="/unauthorized" />;
    }
    
    return children;
}

8.3 Nested Routes

// Nested routing structure
<Routes>
    <Route path="/dashboard" element={<DashboardLayout />}>
        <Route index element={<DashboardHome />} />
        <Route path="settings" element={<Settings />} />
        <Route path="analytics" element={<Analytics />} />
    </Route>
</Routes>

// DashboardLayout component
function DashboardLayout() {
    return (
        <div>
            <Sidebar />
            <main>
                <Outlet /> {/* Renders nested routes */}
            </main>
        </div>
    );
}

8.4 Programmatic Navigation

import { useNavigate, useLocation, useParams } from 'react-router-dom';

function MyComponent() {
    const navigate = useNavigate();
    const location = useLocation();
    const params = useParams();
    
    const handleClick = () => {
        navigate('/dashboard', { 
            state: { from: location.pathname },
            replace: true 
        });
    };
    
    return <button onClick={handleClick}>Go to Dashboard</button>;
}