🧭 Introduction
One of the most misunderstood topics in React is performance optimization.
Many developers:
- Add
useMemoeverywhere ❌ - Wrap everything with
React.memo❌ - Use
useCallbackwithout knowing why ❌
This often results in:
- More complex code
- Little or no performance improvement
- Confusion during debugging
In this lesson, you will learn what memoization actually means, when it helps, and when it makes things worse — exactly how senior React developers think about performance.
🎯 What You’ll Learn in This Lesson
By the end of this lesson, you will understand:
- Why React re-renders components
- What memoization really is
- How
React.memoworks - How
useMemoworks - How
useCallbackworks - When not to use memoization
- A practical decision framework
🧠 Why Do React Components Re-render?
A component re-renders when:
- Its state changes
- Its props change
- Its parent re-renders
👉 Re-rendering is normal and expected in React.
❗ Re-render ≠ DOM update
React is fast at rendering.
Optimizing too early is a mistake.
🧩 What Is Memoization?
Memoization means:
“Remember the result of an expensive operation and reuse it if inputs haven’t changed.”
In React, memoization helps prevent:
- Unnecessary re-renders
- Recalculating expensive values
- Recreating functions unnecessarily
🔹 React.memo — Memoizing Components
❓ What React.memo Does
React.memo prevents a component from re-rendering if its props haven’t changed.
✅ Basic Example
const Child = React.memo(function Child({ value }) {
console.log("Child rendered");
return <p>{value}</p>;
});
If the parent re-renders but value stays the same:
✔ Child does NOT re-render.
🧠 When to Use React.memo
Use it when:
- Component renders often
- Props are stable
- Component is expensive to render
Examples:
- List items
- Chart components
- Large tables
❌ When NOT to Use React.memo
Avoid it when:
- Component is small
- Props change frequently
- You are guessing instead of measuring
⚠️ Overusing React.memo adds comparison cost.
🔹 useMemo — Memoizing Values
❓ What useMemo Does
useMemo memoizes the result of a computation.
✅ Example
const expensiveValue = useMemo(() => {
return heavyCalculation(data);
}, [data]);
- Function runs only when
datachanges - Cached result reused otherwise
🧠 When to Use useMemo
Use it when:
- Calculation is expensive
- Input data changes infrequently
Examples:
- Filtering large lists
- Sorting data
- Complex calculations
❌ Common Mistake
const value = useMemo(() => x + y, [x, y]);
❌ This is unnecessary — simple calculations don’t need memoization.
🔹 useCallback — Memoizing Functions
❓ What useCallback Does
useCallback memoizes function references.
✅ Example
const handleClick = useCallback(() => {
setCount(c => c + 1);
}, []);
This prevents function recreation on every render.
🧠 Why Function References Matter
Functions are objects in JavaScript.
If you pass a function to:
React.memocomponent- Dependency array
- Child component
A new function reference → causes re-render.
🧠 useCallback + React.memo (Power Combo)
const Child = React.memo(({ onClick }) => {
console.log("Child rendered");
return <button onClick={onClick}>Click</button>;
});
function Parent() {
const handleClick = useCallback(() => {
console.log("Clicked");
}, []);
return <Child onClick={handleClick} />;
}
✔ Child does not re-render unnecessarily.
🆚 useMemo vs useCallback (Clear Difference)
| Hook | Memoizes |
|---|---|
| useMemo | Value |
| useCallback | Function |
👉 useCallback(fn) ≈ useMemo(() => fn)
🧠 The Golden Rule of Memoization
Measure first. Optimize second.
If you don’t see a performance issue:
❌ Do not add memoization.
🚨 Common Memoization Mistakes
❌ Using useMemo Everywhere
Adds complexity without benefit.
❌ Wrapping Every Component with React.memo
Can slow down rendering.
❌ Forgetting Dependencies
Causes stale values and bugs.
❌ Optimizing Too Early
Premature optimization is harmful.
🧪 How to Know When to Optimize
Use:
- React DevTools Profiler
- Console logs (temporarily)
- Real performance measurements
👉 Optimize only hotspots.
🏗️ Real-World Optimization Strategy
1️⃣ Build features first
2️⃣ Identify slow components
3️⃣ Measure with profiler
4️⃣ Apply memoization carefully
5️⃣ Re-test performance
This is how production teams work.
🎯 Best Practices (Senior-Level)
✅ Use React.memo for expensive child components
✅ Use useMemo only for heavy computations
✅ Use useCallback when passing callbacks to memoized children
✅ Avoid premature optimization
✅ Keep code readable
❓ FAQs — Memoization in React
🔹 Does memoization always improve performance?
No — sometimes it makes it worse.
🔹 Should I use memoization in small apps?
Rarely.
🔹 Is React already optimized?
Yes — React is fast by default.
🔹 Is memoization required for interviews?
Yes — understanding it conceptually is important.
🧠 Quick Recap
✔ React re-renders are normal
✔ Memoization prevents unnecessary work
✔ React.memo → components
✔ useMemo → values
✔ useCallback → functions
✔ Optimize only when needed
🎉 Conclusion
Memoization is not about writing clever code.
It’s about writing responsible code.
Once you understand when to use it and when not to, your React applications become:
- Faster
- Cleaner
- Easier to maintain
This lesson marks your transition from React developer to performance-aware React engineer ⚛️⚡
👉 Next Lesson
Lesson 18 — React Profiler (Finding & Fixing Performance Bottlenecks)