---
id: wiki-2026-0508-concurrent-features
title: Concurrent Features (React 18+)
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [React Concurrent Mode, useTransition, useDeferredValue]
duplicate_of: none
source_trust_level: A
confidence_score: 0.9
verification_status: applied
tags: [react, concurrent, performance, frontend]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
language: TypeScript
framework: React 19
---
# Concurrent Features (React 18+)
## 매 한 줄
> **"매 render 매 interruptible 하다"**. React 18 부터 매 concurrent renderer — `useTransition`, `useDeferredValue`, `Suspense`, automatic batching, streaming SSR 매 모두 매 high-priority update 가 low-priority 를 preempt 가능한 architecture 위에 build.
## 매 핵심
### 매 핵심 features
- **Automatic batching**: promise / setTimeout / native event 모두 batch.
- **`startTransition` / `useTransition`**: 매 non-urgent state update marking.
- **`useDeferredValue`**: input 매 lag 없이 expensive list 매 deferred.
- **`Suspense`**: data fetching boundary, fallback UI.
- **Streaming SSR**: `renderToPipeableStream` (Node), `renderToReadableStream` (Edge).
- **`useId`**: SSR-safe unique id.
- **`use()` hook (React 19)**: unwrap promise/context inside render.
### 매 priority levels
1. Sync / urgent (user input).
2. Default (most state updates).
3. Transition (`startTransition`).
4. Idle.
### 매 응용
1. 매 typeahead search — input snappy + results deferred.
2. Tab switching — 매 stale UI keeps interactive.
3. Streaming page render — 매 fastest paint then progressively fill.
## 💻 패턴
### useTransition for non-urgent updates
```tsx
import { useState, useTransition } from 'react';
function Filter({ items }: { items: Item[] }) {
const [query, setQuery] = useState('');
const [filtered, setFiltered] = useState(items);
const [isPending, startTransition] = useTransition();
const onChange = (v: string) => {
setQuery(v); // urgent — input responds immediately
startTransition(() => {
setFiltered(items.filter((i) => i.name.includes(v))); // non-urgent
});
};
return (
<>
onChange(e.target.value)} />
{isPending &&
>
);
}
```
### useDeferredValue
```tsx
import { useState, useDeferredValue, memo } from 'react';
function Search({ items }: { items: Item[] }) {
const [query, setQuery] = useState('');
const deferred = useDeferredValue(query);
return (
<>
setQuery(e.target.value)} />