Skip to main content

Learn React Router

Bob Ziroll teaches Scrimba's dedicated routing course in 9.7 hours and 139 scrims, all of it spent building one app: VanLife, a camper van rental site with three levels of nested routes. It is the most complete routing course on Scrimba, and the most current one, since it covers the data router that React Router 7 is built on.

Reviewed inside the course with a Pro account, September 2026.

Quick answer​

It fits you if you already have a solid foundation in React, the bar Bob sets before you start; finishing Learn React clears it. The one catch is overlap: if you already own Advanced React, you already have most of this material as its routing module. Once you finish, React Challenges is where to drill routing in practice.

Is it worth your time?​

Yes, if you build React apps and your navigation still means swapping components with state. React Router is the routing library almost every React codebase without a framework uses, and version 6.4 changed how data loading works. Bob teaches both halves: the classic BrowserRouter with Routes, Link, and Outlet first, then createBrowserRouter with loaders, actions, redirect, and defer. That order is the right one, because you feel the pain the data APIs fix before you learn them. He builds up a loading state and an error state by hand in module 3, breaks the app on purpose, and then deletes most of that code in module 4.

The code is mildly dated. The scrims pin react-router-dom 6.4.3 and 6.4.4 with React 18.2. React Router 7 has since shipped, but its routing model is the 6.4 data router this course teaches, so everything transfers. The one part that has moved is the last module. v7 deprecates defer() in favor of returning promises straight from a loader, and the "middleware" Bob says he hopes to record an update about has since landed in v7, first as an unstable API. Neither invalidates a lesson; you will just write slightly shorter code today.

This course started life as the routing module of Advanced React. Bob twice refers to "the full advanced React course," and in the NavLink lesson he says render props are something "you have already learned about" if you are taking it there. If you own Advanced React, you own most of this one. If you want routing on its own, this is the cheaper way in.

What you'll learn​

Course curriculum

6 modules · 139 lessons

  1. Introduction to React Router87 min20 lessons
  2. Nested Routes2.1 hrs23 lessons
  3. Search Params and Links95 min25 lessons
  4. Loaders and Errors42 min13 lessons
  5. Actions and Protected Routes2.7 hrs40 lessons
  6. Deferred Data73 min18 lessons

Lesson counts are the scrims I counted in each expanded module in September 2026, including quizzes and two "Note from the future" updates. They also include two short Scrimba promo scrims, a Bootcamp ad after module 1 and a Scrimbassador ad after module 4. Scrimba's own module headers show 11, 19, 13, 2, 5, and 0, because they count only a subset of the scrims. The course listing and its structured data say 139 lessons, which matches my total.

Inside the course, module by module​

1. Introduction to React Router (87 min, 20 scrims)​

The first five scrims are free to preview and cover the mental model. Scrim one explains what client-side routing is. Two contrasts multi-page and single-page apps with a slide diagram, where Bob points out that "that telltale flicker is a good way to know that you are currently looking at a multi page application." Three introduces BrowserRouter as a context provider, four is Routes, and five is a one-minute challenge to set them up from a blank file. Route with path and element comes next, with a mini challenge inside the lesson to add an /about route. Then Link, and why an anchor tag would wipe your state.

Then VanLife starts. "VanLife project bootstrapping" is an eight-minute challenge to build the home and about pages with a nav bar, and it sets the tone for the whole course. Bob links a Figma design and tells you to do the CSS yourself if CSS is your weakness. Then he "snaps his fingers" and pastes in his own 145 lines of styles so the lessons stay about routing. An 11-minute "Initial Deploy to Netlify" lesson walks through GitHub Desktop, a .gitignore, and continuous deployment, and he deliberately forgets the viewport meta tag so you see a redeploy happen. Data comes from Mirage JS, a mock server that intercepts fetch. As Bob puts it, "think of it more like you are the front end developer on this project and a back end developer, one of your coworkers, has already created the server."

