Skip to main content

What's New in React 19?

What's New in React 19? is Bob Ziroll's free, 69-minute catch-up course, a flat run of 15 scrims that rebuild one username form four times with the action prop, useActionState, useOptimistic and useFormStatus. It is the fastest way to see React 19's actions model in working code if you already write hooks-based React.

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

This page is part of our Scrimba React courses catalog. Scrimba's course page lists it under the Frontend Developer Path and the Fullstack Developer Path.

Quick answer​

What's New in React 19? is a free, advanced-level mini course: a two-scrim useTransition refresher, a short React Compiler scrim, then a single username form rebuilt four times with form actions, useActionState, useOptimistic and useFormStatus, closing on refs as props, the use() API and document metadata. It fits you if you already write hooks-based React and want the changes explained in working code; if you are still learning React, take Learn React first, as Bob says himself in the intro and conclusion scrims.

Title card of Scrimba's What's New in React 19? course: the title above the React atom logo on a purple and gold gradient.
The only title card in the course; it is a flat list of scrims with no chapters.Title card from scrimba.com.

Is it worth your time?​

Yes, if you fit the audience. An hour of Bob's time gets you a working mental model of actions, which is the concept the rest of React 19 hangs on, and you end up with one form that you have rewritten four ways in your own hands. The teaching choice that makes it work is the single running example: a "Current user" label, a text input and an Update button, wired to a fake updateNameInDB call that waits 1.5 seconds and throws if you type the word "error". Every new hook is applied to that same form, so you see exactly what each one removes from the previous version.

It was recorded in May 2024 against a React 19 release candidate (the dependency panel shows 19.0.0-rc-915b914b3a-20240515), and Bob says several times that the official docs had not caught up yet, so the slide links point at the React 19 announcement post instead. Everything he teaches shipped in the final React 19, but the framing ("coming with React 19") reads as a preview now. The use() lesson also ends on a limitation: creating a promise inside a component and passing it to use() refetches on every render, and Bob leaves the caching fix out of scope. You learn what use() is, not how to use it in production without a framework.

What you'll learn​

Course curriculum

15 course scrims in a flat list, grouped here into five editorial parts

  1. Catch-up: transitions and useTransition11 min3 lessons
  2. React Compiler and form actions12 min3 lessons
  3. useActionState, in three parts18 min3 lessons
  4. useOptimistic and useFormStatus10 min2 lessons
  5. refs as props, use(), metadata, conclusion16 min4 lessons

Scrimba presents this course as one flat list with no modules, so the five parts above are my grouping, not Scrimba's. The expanded table of contents shows 17 rows: the 15 course scrims (66 minutes and 39 seconds by their own timers) plus two generic Scrimba clips at the end, a Scrimbassador referral pitch and a certificate tip, which together bring the header figure to 69 minutes. The course listing and its structured data say 16 lessons; when other pages on this site quote 16, that is Scrimba's number.

Inside the course, scrim by scrim​

1. Catch-up: transitions and useTransition (11 min, 3 scrims)​

The intro is a two minute title-card scrim in which Bob lays out the plan and admits the starting point is a React 18 feature: "if you've taken my introductory or advanced courses in React, you'll know that we don't cover use transition in either of those courses." The two useTransition scrims use a tab switcher (Home, Products, About). The Products tab renders 1,500 fake products from @faker-js/faker, each with a one millisecond artificial sleep, so the tab takes about 1.5 seconds to appear. These two scrims still run React 18.3.1; everything after them runs the React 19 release candidate.

Part 1 is a guided reading of the code and the bug: click Products and then About straight away, and React finishes the slow Products render before switching, "and the whole switching to products just looks like it never really happened," as Bob puts it. Part 2 wraps setTab in startTransition so the slow update becomes interruptible, then uses the isPending boolean to show a "Loading..." paragraph. That boolean is the seed for everything that follows: "this kind of boilerplate just is so so common that React built it right into the value of is pending."

What's New in React 19, useTransition lesson: the preview shows a Loading message while a slow tab switch is pending.
At 4:19 of useTransition (2), isPending flips true the moment Products is clicked, well before the 1,500-item list is ready.Screenshot of scrimba.com, taken by scrimbaguide.tech.

2. React Compiler and form actions (12 min, 3 scrims)​

