← Back to Week 8

React Libraries & Router

February 23, 2026 — Slides: React Libraries & Router

Topics Covered

React Libraries

// Using a React library
import { ComponentName } from 'lib-name';

function App() {
    return <ComponentName prop="value" />;
}

Single-Page Applications

// Conceptual client-side routing
function App(props) {
    let componentToRender = null;
    if (currentUrl === '/home') {
        componentToRender = <HomePage />;
    } else if (currentUrl === '/about') {
        componentToRender = <AboutPage />;
    }
    return <div>{componentToRender}</div>;
}

React Router

BrowserRouter

import { BrowserRouter } from 'react-router';
import App from './components/App.jsx';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
    <BrowserRouter>
        <App />
    </BrowserRouter>
);

Routes & Route

import { Routes, Route } from 'react-router';

function App(props) {
    return (
        <Routes>
            <Route path="home" element={<HomePage />} />
            <Route path="about" element={<AboutPage />} />
        </Routes>
    );
}

Link

import { Link } from 'react-router';

function Nav(props) {
    return (
        <nav>
            <ul>
                <li><Link to="home">Home</Link></li>
                <li><Link to="about">About</Link></li>
            </ul>
        </nav>
    );
}

URL Parameters

import { useParams } from 'react-router';

// In Routes:
<Route path="posts/:postId" element={<BlogPost />} />

// In Component:
function BlogPost(props) {
    const urlParams = useParams();
    const postId = urlParams.postId;
    return <h1>You are looking at blog post {postId}</h1>;
}

Naming Routes (REST)

<Routes>
    <Route path="/products" element={<AllProductsPage />} />
    <Route path="/products/hat" element={<HatPage />} />
    <Route path="/products/shoes" element={<ShoesPage />} />
    <Route path="/account" element={<AccountPage />} />
</Routes>

Nested Routes & Outlet

import { Outlet } from 'react-router';

function App(props) {
    return (
        <Routes>
            <Route path="user" element={<UserLayout />}>
                <Route path="profile" element={<UserProfile />} />
                <Route path="favorites" element={<FavoriteItems />} />
            </Route>
            <Route path="items" element={<ItemList />} />
        </Routes>
    );
}

function UserLayout(props) {
    return (
        <div className="user-layout">
            <h1>User Page</h1>
            <Outlet />
        </div>
    );
}

Protected Routes

function RequireAuth(props) {
    if (!userIsLoggedIn) {
        return <p>Forbidden!</p>;
    } else {
        return <Outlet />;
    }
}

function App(props) {
    return (
        <Routes>
            <Route element={<RequireAuth />}>
                <Route path="profile" element={<ProfilePage />} />
                <Route path="secret" element={<SecretPage />} />
            </Route>
            <Route path="signin" element={<SignInPage />} />
        </Routes>
    );
}

Firebase Hosting

Key Concepts

Resources