Эффекты
computed()
Принимает на вход функцию, вычисляющую что-либо на основе реактывных данных и возвращает вычисляемую ref ссылку на результат. В случае изменения реактивных данных, учавствовавших в вычислениях, функция будет вызвана повторно и обновит вычесленый результа.
записываемая computed ссылка
На вход computed() можно передать две функции get
и set
watchEffect()
Функция watchEffect() немедленно запускает переданную в нее функцию, запоминает все реактивные объекты исппользовавшиеся по вызове, и при измененнии любого из этих объектов опять запускает исходную функцию.
watch()
Функция watch
во многом похожа на watchEffect
но есть несколько отличий:
watch
ленив по умолчанию. Первый вызов обработчика происходит не в момент его установки, а лишь при ппервом изменении данных.watch
позволяет контролировать на какие изменения стоит реагироватьwatch
получает старое и новое значение наблюдаемых переменных.
Наблюдение за ref-ссылкой
Наблюдение за геттер-функцией
Для наблюдение за реактивными данными, необходимо обернуть эти данные в геттер-функцию и наблюдать за ней.
Глубокое наблюдение за реактывным объектом
Можно установить параметр deep: true
для глубокого наблюдения.
Однако в таком случае невозможно получить старое значение переменных. Для полноценного отслеживания глубоко вложенных объектов или массивов, может потребоваться создавать глубокую копию значений.
Отслеживание нескольких переменных
При одновременном изменении обоих наблюдаемых источников в одной и той же функции, наблюдатель будет вызван только один раз.
Если необходимо два раза вызвать обработчик, то можно использовать flush: 'sync'
, но это не рекомендуется.
Можно вызвать nextTick, после первого изменения чтобы дожидаться срабатывания наблюдателя.
Остановка отслеживания (watchEffect(), watch())
При использовании watchEffect
и watch
внутри script setup или во время хуков жизненного цикла, они будет автоматически останавливаться при размонтировании компонента.
Так же можно вручную остановить отслеживане:
Аннулирование побочных эффектов (watchEffect(), watch())
Отслеживаемое состояние может повторно измениться во время работы watchEffect
или watch
(в случае асинхронной обработки эффекта) и выполнение эффекта должно быть прервано и запущено повторно. Так же выполнение эффекта может быть прервано при размонтировании компонента или вызове метода stop()
.
В ряде случаев необходимо выполнить дополнительные действия при прерывании работы. В таких случаев функция эффекта принимает функцию onInvalidate, которую надо вызвать внутри функции эффекта и установить обработчик прерывания. Это необходимо сделать до разрешения Promise.
Отладка эффектов (computed(), watchEffect(), watch() )
Для отладки эффектов в режиме разработки можно передать дополнительный аргумент с опциями onTrack
и onTrigger
:
onTrack
вызывается, когда реактивное свойство или ссылка отслеживается как зависимость.onTrigger
вызывается, когда коллбэк наблюдателя буд ет вызван изменением зависимости.
Оба коллбэка получают debugger-событие с информацией о зависимости. Рекомендуется указывать в этих коллбэках оператор debugger для интерактивной проверки зависимости:
Свойство flush (watchEffect(), watch())
Свойство flush определяет, когда запускается эффект: до, после или во время повторного рендеринга страницы.
pre
- функция обработчик вызываются ДО обновления дерева DOM (по умолчанию).post
- функция обработчик вызываются ПОСЛЕ обновления дерева DOM. Данное поведение полезно при работе со ссылками на элемента шаблонаsync
- принудительно заставит эффект всегда срабатывать синхронно. Однако такое поведение неэффективно и должно использоваться только в крайних случаях.
watchPostEffect и watchSyncEffect
Псевдонимы для watchEffect
c предустановленными значениями flush