The compiler scrim is under two minutes and has no code beyond a Hello World. Bob explains that the compiler is meant to replace the manual useMemo, React.memo and useCallback work he teaches in the performance section of Advanced React, then points at docs that "were just released a day ago" and "still under construction". Treat it as a heads-up, not a lesson.

Form action is the longest scrim in the course at 7:30 and the one that sets up the running example. It opens with the old pattern: a controlled input tracked in state, an onSubmit handler that calls event.preventDefault(), an await on the fake database call, then two setState calls. Bob is candid about how he feels about that: "Something has always felt a little off to me about this ... it feels a bit more convoluted than it needs to be." He then swaps onSubmit for action, receives the native FormData object instead of an event, and deletes the input state. The change handler and the preventDefault go too, and he reads the value with formData.get("name") after adding a name attribute. The Error and loading states scrim then shows why adding manual loading and error state back into an action does not behave the way you expect, "because form actions run as a transition," which motivates the next hook.

3. useActionState, in three parts (18 min, 3 scrims)​

This is the core of the course and the only place it slows down. Part 1 introduces the three-value return ([state, actionFunction, isPending]), the reducer-style signature Bob compares to Array.reduce, and the wrapped action you pass to the form. It ends with a warning that is still useful: "the documentation is not currently correct as I'm recording this, but that blog post is."

Part 2 fixes the (prevState, formData) signature, returns the new name instead of calling a setter, and issues the first challenge: show a Loading paragraph while the action runs. The scrim carries Scrimba's "Challenge with Instant Feedback" icon, and the brief lives in a comment block in the editor. Bob's tone is relaxed about it: "If you're already relatively experienced with React, then this might not be much of a challenge for you."

What's New in React 19, useActionState Part 2 challenge: a comment brief asks for a loading message during the action.
The only hint in this useActionState() Part 2 challenge, at 2:10, is the isPending value already sitting on line 7 of the file.Screenshot of scrimba.com, taken by scrimbaguide.tech.

Part 3 is where the pattern earns its keep. Bob turns the state from a bare string into an object with name and error keys, then sets two more challenges. The first is to move the caught error message from the console into the UI; the second is to keep the previous name when returning the error (the trap is returning { error } alone and losing state.name). The finished action returns { name: newName, error: null } on success and { error, name: prevState.name } on failure, and the error paragraph renders from state.error. By the end of this part you have deleted every useState call from the component, and Bob does a "sanity check" recap of exactly what went away.

What's New in React 19, useActionState Part 3 lesson: the form shows a red error message after a failed update.
useActionState() Part 3, about 6:15: typing the word error makes the fake database throw, and the failure now renders in the UI instead of the console.Screenshot of scrimba.com, taken by scrimbaguide.tech.

4. useOptimistic and useFormStatus (10 min, 2 scrims)​

useOptimistic gets one 5:25 scrim, with a challenge in the middle: figure out where to call setOptimisticName so the label updates the instant you submit. The answer is the first line of the action, before the await. Bob's test is the same one from Part 3: submit "Bob error", watch the label flip to it, then watch it snap back when the fake database rejects it. His framing is the like button: "you don't want a little loading spinner to show up while it's speaking to the database." He also deletes the isPending Loading paragraph at the end, since the optimistic label made it redundant.

useFormStatus is pitched at people writing component libraries. Bob extracts a MyButton component, spreads the rest of its props onto a native button, and then reads pending from useFormStatus() inside it, with no prop drilling, because "React turns the form element into a context provider." The one thing to remember from this scrim is the import: it comes from react-dom, not react. The button reads "Submitting..." while the action runs and "Update" otherwise.

5. refs as props, use(), metadata, conclusion (16 min, 4 scrims)​

refs as props is under three minutes and has no runnable demo (Bob does not create the ref with useRef; he shows the shape). The point is that forwardRef is gone as a requirement: a custom component now receives ref as an ordinary prop.

use() is the second longest scrim at 9:01 and the most interesting one to read. Bob is clear up front that use "isn't actually a hook" and so can be called inside an if. He rewrites a Pokemon API fetch from the useEffect plus useState pattern to const pokemon = use(fetchPromise). That hits the error "async/await is not yet supported in Client Components" because nothing is catching the suspended component. Wrapping it in <Suspense fallback={<p>Loading...</p>}> clears that, and then comes the warning that matters: "A component was suspended by an uncached Promise." He does not fix it. His verdict is that use "shows, pun intended, great promise for the future", and he suggests you add a counter button to the scrim and watch the fallback flash on every re-render.

