React State Batching क्या है
In this page:
function Component() {
const [first, setFirst] = useState(initial);
const [second, setSecond] = useState(initial);
function handleEvent() {
setFirst(newValue1); // batched:
setSecond(newValue2); // one re-render for both
}
}
Multiple Updates, One Re-render
जब एक ही event handler के अंदर कई state setters call होते हैं, तो React हर एक के बाद individually re-render नहीं करता -- यह handler खत्म होने तक wait करता है, फिर सभी changes एक साथ apply करके एक ही बार re-render करता है।
यह UI को fast रखता है और partial, inconsistent states दिखाने से बचाता है।
उदाहरण: Multiple Updates, One Re-render
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
function MultiUpdate() {
const [a, setA] = React.useState(0);
const [b, setB] = React.useState(0);
function handleClick() {
setA(a + 1);
setB(b + 1);
// Only ONE re-render happens, with both updates applied
}
return <button onClick={handleClick}>A: {a}, B: {b}</button>;
}
ReactDOM.createRoot(document.getElementById('root')).render(<MultiUpdate />);
</script>
</body>
</html>
Automatic Batching in React 18
React 18 से पहले, batching ज़्यादातर सिर्फ उन handlers के अंदर होती थी जो directly React से trigger होते थे (जैसे onClick), लेकिन एक setTimeout या एक fetch के .then() के अंदर updates हर एक अलग re-render cause करते थे।
React 18 ने automatic batching को इन cases तक भी बढ़ाया, performance को default रूप से और बेहतर बनाते हुए।
उदाहरण: Automatic Batching in React 18
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
function TimeoutUpdate() {
const [a, setA] = React.useState(0);
const [b, setB] = React.useState(0);
function handleClick() {
setTimeout(() => {
setA(prev => prev + 1);
setB(prev => prev + 1);
// React 18+: still batched into one re-render, even inside setTimeout
}, 200);
}
return <button onClick={handleClick}>A: {a}, B: {b}</button>;
}
ReactDOM.createRoot(document.getElementById('root')).render(<TimeoutUpdate />);
</script>
</body>
</html>
Why Batching Matters for Performance
हर re-render की एक cost होती है -- React को आपका component function फिर से run करना पड़ता है और result को पहले वाले से compare करना पड़ता है। Batching उन updates के लिए यह बार-बार करने से बचाती है जो logically साथ belong करते हैं, जिनमें बहुत सारे state changes वाले apps को काफी तेज़ रखते हुए।
उदाहरण: Why Batching Matters for Performance
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
function ManyUpdates() {
const [x, setX] = React.useState(0);
const [y, setY] = React.useState(0);
const [z, setZ] = React.useState(0);
function handleClick() {
setX(x + 1);
setY(y + 1);
setZ(z + 1);
// All three updates batched into a single render
}
return <button onClick={handleClick}>{x}, {y}, {z}</button>;
}
ReactDOM.createRoot(document.getElementById('root')).render(<ManyUpdates />);
</script>
</body>
</html>
- यह assume करना कि एक event handler के अंदर हर setState call एक अलग, immediate re-render cause करती है।
- यह न realize करना कि React 18 ने automatic batching को ज़्यादा जगहों तक बढ़ाया (जैसे promises और timeouts के अंदर) जितना React 17 करता था।
- Setter call करने के ठीक बाद एक state variable पढ़ना और यह उम्मीद करना कि batched update पहले से reflect हो गया होगा।
- Batching efficiency के लिए कई state updates को एक single re-render में group करती है।
- React 18+ में, batching almost हर जगह अपने आप होती है, timeouts और promises सहित।
- React 18 से पहले, automatic batching ज़्यादातर सिर्फ React event handlers के अंदर होती थी।
- Batching redundant, intermediate re-renders से बचकर performance improve करती है।
Automatic batching हर जगह (सिर्फ React event handlers में नहीं) React 18 में introduce हुई; पहले वाले versions default रूप से सिर्फ React के अपने event handlers के अंदर batch करते थे।
Chapter Quiz — Complete all 10 topics to unlock
0/10 topics done
Complete these topics first: