Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: useMemo, useCallback, performance, memoization, React

Как понять, достаточно ли сложный кейс, чтобы применить useMemo или useCallback?

Вопрос проверяет понимание условий, при которых использование useMemo и useCallback оправдано, а не является преждевременной оптимизацией.

Короткий ответ

Используйте useMemo и useCallback только когда есть измеримая проблема производительности. Они полезны для предотвращения дорогих перерисовок или повторных вычислений, когда зависимые значения не меняются. Не применяйте их по умолчанию — это может ухудшить производительность из-за накладных расходов на мемоизацию. Оценивайте сложность вычислений и частоту ререндеров.

Длинный ответ

Когда оправдано применение useMemo и useCallback

Эти хуки React предназначены для оптимизации производительности, но их использование должно быть обоснованным. Основное правило: применяйте их только тогда, когда вы наблюдаете реальные проблемы с производительностью, такие как частые ререндеры или дорогие вычисления.

Критерии для использования

  • Дорогие вычисления: если функция внутри useMemo выполняет сложные операции (например, сортировка большого массива, фильтрация тысяч элементов), мемоизация может быть полезна.
  • Стабильные ссылки: useCallback нужен, когда вы передаете колбэк в дочерний компонент, обернутый в React.memo, и хотите избежать его ререндера при неизменных зависимостях.
  • Измеримая выгода: используйте инструменты профилирования (React DevTools Profiler), чтобы убедиться, что мемоизация действительно сокращает время рендеринга.

Пример кода

import React, { useMemo, useCallback, useState } from 'react';

function ExpensiveList({ items, filter }) {
  // Дорогая фильтрация — оправдано useMemo
  const filteredItems = useMemo(() => {
    return items.filter(item => item.name.includes(filter));
  }, [items, filter]);

  // Простое вычисление — useMemo не нужен
  const count = items.length;

  return (
    <ul>
      {filteredItems.map(item => (
        <li key={item.id}>{item.name}</li>
      ))}
    </ul>
  );
}

function Parent() {
  const [count, setCount] = useState(0);
  
  // useCallback для стабильной ссылки
  const handleClick = useCallback(() => {
    setCount(c => c + 1);
  }, []);

  return (
    <div>
      <button onClick={handleClick}>{count}</button>
      <ExpensiveList items={bigArray} filter="test" />
    </div>
  );
}

Когда не стоит применять

  • Для простых вычислений (например, сложение чисел) — накладные расходы на мемоизацию превышают выгоду.
  • Для колбэков, которые передаются в нативные HTML-элементы — они не используют React.memo.
  • Без профилирования — преждевременная оптимизация может усложнить код без реального прироста.

Вывод: используйте useMemo и useCallback только после выявления узких мест производительности с помощью профилировщика. Они полезны для дорогих вычислений и стабильных ссылок в компонентах с React.memo, но не должны применяться по умолчанию.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • JavaScript

    JavaScript

  • React

    React

Ключевые слова

#useMemo

#useCallback

#performance

#memoization

#React

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию