React 19 continues to push the boundaries of UI performance and control. One of the quieter—but powerful—additions is the <Activity> component.
At first glance, it looks like another conditional rendering helper. But under the hood, <Activity> solves a long-standing problem in React apps:
hiding UI without destroying its state or effects.
Let’s break it down.
🤔 The Problem with Conditional Rendering
In React today, hiding UI usually means unmounting it:
{isVisible && <ChatWindow />}
When isVisible becomes false:
- The component unmounts
- State is lost
- Effects are cleaned up
- Timers, subscriptions, and caches reset
This is often not what we want.
🆕 Enter <Activity> in React 19
The <Activity> component allows you to:
- Hide UI
- Keep it mounted
- Preserve state, effects, and subscriptions
Think of it as pausing visibility, not lifecycle.
✨ Basic Usage
import { Activity } from "react";
<Activity visible={isVisible}>
<ChatWindow />
</Activity>
What happens here?
- When
visible={false}:- The UI is hidden
- The component stays mounted
- When
visible={true}:- The UI reappears instantly
- State is preserved
🧠 How <Activity> Thinks
| Behavior | Conditional Rendering | <Activity> |
|---|---|---|
| Component mounted | ❌ No | ✅ Yes |
| State preserved | ❌ No | ✅ Yes |
| Effects retained | ❌ No | ✅ Yes |
| UI visible | Conditional | Controlled |
🔥 Real-World Use Cases
1️⃣ Tabbed Interfaces
Switch tabs without losing form input or scroll position.
<Activity visible={activeTab === "profile"}>
<ProfileForm />
</Activity>
2️⃣ Modals & Drawers
Avoid re-initializing data every time a modal opens.
<Activity visible={isOpen}>
<SettingsModal />
</Activity>
3️⃣ Background UI
Keep background widgets alive but invisible.
<Activity visible={false}>
<LiveSyncService />
</Activity>
⚠️ Things to Keep in Mind
-
<Activity>does not stop effects - Background logic continues running
- Use carefully with:
- Polling
- Intervals
- Heavy subscriptions
If you want effects to pause, you must handle that explicitly.
🧩 <Activity> vs Suspense
| Feature | Suspense | Activity |
|---|---|---|
| Handles async loading | ✅ | ❌ |
| Controls visibility | ❌ | ✅ |
| Preserves state | ⚠️ Partial | ✅ |
| Lifecycle remains | ❌ | ✅ |
They solve different problems and work well together.
🧠 Mental Model
Suspense delays rendering.
Activity hides rendering.
🚀 Why This Matters
<Activity> enables:
- Faster UI transitions
- Better UX
- Fewer unnecessary remounts
- More control over component lifecycles
It’s a small API with big architectural implications.
🏁 Final Thoughts
React 19’s <Activity> component is a step toward intentional UI lifecycles—where visibility and existence are no longer the same thing.
If you’ve ever wished for:
“Hide this component, but don’t reset it”
<Activity> is your answer.
💬 Have thoughts or use cases in mind?
Drop them in the comments—let’s discuss React 19 together.
Top comments (0)