useMemo is a React hook that allows you to memoize (cache) computation results between renders. It prevents repeated calculations on every render if dependencies haven’t changed.
Syntax: const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
Key features:
Usage example:
function ExpensiveCalculation({ number }) {
const expensiveValue = useMemo(() => {
console.log('Calculating...');
return number * 2;
}, [number]);
return <div>Result: {expensiveValue}</div>;
}
The useMemo
hook is one of React’s built-in hooks designed to optimize performance by memoizing computation results. It helps avoid repeated expensive calculations on every component render. 🚀
useMemo
takes two parameters:
import React, { useMemo } from 'react';
function Component({ a, b }) {
const memoizedValue = useMemo(() => {
// Expensive calculations
return a * b;
}, [a, b]); // Recalculates only if a or b changed
return <div>Result: {memoizedValue}</div>;
}
When component renders:
function FibonacciCalculator({ number }) {
const fibonacci = useMemo(() => {
console.log('Calculating Fibonacci number...');
if (number <= 1) return number;
let a = 0, b = 1;
for (let i = 2; i <= number; i++) {
[a, b] = [b, a + b];
}
return b;
}, [number]);
return <div>Fibonacci number: {fibonacci}</div>;
}
function UserProfile({ user }) {
const userInfo = useMemo(() => ({
name: user.firstName + ' ' + user.lastName,
avatar: user.photoUrl,
isAdmin: user.role === 'admin'
}), [user]);
// userInfo will be stable between renders
return <UserCard user={userInfo} />;
}
function Parent({ items }) {
// Without useMemo object is created anew on every render
// const processedItems = items.map(item => ({ ...item, processed: true }));
// With useMemo object is stable between renders
const processedItems = useMemo(() =>
items.map(item => ({ ...item, processed: true })),
[items]
);
return <Child items={processedItems} />;
}
// In child component you can use React.memo
const Child = React.memo(function Child({ items }) {
return (
<ul>
{items.map(item => <li key={item.id}>{item.name}</li>)}
</ul>
);
});
✅ Use useMemo when:
function ProductList({ products, searchTerm, category }) {
// Filtering and sorting - expensive operations
const filteredProducts = useMemo(() => {
return products
.filter(product =>
product.name.toLowerCase().includes(searchTerm.toLowerCase()) &&
product.category === category
)
.sort((a, b) => a.price - b.price);
}, [products, searchTerm, category]);
return (
<ul>
{filteredProducts.map(product =>
<ProductItem key={product.id} product={product} />
)}
</ul>
);
}
❌ Avoid useMemo when:
// ❌ Don't use useMemo for simple operations
function BadExample({ a, b }) {
const sum = useMemo(() => a + b, [a, b]); // Overkill!
return <div>{sum}</div>;
}
// ✅ Just use a variable
function GoodExample({ a, b }) {
const sum = a + b; // Simple and efficient
return <div>{sum}</div>;
}
// ❌ Overuse
function Component({ name }) {
const greeting = useMemo(() => `Hello, ${name}!`, [name]);
return <h1>{greeting}</h1>;
}
// ✅ Just use a variable
function Component({ name }) {
const greeting = `Hello, ${name}!`;
return <h1>{greeting}</h1>;
}
// ❌ Error: missing dependency
function Component({ user }) {
const fullName = useMemo(() => {
return user.firstName + ' ' + user.lastName;
}, []); // user not in dependencies list!
return <div>{fullName}</div>;
}
// ✅ Correctly: all dependencies specified
function Component({ user }) {
const fullName = useMemo(() => {
return user.firstName + ' ' + user.lastName;
}, [user]);
return <div>{fullName}</div>;
}
// ❌ Error: mutating object
function Component({ items }) {
const processedItems = useMemo(() => {
items.forEach(item => item.processed = true); // Mutating!
return items;
}, [items]);
return <List items={processedItems} />;
}
// ✅ Correctly: creating new object
function Component({ items }) {
const processedItems = useMemo(() => {
return items.map(item => ({ ...item, processed: true })); // Creating new
}, [items]);
return <List items={processedItems} />;
}
✅ useMemo is a React hook for:
✅ When to use:
❌ When to avoid:
✅ Best practices:
useMemo is a powerful optimization tool, but it shouldn’t be used mindlessly. First identify real performance issues, then apply useMemo to solve them. 🚀
Want more articles to prepare for interviews? Subscribe to EasyAdvice, bookmark the site and improve yourself every day 💪