React 19.2 Features You Should Actually Know

React 19.2 ships Activity, useEffectEvent, cacheSignal, Performance Tracks, and partial pre-rendering, plus SSR and tooling changes that matter in practice.

8 min read

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.

App.jsxApp.jsx
<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.

App.jsxApp.jsx
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.

App.jsxApp.jsx
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.

App.jsxApp.jsx
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

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.
RunePowered by Rune AI

Frequently Asked Questions

Is React 19.2 a stable release?

Yes. React 19.2 shipped in October 2025 as the third release after React 19 and React 19.1, and it is the current stable version.

Is ViewTransition part of React 19.2?

ViewTransition is related but still ships in the Canary and Experimental channels. React 19.2 lays groundwork for it, such as batching Suspense reveals during SSR.

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.