React Update Lifecycle
When state/props change in a component → React updates in two phases:
- Render Phase ποΈ (a.k.a. Reconciliation)
- Commit Phase β (apply changes to DOM)
1οΈβ£ Render Phase (Reconciliation Phase)
- What happens?
- React builds a virtual DOM tree based on updated state/props.
- Runs diffing algorithm (compare old Virtual DOM vs new Virtual DOM).
- Figures out what needs to change (called “effect list”).
- Characteristics:
- Can be paused, aborted, restarted (thanks to Fiber).
- Pure calculation only → does not touch the DOM yet.
- Runs component functions (
render) and hooks (useState,useEffect, etc.).
β Example:
function Counter() {
const [count, setCount] = React.useState(0);
console.log("Render phase running...");
return <h1>{count}</h1>;
}
π When setCount(1) is called:
- React runs the component function again.
- Prepares new Virtual DOM (
<h1>1</h1>). - Decides: only text inside
<h1>needs updating.
2οΈβ£ Commit Phase
- What happens?
- React applies the prepared changes to the real DOM.
- Runs DOM mutations (insert, update, delete nodes).
- Runs side-effects (
useEffect,componentDidMount,componentDidUpdate).
- Characteristics:
- Synchronous and cannot be interrupted (React must update UI fully).
- Quick but final step → user sees UI update.
β Example:
function Counter() {
const [count, setCount] = React.useState(0);
React.useEffect(() => {
console.log("Commit phase: DOM updated with count =", count);
}, [count]);
return <h1>{count}</h1>;
}
π When count changes:
- Render phase → React prepares
<h1>new count</h1>. - Commit phase → React updates DOM and then runs
useEffect.
πΉ Visualization
[State/Prop Change]
↓
Render Phase ποΈ (Virtual DOM, diffing, prepare changes)
↓
Commit Phase β
(Update real DOM + run useEffect, refs, lifecycle methods)
πΉ Example Timeline
function App() {
const [num, setNum] = React.useState(0);
console.log("Render Phase"); // Runs every render
React.useLayoutEffect(() => {
console.log("Commit Phase - useLayoutEffect");
});
React.useEffect(() => {
console.log("Commit Phase - useEffect");
}, [num]);
return (
<div>
<h1>{num}</h1>
<button onClick={() => setNum(num + 1)}>Increment</button>
</div>
);
}
πΈ When button clicked:
Render Phaseruns (prints log).- DOM updates (
<h1>changes). - Commit Phase:
useLayoutEffectruns first, thenuseEffect.
πΉ Quick Summary
| Phase | What Happens? | Can Be Interrupted? | Runs Effects? |
|---|---|---|---|
| Render | Create Virtual DOM, diffing, prepare changes | β Yes | β No |
| Commit | Apply changes to Real DOM, run effects | β No | β
Yes (useEffect, refs, lifecycle) |