React.memo से Optimization
In this page:
const MemoizedComponent = React.memo(function Component({ prop }) {
return <div>{prop}</div>;
});
// Stable props keep memo effective
const handler = useCallback(() => {}, []);
<MemoizedComponent prop={value} onAction={handler} />
एक Component को React.memo में Wrap करना
React.memo(Component) एक नया component return करता है जो re-rendering skip करता है (last rendered output reuse करते हुए) अगर इसकी props last render के बाद नहीं बदलीं, एक shallow comparison के आधार पर।
यह उन components के लिए real work save कर सकता है जो अक्सर render होते हैं लेकिन usually वही props के साथ।
उदाहरण: Wrapping a Component in React.memo
<!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">
const ExpensiveItem = React.memo(function ExpensiveItem({ name }) {
console.log("Rendering:", name);
return <li>{name}</li>;
});
function App() {
const [count, setCount] = React.useState(0);
return (
<div>
<button onClick={() => setCount(count + 1)}>Unrelated count: {count}</button>
<ExpensiveItem name="Static Item" />
</div>
);
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
</script>
</body>
</html>
नए Object/Function Props memo को क्यों Defeat करते हैं
React.memo का default comparison check करता है कि क्या हर prop इसकी previous value के === equal है। एक inline object या function एक prop के रूप में pass किया गया (जैसे style={{color: red}} या onClick={() => {}}) हर parent render पर एक BRAND NEW reference बनाता है, इसलिए comparison हमेशा changed देखता है, even अगर values identical दिखें।
उदाहरण: Why New Object/Function Props Defeat memo
<!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">
const Child = React.memo(function Child({ onClick }) {
console.log("Child rendered");
return <button onClick={onClick}>Click</button>;
});
function App() {
const [count, setCount] = React.useState(0);
// New arrow function every render -- defeats React.memo below:
return (
<div>
<button onClick={() => setCount(count + 1)}>Count: {count}</button>
<Child onClick={() => console.log("clicked")} />
</div>
);
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
</script>
</body>
</html>
React.memo कब Worth Use करना है
React.memo सबसे clearly उन components के लिए pay off करता है जो UNCHANGED props के साथ frequently render होते हैं (जैसे एक बड़ी list में एक list item जहां सिर्फ एक item actually update होता है), और जिनका अपना rendering work non-trivial है।
Cheap, simple components के लिए, comparison overhead किसी भी savings से ज़्यादा हो सकता है।
उदाहरण: When React.memo Is Worth Using
<!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">
const ListItem = React.memo(function ListItem({ text }) {
return <li>{text}</li>;
});
function App() {
const items = ["Apple", "Banana", "Cherry"];
const [unrelated, setUnrelated] = React.useState(0);
return (
<div>
<button onClick={() => setUnrelated(unrelated + 1)}>Re-render parent: {unrelated}</button>
<ul>{items.map(i => <ListItem key={i} text={i} />)}</ul>
</div>
);
}
ReactDOM.createRoot(document.getElementById('root')).render(<App />);
</script>
</body>
</html>
- हर component को default रूप से React.memo में wrap करना, cheap components के लिए किसी real re-render savings के बिना comparison overhead जोड़ते हुए।
- यह expect करना कि React.memo तब help करेगा जब component की props हर parent render पर नए objects/functions हों (यह उस case में फिर भी re-render होता है)।
- यह भूल जाना कि React.memo default रूप से सिर्फ एक shallow prop comparison करता है — एक unchanged-reference object के अंदर deeply nested changed values detect नहीं होंगी।
- React.memo एक component को wrap करता है ताकि यह re-rendering skip करे अगर इसकी props previous render की props के shallowly equal हों।
- यह उन components के लिए सबसे useful है जो अक्सर same props के साथ render होते हैं, और जिनका अपना rendering work non-trivial है।
- अगर props खुद (objects/functions) हर render पर नए references हों तो React.memo अकेले help नहीं करता — इसे parent में useMemo/useCallback के साथ pair करें।
- इसे हर component पर 'just in case' apply करना बिना matching benefit के comparison overhead जोड़ता है।
React 16.6 से available (React.memo introduce हुआ)।
Chapter Quiz — Complete all 13 topics to unlock
0/13 topics done
Complete these topics first:
- Why Performance Matters
- Optimizing with React.memo
- Avoiding Unnecessary Re-renders
- Using the React Profiler
- Analyzing Bundle Size
- Image Optimization Techniques
- React as a PWA
- Creating a Production Build
- Environment Variables in React
- Deploying to Netlify
- Deploying to Vercel
- Basic CI/CD for React Apps
- SEO Basics for React SPAs