๐ฃ React useMemo
& useCallback
Optimization โ Boost Performance with Memoization (2025 Guide)
๐งฒ Introduction โ Why Optimize with useMemo
& useCallback
?
React components re-render oftenโsometimes too often. Every render recalculates expressions and recreates function references, which can lead to unnecessary re-renders of children and performance bottlenecks in large apps.
Reactโs useMemo
and useCallback
Hooks let you memoize values and functions, reducing computation and preventing child components from re-rendering unless necessary.
๐ฏ In this guide, youโll learn:
- The difference between
useMemo
anduseCallback
- When and how to use each hook
- Practical examples and best practices
- Performance benefits and common pitfalls
๐ฆ 1. Whatโs the Difference?
Hook | Purpose | Returns |
---|---|---|
useMemo | Memoize values | Cached value |
useCallback | Memoize functions | Stable function ref |
๐ง 2. useMemo
โ Cache Expensive Calculations
โ Syntax:
const memoizedValue = useMemo(() => computeValue(a, b), [a, b]);
โ Example โ Sort Only When Data Changes:
const sortedItems = useMemo(() => {
console.log('Sorting...');
return items.sort((a, b) => a.name.localeCompare(b.name));
}, [items]);
โ
Prevents re-sorting on every render
๐ Useful for formatting, calculations, filtered lists
๐ 3. useCallback
โ Preserve Function References
โ Syntax:
const memoizedFn = useCallback(() => {
doSomething();
}, [dependencies]);
โ Example โ Pass Stable Handler to Child:
const handleClick = useCallback(() => {
setCount((prev) => prev + 1);
}, []);
<Child onClick={handleClick} />
โ
Prevents Child
from re-rendering when parent updates
๐ Combine with React.memo
for max benefit
๐งฉ 4. Why It Matters for Performance
Without Memoization | With useMemo / useCallback |
---|---|
Every render recalculates expressions | Expensive logic is skipped if deps donโt change |
New function object on every render | Memoized function remains the same |
Child components re-render unnecessarily | Children skip re-render if props are stable |
๐งช 5. Common Use Cases
๐งฎ Expensive Computation (useMemo):
const fibonacci = useMemo(() => computeFibonacci(n), [n]);
โ๏ธ Filtering / Derived State:
const filteredList = useMemo(() =>
users.filter(user => user.isActive),
[users]);
๐งฒ Memoize Functions for Stable Props:
const onAdd = useCallback((item) => addToCart(item), [addToCart]);
โ ๏ธ 6. Common Pitfalls
Mistake | Solution |
---|---|
Using without dependencies | Always define dependencies |
Memoizing trivial functions | Use only for functions passed to children |
Overusing useMemo everywhere | Profile first โ only optimize bottlenecks |
Forgetting useCallback with React.memo | Causes unnecessary child renders |
๐ Best Practices
โ
Use useMemo
to avoid recomputing expensive values
โ
Use useCallback
to prevent child re-renders
โ
Pair React.memo
with useCallback
for optimized prop passing
โ
Wrap utility logic in memoized hooks for reusability
โ
Profile with React DevTools before optimizing prematurely
๐ Summary โ Recap & Next Steps
useMemo
and useCallback
are essential for fine-tuning performance in React. When used correctly, they help avoid wasteful renders and recalculations in complex UI structures.
๐ Key Takeaways:
useMemo
caches values,useCallback
caches functions- Useful for expensive calculations, sorting, filtering
- Prevents re-renders in memoized child components
- Avoid overuseโapply to bottlenecks and props passed to children
โ๏ธ Real-World Relevance:
Used in search filters, dashboards, infinite scrolls, charts, and form builders across apps like Shopify, Slack, and Figma.
โ FAQ Section
โ Can I use useCallback
inside useEffect
?
โ
Yes. It’s safe to use and useful when referencing a stable function.
โ Does useMemo
improve performance always?
โ Not always. It has a cost. Use only for expensive calculations.
โ Should I use useCallback
for every function?
โ No. Use only when the function is passed to memoized child components.
โ What’s the difference between useMemo
and useRef
?
โ
useMemo
returns a computed value, useRef
returns a mutable reference that doesnโt trigger re-renders.
โ How do I debug memoization issues?
โ
Use React DevTools Profiler or the why-did-you-render library in development mode.
Share Now :