> Кэшируются ли вычисляемые свойства во Vue и как работает мемоизация (Vue.js)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: 1221 Systems
Стек: Vue.js
> Пример ответа
Короткий ответ
Да, вычисляемые свойства (computed properties) во Vue кэшируются. Они пересчитываются только при изменении реактивных зависимостей. Мемоизация во Vue реализована через ленивое вычисление с отслеживанием зависимостей: computed свойство хранит последнее вычисленное значение и возвращает его без повторного вызова функции, пока зависимости не изменятся.
Подробное объяснение
Кэширование computed свойств - ключевое отличие от методов. Когда вы используете computed, Vue создаёт реактивный watcher, который:
- При первом обращении к свойству запускает функцию-геттер и собирает все реактивные зависимости (ref, reactive, другие computed)
- Сохраняет результат в кэш
- При последующих обращениях возвращает кэшированное значение, не вызывая функцию
- Когда любая зависимость изменяется, помечает кэш как "грязный" (dirty)
- При следующем обращении пересчитывает значение и обновляет кэш
Механизм основан на системе реактивности Vue. Каждый computed создаёт внутренний dep (зависимость) и watcher. Watcher подписывается на изменения реактивных данных, используемых в функции. При изменении данных watcher получает уведомление и устанавливает флаг dirty = true. При доступе к свойству проверяется флаг dirty: если true - выполняется пересчёт, если false - возвращается кэш.
Важно: кэширование работает только в рамках одного tick (микротаска). Если computed свойство не используется в шаблоне или другом reactive контексте, оно не будет пересчитываться до момента обращения.
На практике
Кэширование computed критично для производительности в следующих сценариях:
- Фильтрация/сортировка больших массивов данных
- Вычисление агрегированных значений (суммы, средние)
- Трансформация данных с дорогими операциями (форматирование дат, работа с JSON)
- Композиция нескольких реактивных источников
Используйте computed, когда:
- Значение зависит от других реактивных данных
- Вы хотите избежать повторных вычислений при множественных обращениях
- Нужна реактивность без ручного управления
Используйте методы, когда:
- Вычисление не зависит от реактивных данных (чистая функция)
- Нужно выполнить побочный эффект
- Требуется передача аргументов
Пример кода
JAVASCRIPTimport { ref, computed } from 'vue'const items = ref([1, 2, 3, 4, 5])const filterValue = ref(2)// Кэшируется - пересчитывается только при изменении items или filterValueconst filteredItems = computed(() => {console.log('Вычисление filteredItems')return items.value.filter(item => item > filterValue.value)})// Без кэширования - выполняется при каждом обращенииfunction getFilteredItems() {console.log('Вызов getFilteredItems')return items.value.filter(item => item > filterValue.value)}// Первое обращение - вызов функции, кэшированиеconsole.log(filteredItems.value) // 'Вычисление filteredItems', [3,4,5]// Повторное обращение - из кэшаconsole.log(filteredItems.value) // нет лога, [3,4,5]// Изменение зависимостиfilterValue.value = 3// Следующее обращение - пересчётconsole.log(filteredItems.value) // 'Вычисление filteredItems', [4,5]
Как отвечать на собеседовании
Начните с чёткого утверждения: "Да, computed кэшируются". Объясните механизм: ленивое вычисление, отслеживание зависимостей, флаг dirty. Приведите пример, когда кэширование важно (фильтрация списка). Упомяните отличие от методов и watch. Если спросят про глубокую реактивность - объясните, что computed отслеживает изменения на уровне доступа, а не по ссылке.
Что проверяет интервьюер
- Понимание системы реактивности Vue
- Знание разницы между computed, methods и watch
- Умение объяснять внутренние механизмы (dirty flag, dependency tracking)
- Понимание trade-off между кэшированием и актуальностью данных
- Способность применить теорию к практическим сценариям
Типичные ошибки
- Путаница computed и methods: думают, что computed тоже вызывается каждый раз
- Игнорирование ленивости: считают, что computed вычисляется сразу при создании компонента
- Непонимание зависимостей: думают, что computed пересчитывается при любом изменении данных в компоненте
- Использование computed для побочных эффектов (нужен watch)
- Ожидание кэширования при нереактивных зависимостях (обычные переменные, Date.now())
> Похожие задачи по frontend
Как определить тип переменной через ReturnType в TypeScript
Что такое Composition API во Vue и в чем разница с Options API
Какие способы динамического рендера компонентов и директивы используются во Vue
Какие хуки жизненного цикла существуют во Vue и для чего они нужны
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью