Хуки жизненного цикла

Узнаём, как «живёт» компонент от создания до удаления, и в какие моменты можно вклиниться через хуки жизненного цикла.

Хук жизненного цикла — функция, которую Vue вызывает в определённый момент жизни компонента: при появлении на странице, обновлении или удалении.

Жизнь компонента

Компонент проходит этапы: его создают, монтируют в DOM, он обновляется при изменении данных и в конце размонтируется, когда исчезает с экрана. Хуки дают возможность выполнить код на каждом этапе.

ХукКогда срабатываетЗачем
onMountedкомпонент вставлен в DOMзапрос к API, доступ к элементу, подписки
onUpdatedпосле перерисовки из-за изменения данныхреакция на обновлённый DOM
onUnmountedкомпонент удалён из DOMочистка: таймеры, слушатели, соединения

onMounted: самый частый хук

В onMounted компонент уже на странице — здесь обычно загружают данные с сервера и обращаются к DOM-элементам:

<script setup>
import { ref, onMounted } from 'vue'

const message = ref('Загрузка...')

onMounted(() => {
  console.log('Компонент появился на странице')
  message.value = 'Готово!'
})
</script>

onUnmounted: уборка за собой

Если в onMounted вы что-то создали (таймер, слушатель события окна), это нужно убрать в onUnmounted — иначе будет утечка памяти и «фантомные» вызовы:

<script setup>
import { ref, onMounted, onUnmounted } from 'vue'

const seconds = ref(0)
let timer

onMounted(() => {
  timer = setInterval(() => { seconds.value++ }, 1000)
})

onUnmounted(() => {
  clearInterval(timer)   // обязательно очистить!
})
</script>

Порядок хуков на JS

Чтобы запомнить последовательность, смоделируем жизненный цикл вызовами в нужном порядке:

const log = [];

function created()    { log.push("created: данные готовы"); }
function mounted()    { log.push("mounted: компонент в DOM"); }
function updated()    { log.push("updated: данные изменились"); }
function unmounted()  { log.push("unmounted: компонент удалён"); }

// типичный жизненный путь
created();
mounted();
updated();            // что-то поменялось
updated();            // и ещё раз
unmounted();

log.forEach((line, i) => console.log(`${i + 1}. ${line}`));

Вывод:

1. created: данные готовы
2. mounted: компонент в DOM
3. updated: данные изменились
4. updated: данные изменились
5. unmounted: компонент удалён

Частая ошибка

Не пытайтесь обратиться к DOM-элементу в самом начале <script setup> — там его ещё нет, элемент появится только к onMounted. И не забывайте очищать ресурсы в onUnmounted: незакрытый setInterval продолжит тикать даже после исчезновения компонента.

Итог

  • Компонент проходит этапы: создание, монтирование, обновления, размонтирование.
  • onMounted — компонент в DOM: здесь запросы к API и доступ к элементам.
  • onUnmounted — очистка таймеров, слушателей и подписок.
  • Что создали в onMounted, то убирайте в onUnmounted.
Проверьте себя
1. В каком хуке лучше всего запрашивать данные с сервера?
AВ самом начале <script setup>, до всех хуков
BВ onMounted — компонент уже вставлен в DOM
CВ onUnmounted — перед удалением
DВ onUpdated — после каждой перерисовки
2. Зачем нужен хук onUnmounted?
AЧтобы загрузить данные при появлении компонента
BЧтобы очистить ресурсы (таймеры, слушатели, подписки), созданные во время жизни компонента
CЧтобы обновить заголовок страницы
DЧтобы зарегистрировать компонент
3. Что будет, если в onMounted создать setInterval и не очистить его в onUnmounted?
AVue очистит его автоматически
BТаймер продолжит работать даже после удаления компонента — утечка и лишние вызовы
CВозникнет ошибка компиляции
DИнтервал сработает только один раз
Поддержать проект