Learn React Router, Vans Page challenge: a code editor beside a preview listing van rental cards.
A useEffect with an empty dependency array holds this fetch, 7:49 into the second Vans Page challenge, the exact block module 4 later replaces with a loader.Screenshot of scrimba.com, taken by scrimbaguide.tech.

The module closes with route params (/vans/:id and useParams), a two-part challenge where Bob deletes his own code and makes you rebuild it, and a markdown quiz. Last comes an "A11y Update" recorded after the fact, where he turns on a screen reader to show why a card wrapped in a Link needs an aria-label. He is upfront that the accessibility fixes "are not going to persist in the code" later on.

2. Nested Routes (2.1 hrs, 23 scrims)​

Title card for the Nested Routes module of Scrimba's Learn React Router course, reading Nested Routes next to a bird's nest illustration
23 scrims build three levels of nested navigation for VanLife's host section, fixing the broken relative paths with a layout route and an index route.

Bob calls this "one of the more complex topics about React Router," and it gets the most time. The intro uses the Remix "Fakebooks" demo to show nested URLs mapping to nested UI, then lays out the host section you are about to build. That is /host with a dashboard, income, and reviews pages, then /host/vans, then /host/vans/:id with its own details, pricing, and photos tabs. Three levels of navigation, each with a shared layout.

The sequence is careful. A layout route with Outlet fixes the copy-pasted nav bar first. Then a challenge to build HostLayout, where Bob briefly duplicates a /host path to make the dashboard show up. He says "you would never see this in production React Router six code." Relative paths break the dashboard again (you end up at /host/host), and index routes fix it. A "To nest or not to nest?" lesson is a thought experiment on nesting /vans/:id when there is no shared UI, and he concludes you should not. NavLink and its isActive render prop come in a standalone mini app before being applied to VanLife.

Learn React Router, Host Layout lesson: a code editor beside a preview showing the nested host nav bar.
The temporary workaround at 6:15 of Creating the Host Layout: a child route repeating the /host path so the dashboard renders inside the HostLayout's Outlet.Screenshot of scrimba.com, taken by scrimbaguide.tech.

The host vans list is an "Optional Side Quest," one of the few optional challenges Bob sets ("If you didn't do this challenge, I know for a fact that it wasn't too hard for you"). Outlet context is taught by sending you to the React Router docs first. "I'm not going to teach you how to do this before I ask you to try and do it." The module ends with a second Netlify redeploy.

The filter buttons on the vans page were skipped earlier, and this is where they arrive. Bob's framing for search params is the test you will keep using. "Should a user be able to revisit or share this page exactly like it is and have the experience be the same?" If yes, the state belongs in the URL. useSearchParams is demonstrated on a tiny Star Wars characters app (Jedi or Sith), then applied to VanLife in a challenge. The pattern repeats three times: filter with a Link, filter with the setter function, then merge params so you do not wipe someone else's ?name=Jill.

Two smaller topics follow. Link state passes the current query string to the detail page so "Back to all vans" returns to the filtered list (Bob argues against putting the filter in the detail page URL). A splat route (path="*") makes the 404 page, with the note that React Router 6 scores routes so order no longer matters.

The last five scrims set up module 4. "Happy Path vs. Sad Path" opens on a "Data Layer APIs" title slide, then Bob changes the mock server to return a 400 and lets the app crash. He adds a loading state and error handling by hand, and a one-minute accessibility update adds aria-live to both.

Learn React Router, Happy Path vs Sad Path: a blank preview beside a console showing a crash error.
A 400 from the server leaves vans undefined, so .map throws: the deliberate crash at 2:08 of Happy Path vs. Sad Path, the one screen every fix through the end of module 4 exists to prevent.Screenshot of scrimba.com, taken by scrimbaguide.tech.

4. Loaders and Errors (42 min, 13 scrims)​

