Жизненный цикл компонента

↑ 4.1 Vue 3: основы, компоненты, Composition API · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Порядок хуков и что можно делать в каждом; связь с родителем и потомками.

Объяснение

Хук (Composition)OptionsКогдаТипичное использование
setup()beforeCreate/createdсоздание компонентаобъявление состояния, watchers
onBeforeMountbeforeMountперед первым рендеромредко
onMountedmountedпосле вставки в DOMдоступ к DOM, подписки, запросы, инициализация библиотек
onBeforeUpdatebeforeUpdateперед обновлением DOMчтение DOM до изменений
onUpdatedupdatedпосле обновления DOMдоступ к обновлённому DOM (осторожно с циклами)
onBeforeUnmountbeforeUnmountперед удалениемподготовка
onUnmountedunmountedпосле удаленияочистка таймеров, слушателей, подписок
onErrorCapturederrorCapturedошибка в потомкеперехват ошибок
onActivated/onDeactivatedactivated/deactivatedв KeepAliveобновление данных при показе
onRenderTracked/Triggeredотладка
onServerPrefetchSSRзагрузка данных на сервере

Порядок для родителя и потомка:

Создание:   parent setup → parent beforeMount → child setup → child beforeMount → child mounted → parent mounted
Обновление: parent beforeUpdate → child beforeUpdate → child updated → parent updated
Удаление:   parent beforeUnmount → child beforeUnmount → child unmounted → parent unmounted
<script setup>
const el = useTemplateRef("chart");
let chart;
onMounted(() => { chart = new Chart(el.value, options); });
onUnmounted(() => chart?.destroy());
</script>

Хуки можно вызывать только синхронно внутри setup (в composable, вызванном из setup). Composable, использующий хуки, должен вызываться в контексте компонента.

Запросы: в setup/onMounted (клиент); для SSR — onServerPrefetch/useAsyncData (Nuxt).

Нюансы и подводные камни

  • mounted потомков вызываются до родительского.
  • DOM доступен только после onMounted; после изменения данных — после nextTick.
  • Забытая очистка в onUnmounted — утечки.
  • Изменение состояния в onUpdated вызывает бесконечные циклы.
  • Хуки после await в setup теряют контекст (используйте withAsyncContext/<script setup> с top-level await корректно).

Практика

  1. Залогируйте порядок хуков родителя и двух потомков.
  2. Инициализируйте и уничтожьте сторонний график в onMounted/onUnmounted.
  3. Обновляйте данные при возврате в KeepAlive.

Вопросы с ответами

Связанные темы