Loading...
Loading...
React Concurrent Features for responsive UIs. Covers useTransition, useDeferredValue, Suspense, startTransition, concurrent rendering patterns, and priority-based updates. USE WHEN: user mentions "useTransition", "useDeferredValue", "startTransition", "concurrent rendering", "non-urgent updates", asks about "keeping UI responsive", "priority updates in React" DO NOT USE FOR: React 17 and earlier (concurrent mode not available), Simple applications without heavy rendering, Non-React frameworks
npx skill4agent add claude-dev-suite/claude-dev-suite react-concurrentFull Reference: See advanced.md for advanced concurrent patterns including priority-based updates, optimistic updates with transitions, router integration, form actions, and debugging techniques.
Deep Knowledge: Usewith technology:mcp__documentation__fetch_docs, topic:reactfor comprehensive documentation.concurrent
Traditional Rendering:
[Update starts]────────────────────────[Render complete]
UI blocked!
Concurrent Rendering:
[Update starts]──[pause]──[higher priority]──[resume]──[complete]
UI remains responsive!import { useState, useTransition } from 'react';
function TabContainer() {
const [tab, setTab] = useState('home');
const [isPending, startTransition] = useTransition();
function selectTab(nextTab: string) {
startTransition(() => {
setTab(nextTab);
});
}
return (
<div>
<nav>
{['home', 'about', 'contact'].map((t) => (
<button key={t} onClick={() => selectTab(t)}>
{t}
</button>
))}
</nav>
<div className={isPending ? 'opacity-50' : ''}>
{tab === 'home' && <Home />}
{tab === 'about' && <About />}
{tab === 'contact' && <Contact />}
</div>
</div>
);
}import { useState, useDeferredValue, memo } from 'react';
function SearchPage() {
const [query, setQuery] = useState('');
const deferredQuery = useDeferredValue(query);
const isStale = query !== deferredQuery;
return (
<div>
<input
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder="Search..."
/>
<div className={isStale ? 'opacity-50' : ''}>
<SearchResults query={deferredQuery} />
</div>
</div>
);
}
// Memoize to actually benefit from deferred value
const SearchResults = memo(function SearchResults({ query }: { query: string }) {
const results = useMemo(() => {
return items.filter(item =>
item.name.toLowerCase().includes(query.toLowerCase())
);
}, [query]);
return <ul>{results.map(item => <li key={item.id}>{item.name}</li>)}</ul>;
});isPendingimport { startTransition } from 'react';
function handleClick() {
startTransition(() => {
setPage('/heavy-page');
});
}function App() {
const [tab, setTab] = useState('home');
const [isPending, startTransition] = useTransition();
return (
<div>
<nav>
<button onClick={() => startTransition(() => setTab('posts'))}>
Posts
</button>
</nav>
<Suspense fallback={<TabSkeleton />}>
<div className={isPending ? 'opacity-50' : ''}>
{tab === 'posts' && <Posts />}
</div>
</Suspense>
</div>
);
}| Feature | useTransition | useDeferredValue |
|---|---|---|
| Purpose | Wrap state updates | Defer a value |
| Usage | When you control the update | When you receive a value |
| Returns | | Deferred value |
| Use case | Button clicks, form submits | Props from parent |
| Anti-Pattern | Why It's Bad | Correct Approach |
|---|---|---|
| Wrapping every state update | Adds unnecessary complexity | Only for heavy updates |
| Not memoizing child components | No benefit from deferred value | Use |
| Using for fast operations | Performance overhead | Reserve for slow renders (> 50ms) |
| Ignoring isPending state | User sees no feedback | Show loading indicator |
| Multiple transitions unnecessarily | Confusing behavior | Batch related updates |
| Issue | Likely Cause | Solution |
|---|---|---|
| No performance improvement | Child not memoized | Add |
| Still blocking UI | Synchronous heavy computation | Move to Web Worker |
| isPending always false | Update completes too fast | No transition needed |
| Stale UI shown too long | No loading indicator | Check and display isPending |
| Transition not working | Using in React < 18 | Upgrade to React 18+ |
memo()useDeferredValueDeep Knowledge: Usewith technology:mcp__documentation__fetch_docs, topic:reactfor comprehensive documentation.concurrent