To feel smooth, browsers aim for 60 frames per second, giving us only:
React must:
When React takes too long, users experience:
This is where concurrent rendering changes the game.
Concurrent rendering is a new rendering model in React 18 that allows React to:
✅ Start rendering.
⏸ Pause rendering if it takes too long.
▶ Resume later.
🚫 Without blocking user interactions.
Instead of treating rendering as a single uninterruptible task, React now breaks it into small chunks and yields control back to the browser when needed.
This allows:
Even during heavy UI updates.
Concurrent rendering is not a feature you “turn on” directly — it’s the foundation for new APIs like:
useDeferredValuestartTransitionSuspenseThese APIs allow React to prioritize updates instead of treating all renders equally.
Not all UI updates are equally important.
Example:
Without prioritization, React would block typing until all results finish rendering 😵.
Concurrent rendering lets React:
useDeferredValuefunction App() {const [text, setText] = useState('');const deferredText = useDeferredValue(text);return (<><input value={text} onChange={e => setText(e.target.value)} /><SlowList text={deferredText} /></>);}
Now: