watch и watchEffect
↑ 4.1 Vue 3: основы, компоненты, Composition API · ← Предыдущая · → Следующая
Зачем это на собесе
Когда
watch, когдаwatchEffect, что такоеflushи очистка эффектов.
Объяснение
// watch: явные источники, ленивый по умолчанию, даёт старое и новое значение
watch(userId, async (id, oldId, onCleanup) => {
const ctrl = new AbortController();
onCleanup(() => ctrl.abort()); // отмена предыдущего запроса
user.value = await api.user(id, { signal: ctrl.signal });
}, { immediate: true });
watch([a, b], ([na, nb], [oa, ob]) => {}); // несколько источников
watch(() => state.filter.query, search, { deep: false }); // геттер
watch(state, cb, { deep: true }); // глубокое наблюдение (дорого)
// watchEffect: зависимости отслеживаются автоматически, запускается сразу
watchEffect(() => { document.title = `${count.value} — ${title.value}`; });
watchEffect((onCleanup) => { const t = setInterval(tick, 1000); onCleanup(() => clearInterval(t)); });watch | watchEffect | |
|---|---|---|
| Источники | явные | автоматические (всё прочитанное синхронно) |
| Старое значение | да | нет |
| Первый запуск | нет (immediate: true) | да |
| Когда | нужен контроль, реакция на конкретное изменение | много зависимостей, эффект «синхронизации» |
Опции: immediate, deep, once, flush: "pre" | "post" | "sync" (post — после обновления DOM; watchPostEffect, watchSyncEffect), onWatcherCleanup (3.5).
Остановка: watcher внутри setup останавливается автоматически при размонтировании; созданный асинхронно — вручную (const stop = watch(...), stop()).
Практики: избегайте watch там, где достаточно computed; для загрузки данных при смене параметров лучше Vue Query (кэш, отмена, состояния).
Нюансы и подводные камни
watch(state.field, ...)— источник примитив, не реактивный: используйте геттер() => state.field.- В
watchEffectасинхронные зависимости послеawaitне отслеживаются. deep: trueна больших объектах — дорого.- Изменение отслеживаемого состояния внутри самого watcher вызывает циклы.
- Гонки запросов: применяйте отмену (
onCleanup).
Практика
- Реализуйте поиск при изменении запроса с отменой предыдущего запроса.
- Синхронизируйте
document.titleчерезwatchEffect. - Замените
watchнаcomputedтам, где это возможно.
Вопросы с ответами
Чем
watchотличается отwatchEffect?
watchследит за явными источниками и даёт старое значение,watchEffectавтоматически отслеживает всё прочитанное и запускается сразу.
Зачем
onCleanup?Отменять предыдущие побочные эффекты (запросы, таймеры) перед новым запуском и при остановке.