useMemo
— это хук (hook) в React, предназначенный для оптимизации производительности путем мемоизации (запоминания) вычислений. Он предотвращает повторные дорогостоящие вычисления при каждом рендере, кэшируя результат между рендерами.
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
Где:
Тяжелые вычисления (complex calculations):
const sortedList = useMemo(() => {
return largeList.sort(complexSortFunction);
}, [largeList]);
Оптимизация дочерних компонентов (optimizing child components):
const childProps = useMemo(() => ({ value }), [value]);
return <ChildComponent props={childProps} />;
Создание объектов/массивов (object/array creation):
const config = useMemo(() => ({
color: theme === 'dark' ? '#fff' : '#000',
size: 'large'
}), [theme]);
function UserList({ users, searchQuery }) {
const filteredUsers = useMemo(() => {
return users.filter(user =>
user.name.toLowerCase().includes(searchQuery.toLowerCase())
);
}, [users, searchQuery]);
return <List items={filteredUsers} />;
}
function ChartComponent({ dataPoints }) {
const chartData = useMemo(() => {
return {
min: Math.min(...dataPoints),
max: Math.max(...dataPoints),
avg: dataPoints.reduce((a, b) => a + b) / dataPoints.length
};
}, [dataPoints]);
return <Chart data={chartData} />;
}
Хук | Назначение | Выполняется |
---|---|---|
useMemo |
Мемоизация значений | Во время рендера |
useEffect |
Побочные эффекты | После рендера |
useCallback |
Мемоизация функций | Во время рендера |
Пустой массив зависимостей:
// Плохо: значение никогда не обновится
const value = useMemo(() => compute(a), []);
Избыточное использование:
// Излишне: простое вычисление не требует мемоизации
const sum = useMemo(() => a + b, [a, b]);
Использование для побочных эффектов:
// Неправильно: для эффектов используйте useEffect
useMemo(() => {
console.log('Это эффект!');
}, [value]);
Разделение сложных вычислений:
const partialResult1 = useMemo(() => computePart1(data), [data]);
const partialResult2 = useMemo(() => computePart2(partialResult1), [partialResult1]);
Комбинирование с React.memo:
const memoizedComponent = React.memo(({ data }) => {
const processedData = useMemo(() => process(data), [data]);
return <ExpensiveComponent data={processedData} />;
});
useMemo
— это мощный инструмент оптимизации в React, который следует использовать для:
Главное правило — применять useMemo
осознанно, только там, где есть измеримые проблемы с производительностью, избегая преждевременных оптимизаций. При правильном использовании он может значительно улучшить производительность вашего React-приложения.