Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: useMemo, dependencies, React, optimization, object destructuring

Как передать примитивные значения из объекта в массив зависимостей useMemo вместо ссылки на объект?

Вопрос проверяет понимание оптимизации useMemo в React и правил передачи зависимостей для предотвращения лишних пересчетов.

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

Вместо передачи объекта целиком, нужно передавать его примитивные свойства по отдельности. Например, вместо useMemo(() => fn(obj), [obj]) используйте useMemo(() => fn(obj.a, obj.b), [obj.a, obj.b]). Это гарантирует, что useMemo пересчитает значение только при изменении конкретных примитивов, а не при создании нового объекта с теми же значениями.

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

Проблема передачи объекта в зависимости

Когда вы передаете объект в массив зависимостей useMemo, React сравнивает ссылки на объекты. Если объект создается заново при каждом рендере (даже с теми же значениями полей), useMemo будет пересчитывать значение каждый раз, что сводит на нет оптимизацию.

Решение: передача примитивов

Вместо объекта передавайте его примитивные свойства по отдельности. Это позволяет React сравнивать значения, а не ссылки.

// Плохо: объект создается заново каждый рендер
const obj = { a: 1, b: 2 };
const result = useMemo(() => compute(obj), [obj]);

// Хорошо: передаем примитивы
const result = useMemo(() => compute(obj.a, obj.b), [obj.a, obj.b]);

Практический пример

Рассмотрим компонент, который фильтрует список на основе параметров:

function FilteredList({ filters }) {
  // Плохо: filters - объект, может быть новой ссылкой
  const filtered = useMemo(() => {
    return items.filter(item => item.price > filters.minPrice);
  }, [filters]);

  // Хорошо: передаем только нужные примитивы
  const filtered = useMemo(() => {
    return items.filter(item => item.price > filters.minPrice);
  }, [filters.minPrice]);
}

Когда это полезно

Этот подход особенно важен при работе с пропсами-объектами от родительских компонентов, контекстом или результатами других хуков. Он предотвращает ненужные пересчеты и улучшает производительность.

Вывод: Передавайте в зависимости useMemo только примитивные значения, которые действительно влияют на результат. Это делает код более предсказуемым и эффективным, особенно в компонентах с частыми ререндерами.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • React

    React

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

#useMemo

#dependencies

#React

#optimization

#object destructuring

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

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

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

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