Title card for the Loaders module of Scrimba's Learn React Router course, above a screenshot of the loader prop docs.
13 scrims swap the useEffect fetch for a route loader and useLoaderData, then add errorElement and useRouteError for error handling.

The shortest module and the turning point. The "Loaders" title card credits Remix, and Bob explains the change in one line. A loader runs before the route renders, so the component "gets to treat this much more synchronously." Opting in means createBrowserRouter, createRoutesFromElements, and RouterProvider, shown on the Star Wars app and then done by you on VanLife. Next come a loader that returns a string and useLoaderData. Then the payoff lesson, "Use the loader data instead of the useEffect," where you comment out the effect, delete the loading state, and delete the useState. Bob calls it "one of the most cathartic things that I think you'll ever do as a programmer."

Errors get three scrims: errorElement, then useRouteError with the message, status, and statusText thrown from api.js. The third demonstrates that errors bubble to the nearest errorElement in the route tree, so you can choose where the error UI lives.

5. Actions and Protected Routes (2.7 hrs, 40 scrims)​

Title card for the Protected Routes section of Scrimba's Learn React Router course, reading Protected Routes between two shield emojis
40 scrims build protected routes with a requireAuth loader check, then replace controlled form state with React Router's Form, actions, and useNavigation.Module title cards from scrimba.com.

The biggest module, and it needs a login form to work with. Bob says plainly that "this isn't a course about authentication," so the form is prebuilt, the mock server gets one user, and a "Better (but still fake) auth" lesson stores a loggedin flag in localStorage. There is no real auth anywhere in the course.

Protected routes are taught twice on purpose. First the pre-6.4 way: an AuthRequired layout route that renders an Outlet or a Navigate. Then Bob shows why that fails with loaders: nested loaders run in parallel before anything renders (a "Parallel Loaders demo" proves it with random setTimeouts), so you cannot stop a fetch by blocking a render. The data-router answer is a requireAuth check that calls redirect inside every protected loader, which he admits is "a little bit tedious of a challenge" when you add it to every host route. The message and the original URL travel to the login page as search params.

The actions half starts with a lesson titled "Take: Forms in React are bad," marked with a chili pepper in the table of contents. Bob argues that controlled inputs re-implement state the browser already has. React Router's Form component, method="post", and an action function replace handleChange, handleSubmit, and the form state, and again he narrates the deletion. useActionData returns an error to the form instead of throwing, and useNavigation gives you state === "submitting" to disable the button and change its label to "Logging in".

Learn React Router, redirectTo lesson: a code editor beside a sign-in form preview with a redirect message.
After a successful login, the action redirects you to the page you were trying to reach, here /host/vans/1/pricing: that's redirectTo in VanLife at 4:15, with the loader and action in the same file as the component.Screenshot of scrimba.com, taken by scrimbaguide.tech.

The module's final challenge, "redirectTo in VanLife," is the one where Bob "took the training wheels off." You pass the request through every requireAuth call, build the redirectTo param from new URL(request.url).pathname, and read it back in the action.

6. Deferred Data (73 min, 18 scrims)​

Loaders cost you something: the page waits until the data arrives. A weather demo app with a three-second delay makes the point ("Three seconds feels like an eternity"). The fix is three pieces that only work together, which is why Bob calls it "an advanced topic." They are defer() wrapping a promise in the loader, the Await component with a render-prop child, and React's Suspense with a fallback. He makes you type the defer setup twice from memory before it can even run. Each piece is shown on the weather app, then applied to VanLife's vans and host vans pages.

"Placeholders are gone!" swaps in finished dashboard, income, and reviews pages (the graphs are static images, and Bob says so). The last six scrims move the data from Mirage JS to Cloud Firestore: creating the Firebase project, a collection reference, and rewriting getVans, getVan, and getHostVans. Bob recommends downloading the project and doing this part locally. "Final loose ends" is candid that without real auth, anyone can change a host van URL and see another host's van.

What a lesson feels like​

