React 19 went stable on December 5, 2024. Early 2025, after running it in production on two apps, here is what we actually used.
1. useActionState
The former useFormState is the single feature that changed how we write forms. No more manual reducers, no more nested useState for loading/error. The form gets pending, error and return value for free. On an app with 40 forms the cumulative effect is huge.
2. Native form actions
The <form action={fn}> tag now accepts a function directly (Server Action or normal client function). Combined with Next.js, it is a clean synthesis of what used to be spaghetti.
3. useOptimistic
For mutations that touch visible lists (favourite toggles, add comment, move to-do) useOptimistic replaced 30 lines of manual code each. UI feels faster, error rollback is handled.
What we passed on
- use() hook: useful in specific cases (Suspense + Promise as prop), not part of our daily flow yet.
- Document metadata in JSX: less useful in Next.js apps since we already have
generateMetadata. - Asset preloading API: experimented, but explicit
<link>still wins for now.
Migration
18 to 19 broke nothing meaningful on our projects, except a couple of ref-typing fixes. The React Compiler in beta — opt-in via Babel plugin — killed 80% of our manual useMemo/useCallback. We turned it on for new projects, off for older ones.