React 19.2 is the current stable release of React, shipped in October 2025 as the third release after React 19 and React 19.1. The React 19.2 features that matter most are Activity, useEffectEvent, cacheSignal, Performance Tracks, and partial pre-rendering, plus a handful of SSR and tooling changes. Here is how each one earns its place in day-to-day React work.
Activity: hide content without losing state
Activity lets you hide part of the UI without unmounting it, so state and DOM survive while the content is out of view.
<Activity mode={isVisible ? "visible" : "hidden"}>
<Page />
</Activity>A hidden Activity unmounts its children's Effects and defers their updates, while a visible one runs normally. That makes it useful for pre-rendering a tab the user is likely to open next, or for preserving form input across navigation.
Because hidden content still renders at a lower priority, its code and data can load before the user sees it. The mode prop accepts only visible and hidden today, with more modes planned. See React Activity Explained for the full mechanics.
useEffectEvent: separate events from Effects
useEffectEvent extracts the event part of an Effect so that changing the event's values does not re-run the Effect itself.
function ChatRoom({ roomId, theme }) {
const onConnected = useEffectEvent(() => {
showNotification("Connected!", theme);
});
useEffect(() => {
const connection = createConnection(serverUrl, roomId);
connection.on("connected", () => onConnected());
connection.connect();
return () => connection.disconnect();
}, [roomId]);
}The theme can change without reconnecting the chat room, because onConnected always sees the latest props while staying out of the dependency array. You need the latest eslint-plugin-react-hooks for the linter to accept Effect Events.
Use it only for genuinely event-shaped logic, not to silence a dependency warning. For the deep dive, see React useEffectEvent Explained.
cacheSignal: abort cached server work
In Server Components, cache deduplicates work for a single request. cacheSignal returns a signal that tells you when that cache lifetime is over, so you can abort or clean up the underlying work.
import { cache, cacheSignal } from "react";
const dedupedFetch = cache(fetch);
async function Component() {
await dedupedFetch(url, { signal: cacheSignal() });
}The signal fires when rendering completes, fails, or aborts. It is a Server Components only API, so it stays out of client code and out of the bundle. That makes it useful for cancelling a slow fetch or releasing a connection the moment React no longer needs the result, instead of waiting for a timeout.
Performance Tracks in Chrome DevTools
React 19.2 adds two custom tracks to Chrome DevTools performance profiles. The Scheduler track shows what React works on at each priority, and the Components track shows when components render and run effects. Together they explain why an update blocked or why a render repeated.
This is a profiling upgrade rather than a code change. Record a profile as usual and the React tracks appear alongside the browser's own timeline. The Scheduler track also marks when React waits for paint before continuing, which helps you spot expensive work that delays the next frame.
Partial pre-rendering
Partial pre-rendering pre-renders the static shell of a page, serves it from a CDN, then resumes rendering to fill in dynamic content later.
import { prerender } from "react-dom/static";
const { prelude, postponed } = await prerender(<App />, {
signal: controller.signal,
});The prelude goes to the client or CDN immediately, and the postponed state is saved. Later, resume continues rendering into a stream, or resumeAndPrerender finishes it as static HTML. React 19.2 also brings Web Streams support for these APIs to Node.js, though the Node Streams APIs remain the recommended default there.
Smaller changes worth knowing
A few under-the-hood changes affect real apps.
- Suspense boundaries now batch their reveals during SSR, so content arrives together instead of one item at a time.
- The default useId prefix changed to
_r_, which stays valid as a view-transition-name. - eslint-plugin-react-hooks v6 defaults to flat config and offers a recommended-legacy preset.
The batched SSR reveals also prepare the way for ViewTransition during streaming, so animations can run in larger batches of content. See React ViewTransition for the animation side of that future.
Rune AI
Key Insights
- Activity hides content while keeping its state and DOM.
- useEffectEvent separates event logic from Effects.
- cacheSignal aborts cached server work when its lifetime ends.
- Performance Tracks add React detail to Chrome DevTools.
- Partial pre-rendering pre-renders the shell and resumes later.
Frequently Asked Questions
Is React 19.2 a stable release?
Is ViewTransition part of React 19.2?
Conclusion
React 19.2 is a stable release that adds Activity, useEffectEvent, cacheSignal, Performance Tracks, and partial pre-rendering. Adopt the features that solve a real problem in your app, not the whole list at once.
More in this topic
How to Build a Dropdown Menu in React
Build a React dropdown menu with the ARIA menu button pattern. Handle open and close, keyboard arrows, and clicks outside the menu.
How to Animate React Components with Motion
Animate React components with the Motion library. Set up motion, add enter, hover, and exit animations, and respect reduced motion.
Headless UI Components Explained: Logic Without Locked Styling
Understand headless UI components and how libraries like Radix give you unstyled, accessible behavior that you style yourself.