Most scrims are three to five minutes. Bob narrates over the editor with the VanLife preview docked on the right, and challenges arrive as a numbered comment block in the file: "Pause now and work on this challenge" is the cue. There are four quizzes, each a markdown file you type answers into. Bob is explicit that "I do expect that you pause the screencast just like we do with any other challenge and physically type your answer down."

The rhythm is teach-on-a-toy-app, then apply-on-VanLife. Search params, createBrowserRouter, protected routes, actions, and deferred data are each introduced on a throwaway project (Star Wars characters, a weather page, a two-route "protected" demo). Each is then repeated as a challenge on the real app. It doubles the reps and keeps VanLife from becoming a wall of unfamiliar code.

Bob's voice is patient and a little self-deprecating ("I've said the word router too many times for it to make sense anymore"). Every scrim has captions, a timestamped transcript under the settings menu, subtitles in ten languages, playback speed, and "Download as Zip" for the project.

Free or Pro: exactly what is gated​

The first five scrims are marked SAMPLE and open without a subscription: the intro, the multi-page versus single-page explainer, the BrowserRouter setup, Routes, and the first challenge. Everything from "Route, path, & element" onward is Pro, which is the other 134 scrims, VanLife included. There are no Solo Projects in this course; the whole thing is a build-along with challenges.

Pro also unlocks the certificate at the end, the two career paths this course sits in, and the Pro-only Discord channels. Bob points you to the Scrimba Discord in the outro; Scrimba's pricing page lists basic Discord access under the free plan, so the server itself is not a Pro perk. See current plans (opens in a new tab) for what Pro costs where you are.

How long it takes​

9.7 hours is video runtime. Every module has multi-part challenges, and modules 5 and 6 each ask you to re-implement something on VanLife after seeing it on a demo app. Plan for 20 to 30 hours: three to five weeks at an hour a day. The Actions and Protected Routes module alone is 2.7 hours of video and will take most people a full week. If you do the Netlify deploys and the Firebase migration locally, add another three to five hours for account setup and the local install.

Who it's for, and who should skip it​

It fits you if you are comfortable with hooks-based React, have built at least one app that fetches data, and want routing done the way React Router 6.4 and 7 expect. It is also the clearest explanation I have seen of why loaders exist, because you build the alternative first.

Skip it, for now, if React itself is new. Bob says in the first minute that "this course will not be a good starting point for that." Skip it if you already own Advanced React, which contains most of this material. And skip it if you use Next.js or Remix routing day to day; the concepts overlap, but the API does not.

Preview Learn React Router on Scrimba (opens in a new tab)

Prerequisites​

Solid React: components, props, useState, useEffect, and fetching data in an effect, since that is the code you will be replacing. Comfort with async/await and promises matters more here than in most React courses; loaders and actions are async functions, and the deferred data module depends on understanding that an un-awaited async call is a promise. Render props appear twice (NavLink and Await) and are only briefly explained. For the last module you will want a free Firebase account and a local Node install.

Where it fits​

Take it straight after Learn React, whose Chef Claude and Meme Generator projects fetch in useEffect the way VanLife does in module 1. Scrimba lists it in the Frontend Developer Path and the Fullstack Developer Path. The Netlify and Firebase lessons overlap the standalone Deploying with Netlify and Learn Firebase courses, and the form-actions lessons pair well with What's New in React 19, where Bob covers React's own form actions.

Strengths and limits​

What it does well:

  • One app carried across all 139 scrims, with three levels of nested layouts you build.
  • The classic router taught before the data router, so the improvement is felt rather than asserted.
  • Two short accessibility updates.
  • A steady challenge loop, with demo-app rehearsals before each VanLife task.

Where it is limited:

  • Authentication is faked with localStorage from start to finish.
  • The CSS is pasted in for you.
  • The code is pinned to React Router 6.4, so defer() and the per-loader auth checks look dated next to v7.
  • It duplicates the routing module of Advanced React.