computed
↑ 4.1 Vue 3: основы, компоненты, Composition API · ← Предыдущая · → Следующая
Зачем это на собесе
Кэширование и ленивость
computed, отличие от методов иwatch.
Объяснение
computed — производное значение: пересчитывается лениво и кэшируется, пока не изменятся зависимости.
const items = ref<Item[]>([]);
const query = ref("");
const filtered = computed(() => items.value.filter(i => i.name.includes(query.value)));
const total = computed(() => filtered.value.reduce((s, i) => s + i.price, 0));
// Writable computed
const fullName = computed({
get: () => `${first.value} ${last.value}`,
set: (v: string) => { [first.value, last.value] = v.split(" "); },
});computed | Метод в шаблоне | watch | |
|---|---|---|---|
| Кэш | да | нет (вызывается при каждом рендере) | — |
| Возвращает значение | да | да | нет (побочные эффекты) |
| Зависимости | автоматически | — | явные |
| Побочные эффекты | нет (должна быть чистой) | возможны | для эффектов |
Правила:
- Функция должна быть чистой: без мутаций, запросов, DOM.
- Возврат нового массива/объекта при каждом вычислении допустим;
computedпересчитывается только при смене зависимостей. - Vue 3.4+:
computedне запускает эффекты, если значение не изменилось (поObject.is). - Доступ к предыдущему значению:
computed((prev) => ...).
Цепочки computed образуют граф зависимостей; пересчёт происходит только запрошенных узлов.
Нюансы и подводные камни
- Побочные эффекты в
computedломают предсказуемость. - Изменение массива методом, не отслеживаемым (например, мутация вне Vue) не приведёт к пересчёту.
- Асинхронная логика в
computedне поддерживается: используйтеwatch,watchEffectили Vue Query. - Дорогое вычисление на большой коллекции: разделяйте на несколько
computed. computedне выполняется, пока не прочитан.
Практика
- Замените метод
filteredItems()в шаблоне наcomputedи измерьте число вычислений. - Реализуйте writable computed для полного имени.
- Постройте цепочку computed: фильтр → сортировка → страница.
Вопросы с ответами
Чем
computedотличается от метода?
computedкэшируется и пересчитывается только при смене зависимостей, метод выполняется при каждом рендере.
Можно ли делать запросы в
computed?Нет: она должна быть чистой; эффекты выносите в
watch/watchEffect.