useMemo — это хук в React, который позволяет мемоизировать (кэшировать) результат вычислений между рендерами. Он предотвращает повторные вычисления при каждом рендере, если зависимости не изменились.
Синтаксис: const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
Ключевые особенности:
Пример использования:
function ExpensiveCalculation({ number }) {
const expensiveValue = useMemo(() => {
console.log('Вычисление...');
return number * 2;
}, [number]);
return <div>Результат: {expensiveValue}</div>;
}Хук useMemo — один из встроенных хуков React, предназначенный для оптимизации производительности путем мемоизации результатов вычислений. Он помогает избежать повторных тяжелых вычислений при каждом рендере компонента. 🚀
useMemo принимает две функции:
import React, { useMemo } from 'react';
function Component({ a, b }) {
const memoizedValue = useMemo(() => {
// Тяжелые вычисления
return a * b;
}, [a, b]); // Пересчитывается только если a или b изменились
return <div>Результат: {memoizedValue}</div>;
}Когда компонент рендерится:
function FibonacciCalculator({ number }) {
const fibonacci = useMemo(() => {
console.log('Вычисление числа Фибоначчи...');
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}</div>;
}function UserProfile({ user }) {
const userInfo = useMemo(() => ({
name: user.firstName + ' ' + user.lastName,
avatar: user.photoUrl,
isAdmin: user.role === 'admin'
}), [user]);
// userInfo будет стабильным между рендерами
return <UserCard user={userInfo} />;
}function Parent({ items }) {
// Без useMemo объект создается заново при каждом рендере
// const processedItems = items.map(item => ({ ...item, processed: true }));
// С useMemo объект стабилен между рендерами
const processedItems = useMemo(() =>
items.map(item => ({ ...item, processed: true })),
[items]
);
return <Child items={processedItems} />;
}
// В дочернем компоненте можно использовать React.memo
const Child = React.memo(function Child({ items }) {
return (
<ul>
{items.map(item => <li key={item.id}>{item.name}</li>)}
</ul>
);
});✅ Используйте useMemo когда:
function ProductList({ products, searchTerm, category }) {
// Фильтрация и сортировка - дорогие операции
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>
);
}❌ Избегайте useMemo когда:
// ❌ Не стоит использовать useMemo для простых операций
function BadExample({ a, b }) {
const sum = useMemo(() => a + b, [a, b]); // Избыточно!
return <div>{sum}</div>;
}
// ✅ Просто используйте переменную
function GoodExample({ a, b }) {
const sum = a + b; // Просто и эффективно
return <div>{sum}</div>;
}// ❌ Избыточное использование
function Component({ name }) {
const greeting = useMemo(() => `Привет, ${name}!`, [name]);
return <h1>{greeting}</h1>;
}
// ✅ Просто используйте переменную
function Component({ name }) {
const greeting = `Привет, ${name}!`;
return <h1>{greeting}</h1>;
}// ❌ Ошибка: отсутствует зависимость
function Component({ user }) {
const fullName = useMemo(() => {
return user.firstName + ' ' + user.lastName;
}, []); // user не в списке зависимостей!
return <div>{fullName}</div>;
}
// ✅ Правильно: все зависимости указаны
function Component({ user }) {
const fullName = useMemo(() => {
return user.firstName + ' ' + user.lastName;
}, [user]);
return <div>{fullName}</div>;
}// ❌ Ошибка: мутируем объект
function Component({ items }) {
const processedItems = useMemo(() => {
items.forEach(item => item.processed = true); // Мутируем!
return items;
}, [items]);
return <List items={processedItems} />;
}
// ✅ Правильно: создаем новый объект
function Component({ items }) {
const processedItems = useMemo(() => {
return items.map(item => ({ ...item, processed: true })); // Создаем новые
}, [items]);
return <List items={processedItems} />;
}✅ useMemo — это хук React для:
✅ Когда использовать:
❌ Когда избегать:
✅ Лучшие практики:
useMemo — мощный инструмент оптимизации, но его не следует использовать бездумно. Сначала определите реальные проблемы с производительностью, а затем применяйте useMemo для их решения. 🚀
Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