React 19.2 introduced Activity for preserving hidden UI state, useEffectEvent for reading current values inside Effect events, and Performance Tracks for investigating React work. Its server additions include cacheSignal and partial pre-rendering APIs.
The interesting part is what those names let you fix. A student should be able to close a notes panel without losing a draft. Changing a timer setting should have an intentional effect on the timer. A slow search box needs an explanation before another optimization.
What changed in React 19.2?
The React team released React 19.2 on October 1, 2025. This guide focuses on that release’s features and how to apply them. You can begin with components, props, and useState; the server sections are optional first reading.
Start with the problem you can reproduce. Try Activity when temporarily hiding a view should preserve its state. Try useEffectEvent when a callback needs current settings without rebuilding its subscription. Use Performance Tracks to investigate a delay you can actually observe.
Two terms matter below. State is a component’s memory. An Effect synchronizes a component with something outside React, such as a timer or connection. Neither feature removes the need to decide who owns that memory or when synchronization should change.
Activity: hide a panel without losing its draft
With visible && <NotesEditor />, setting visible to false removes the editor from the React tree. Its local state is discarded. Showing it again creates a fresh editor. That follows React’s existing state-preservation rules.
Activity offers a different choice: hide the subtree while retaining its state and DOM. React cleans up its Effects while hidden, then sets them up again when visible. Updates to hidden content receive lower priority.
- 01 / WRITE
Use the visible view
The draft holds your text. Its Effects are active.
- 02 / HIDE
Keep state, clean up
Activity hides the view, preserves state, and cleans up Effects.
- 03 / RETURN
Continue your work
The view returns with its state. React recreates its Effects.
Conditional unmounting removes the component and its local state. Activity preserves state while its hidden boundary remains mounted; it does not save a draft across a page reload.
Hide an editor. What happens to its draft?
Type something in each box, select Hide editors, then select Show editors. Compare which draft returns.
Conditional rendering
MountedRemoving this editor unmounts it. Showing it again creates a new editor with an empty draft.
Activity
VisibleActivity hides this editor and preserves its React state. Showing it again restores the same draft.
Each editor owns its draft in component state. This demo does not save your text: resetting or reloading clears both drafts.
In this comparison, each editor owns its draft. The parent only controls visibility. Type different sentences, hide both, and bring them back. The contrast is easier to understand when you can watch which component’s memory survives.
"use client";
import { Activity, useState } from "react";
export default function NotesPanel() {
const [visible, setVisible] = useState(true);
return (
<>
<button onClick={() => setVisible(value => !value)}>
{visible ? "Hide notes" : "Show notes"}
</button>
<Activity mode={visible ? "visible" : "hidden"}>
<NotesEditor />
</Activity>
</>
);
}
function NotesEditor() {
const [draft, setDraft] = useState("");
return (
<label>
Lesson notes
<textarea
value={draft}
onChange={event => setDraft(event.target.value)}
/>
</label>
);
}Useful cases: lesson notes, temporarily closed search filters, or a settings panel someone is likely to reopen. A completed form that should start empty next time may be better unmounted. Keeping every large screen in memory is not an automatic performance win.
Activity is not draft storage. Removing its boundary or refreshing the page loses the preserved state. It also does more than CSS hiding: Effect cleanup can disconnect a subscription. Check integrations such as video players, which may need explicit cleanup to stop playback.
useEffectEvent: separate a timer from what each tick reads
Suppose a practice counter adds points every second. A dropdown changes how many points each tick adds. A callback created by an Effect can capture an older setting. Recreating the interval whenever the setting changes also resets its schedule. First decide which behavior the interface needs.
useEffectEvent lets an Effect’s event-like callback read the latest committed props and state without making those reads restart the surrounding Effect. The interval still needs ordinary setup and cleanup.
"use client";
import { useEffect, useEffectEvent, useState } from "react";
export default function PracticeCounter() {
const [points, setPoints] = useState(0);
const [step, setStep] = useState(1);
const onTick = useEffectEvent(() => {
setPoints(previous => previous + step);
});
useEffect(() => {
const timer = setInterval(() => onTick(), 1000);
return () => clearInterval(timer);
}, []);
return (
<>
<label>
Points per second
<select value={step} onChange={event => {
setStep(Number(event.target.value));
}}>
<option value={1}>1</option>
<option value={5}>5</option>
</select>
</label>
<p>{points} practice points</p>
</>
);
}Here, the Effect starts one interval. Each tick calls onTick, which reads the current step. Selecting five changes the next increment without recreating the interval. The functional state update receives the previous points total; the Effect Event supplies the current step.
The decision to practice: does a changed value alter the subscription itself, or only the response to its next event? A chat room ID should reconnect the chat. A notification’s appearance may only need to be read when a message arrives. React’s guide to separating events from Effects develops this distinction.
Keep Effect Events in the component or custom Hook containing their Effects. Don’t pass one to a child, use it as an onClick, or add it to the dependency array. Keep genuine reactive dependencies and the Hooks linter. This API is not a way to hide dependency errors.
Performance Tracks: find the work behind a slow interaction
React Performance Tracks place React activity alongside browser work in supported performance recordings. Scheduler tracks show how updates are prioritized; component tracks help connect rendering and Effects to particular components.
Imagine a lesson search that feels sluggish. Start with a question: is the delay caused by rendering the results, an expensive event handler, or waiting for data? A timeline helps investigate these possibilities instead of guessing from the visible symptom.
- Record one repeatable interaction in the browser’s Performance panel.
- Find the relevant React work and inspect nearby JavaScript and network activity.
- Change one suspected cause, then record the same interaction under comparable conditions.
Use a development or profiling build. The instrumentation adds overhead and is not enabled in ordinary production builds by default. Treat the recording as diagnostic evidence, then validate the user experience in an appropriate production setup. Installing the release or opening a track does not itself make an application faster.
cacheSignal: stop server work that is no longer needed
This section is for React Server Components. React’s cache can share the result of a computation during server rendering. cacheSignal exposes an abort signal tied to that rendering lifetime.
Consider a server-rendered lesson page that starts a fetch. If its render is abandoned, continuing work for an unused result may be wasteful. An operation that accepts the signal can respond when React finishes, aborts, or fails the render. The operation must support cancellation; a signal cannot make every database query cancellable.
Call it during rendering, where React can associate the work with the cache lifetime. It is not a client-side search-cancellation Hook or a general replacement for AbortController. If you are learning browser-only React, understand the use case and move on.
Server rendering: prepare shared content, finish dynamic work later
A course page may have a shared introduction and a personalized progress panel. Partial pre-rendering makes it possible to prepare an initial shell, retain postponed work, and resume that work later. React’s prerender and resume references explain the lower-level APIs.
- 01 / PREPARE
Build static HTML
Prepare a shared shell, such as a page header and navigation.
- 02 / POSTPONE
Leave dynamic work
Stop the prerender and retain the postponed state for unfinished content.
- 03 / RESUME
Fill in the details
Resume on the server with request data and stream the remaining content.
The practical benefit is separating content that can be prepared ahead of time from content that depends on a request. Your framework and deployment still need to coordinate the response and caching. Installing React alone does not configure this architecture.
The 19.2 release notes also describe brief batching of server-rendered Suspense reveals, helping nearby pieces of content appear together. Web Streams became available for more server-rendering APIs in Node.js, although the React team recommends the Node Streams alternatives for that environment. For a first application, follow your framework’s integration instead of writing a custom streaming server.
A practical checklist before adopting React 19.2 features
Check what your project actually runs before copying an example. Framework support, component-library peer dependencies, and type packages matter alongside the React version.
npm ls react react-dom- Establish a baseline. Keep a working lockfile and run your existing checks before the upgrade.
- Follow supported versions. Keep React and React DOM compatible, use maintained patches, and follow your framework’s upgrade instructions. Update TypeScript declarations when needed.
- Check the Hooks linter. Use rules that understand Effect Events. Review configuration changes instead of disabling warnings.
- Exercise the lifecycle. Hide and reopen panels; confirm drafts, subscriptions, timers, and keyboard focus behave as intended.
- Check delivery. Run the production build, reload important routes directly, and investigate hydration warnings.
Coming from React 18? Start with the React 19 upgrade guide for major-version changes. Consult the current versions page before choosing a release line for a new project.
Your first project: a lesson workspace that remembers the right things
Build a small workspace with lesson notes and a practice counter. Use local sample lessons so you can concentrate on React behavior. My suggested finish line is a clear explanation of the following checks, not simply importing both new APIs.
Acceptance checks
- Write two sentences, close the notes panel, and reopen it. Both sentences remain.
- Change the points-per-tick setting. The next tick uses it without restarting the interval.
- Leave the workspace. Verify the interval is cleaned up rather than continuing invisibly.
- Refresh the page. Explain why in-memory notes disappear and what separate storage would require.
Stretch task: record one interaction with Performance Tracks. Describe what you observed without claiming a speed improvement you have not measured.
React 19.2 questions beginners ask
When was React 19.2 released?
React 19.2 was released on October 1, 2025. This guide explains that release's features and practical uses; it is not a new-release announcement for September 2026.
What are the most useful React 19.2 features to learn first?
Start with Activity when a hidden panel should retain state, useEffectEvent when Effect event logic needs current values, and Performance Tracks when diagnosing a slow interaction. cacheSignal and partial pre-rendering are primarily relevant to server and framework work.
Does Activity save a draft after refreshing?
No. It retains state while the Activity boundary stays mounted, including when hidden. Refreshing or removing that boundary loses in-memory state. Persistent drafts need separate storage.
Can useEffectEvent replace my Effect dependency array?
No. Values that should reconnect or resynchronize an Effect still belong in its dependency array. Effect Events are for event-like logic called from Effects, not general click handlers or a way to hide dependencies.
Does installing React 19.2 enable partial pre-rendering?
No. React provides the underlying server APIs. Your framework or rendering infrastructure must coordinate preparing, storing, and resuming the shell. Check the framework's support and configuration.
Claps, saves, topic follows, and comment previews are for this visit only. Comments are not published.