What's New in React 19, use() lesson: the preview is blank and the console shows a Suspense related client error.
The exact failure at 6:00 of use() stops the demo cold: 'async/await is not yet supported in Client Components'.Screenshot of scrimba.com, taken by scrimbaguide.tech.

The metadata scrim shows a BlogPost component rendering <title>, <meta> and <link> tags inside an <article>, which React 19 hoists into the document head; Bob proves it with a dev tools screenshot he took before recording rather than a live demo. The one minute conclusion sends people who found it hard back to Learn React (which he was "just about to start rerecording from scratch" at the time, and has since) and people who want more to Advanced React.

What a lesson feels like​

Every scrim is Bob talking over a live editor, with the running form in a small preview window on the right and a slide thumbnail in the corner. Scrims run from about a minute to nine minutes; most are three to five. Bob ends most scrims with "feel free to play with the code", and here it is worth doing: the same form carries through nine scrims, so you can pause anywhere, break it, and see what the hook you just added changed.

The three challenges (loading paragraph, error message, optimistic update) each arrive as a comment block in the file and a "Pause now and work on this challenge" from Bob, followed a few seconds later by his solution. They are short, five to ten minutes each if you type them. Every scrim has captions, a timestamped transcript in the settings menu, subtitles in ten languages, and speed control.

Free or Pro: exactly what is gated​

All 15 scrims are free, including the three challenges: the header stats say "free", the course's structured data marks it accessible for free, and the intro carries the SAMPLE badge. There are no Solo Projects in this course, so nothing inside it is Pro-only. I reviewed it on a Pro account, so I did not test the free experience myself.

What Pro adds around it: the Certificate of Completion row at the bottom of the table of contents, the two career paths that include this course, and the Pro-only Discord channels. Basic Discord access is free according to Scrimba's pricing page, so the server itself is not a reason to upgrade. One thing I could not verify: Scrimba caps free accounts at 10 interactive challenges in total, and the three "Challenge with Instant Feedback" scrims here may count toward that cap. See current plans (opens in a new tab) if the paths or the certificate matter to you.

How long it takes​

The runtime is 69 minutes, of which 67 is course content. If you watch and type along with the three challenges, plan for two to three hours: the useActionState trio is 18 minutes of video that deserves a second pass, and the use() scrim rewards the experiment Bob suggests at the end. An experienced React developer who only wants the deltas can skim it in an evening; someone who has never seen useTransition should budget the full three hours and treat the first two scrims as a real lesson rather than a recap.

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

It fits you if you learned React on 18 (or on Bob's older courses) and want to know what action={fn}, useActionState, useOptimistic, useFormStatus and use() do, with a form you can break. It is also a good primer before the forms section of the current Learn React, which now uses form actions.

Skip it if you have never written React; Bob says as much in the intro, and he assumes you know useState, useEffect, async functions and what a promise is. If you took the re-recorded Learn React you already know the action prop; the rest of this course (useActionState, useOptimistic, useFormStatus, use()) is still new. And if you are here for the React Compiler or server components, this is not the course: the compiler gets two minutes and server components are not covered.

Start What's New in React 19 for free (opens in a new tab)

Prerequisites​

Comfortable hooks-based React: useState, useEffect, controlled inputs, and async/await. The useActionState scrims lean on the reducer idea (a function that receives previous state and returns new state), so having met useReducer or Redux helps, though Bob explains it. Nothing to install; the whole course runs in the Scrimba editor with the dependencies pinned in each scrim.

Where it fits​

This is a side course rather than a step in a sequence. Scrimba lists it under the Frontend Developer Path and the Fullstack Developer Path, and the natural moment to take it is right after Learn React or Advanced React, when the new hooks will make sense in context. If the forms material was the part you liked, React Router covers the router-side form handling Bob mentions in the Form action scrim.

Strengths and limits​

What it does well:

  • One running example that you refactor four times.
  • Three short challenges with instant feedback.
  • A use() lesson that shows the limitation instead of hiding it.
  • Bob's habit of saying which parts he personally finds confusing (the actions definition, the use name, the "name" attribute on a name field).

Where it is limited:

  • It was recorded against a May 2024 release candidate and talks about React 19 as upcoming.
  • The compiler scrim is a pointer rather than a lesson.
  • The refs scrim has no runnable demo.
  • The use() caching problem is left unsolved.
  • Server components are absent.