React 19, released in December 2024, is the most consequential update to the library since the introduction of hooks in React 16.8. While it does not reinvent the component model, it fills long-standing gaps in form handling, async data management, and component composition that have forced teams to rely on third-party libraries or awkward workarounds for years.
Actions: Rethinking Form Submissions
The centerpiece of React 19 is the Actions pattern. Forms can now pass an async function directly to their action prop, and React handles the pending state, error boundaries, and optimistic updates automatically. The companion hooks useActionState and useOptimistic let developers build responsive UIs that update immediately on user input, then reconcile with the server response once it arrives. This eliminates an entire category of loading-state boilerplate that has cluttered React codebases for years.
For teams already using server-side rendering frameworks like Next.js or Inertia.js, Actions integrate seamlessly. Server Actions allow form submissions to invoke server-side logic directly without writing a dedicated API endpoint, while client-side Actions provide the same ergonomics for traditional single-page applications.
The use() Hook and Async Patterns
The new use() hook is a subtle but powerful addition. It accepts a Promise or a React context and can be called conditionally, breaking the long-standing rules-of-hooks constraint that required all hooks to be called unconditionally at the top of a component. This makes it possible to read async data inline, directly where it is needed, rather than hoisting every data dependency to the component's top scope. Combined with Suspense boundaries, use() enables a declarative approach to loading states that reads more naturally than the useEffect-plus-useState pattern it replaces.
Ref Forwarding Made Simple
React 19 also simplifies ref handling. Function components now accept ref as a regular prop, eliminating the need for forwardRef in the vast majority of cases. This reduces boilerplate in component libraries, makes TypeScript definitions cleaner, and removes a common source of confusion for developers learning the framework. The forwardRef API remains available for backward compatibility but is no longer necessary for new code.
Upgrading in Practice
The migration path from React 18 is incremental. Most applications can upgrade without code changes, then adopt new features component by component. The React team has published an official codemod that handles the most common refactoring patterns, including converting forwardRef wrappers and updating deprecated lifecycle methods. For teams using TypeScript, the updated type definitions catch most breaking changes at compile time, making the upgrade process unusually smooth by major-version standards.



