Жизненный цикл компонента определяет последовательность этапов его создания, обновления и уничтожения. В Vue.js Composition API управление жизненным циклом становится более явным через использование специальных хуков, которые вызываются в определённые моменты существования компонента. Понимание этих хуков позволяет контролировать поведение компонентов, оптимизировать производительность и корректно работать с ресурсами, такими как таймеры, подписки и сторонние библиотеки.
setup()setup вызывается до создания экземпляра
компонента и является центральной точкой для Composition API.
Внутри setup определяются реактивные состояния, вычисляемые
свойства и методы. Важно помнить:
props доступны как первый аргумент.context (второй аргумент) содержит attrs,
slots и emit.setup нельзя напрямую обращаться к
this, так как экземпляр компонента ещё не создан.Пример:
import { ref, computed } from 'vue';
export default {
props: {
initialCount: Number
},
setup(props) {
const count = ref(props.initialCount);
const doubled = computed(() => count.value * 2);
function increment() {
count.value++;
}
return { count, doubled, increment };
}
}
onBeforeMountХук вызывается непосредственно перед монтированием компонента в DOM. На этом этапе:
Пример:
import { onBeforeMount } from 'vue';
setup() {
onBeforeMount(() => {
console.log('Компонент готовится к монтированию');
});
}
onMountedВызывается после монтирования компонента и доступности его DOM-узлов. Используется для:
ref.Пример:
import { onMounted, ref } from 'vue';
setup() {
const element = ref(null);
onMounted(() => {
console.log('Компонент смонтирован');
console.log(element.value); // доступ к DOM-элементу
});
return { element };
}
onBeforeUpdateВызывается перед обновлением компонента в ответ на изменение реактивных данных. Позволяет:
Пример:
import { ref, onBeforeUpdate } from 'vue';
setup() {
const count = ref(0);
onBeforeUpdate(() => {
console.log('Компонент собирается обновиться');
});
return { count };
}
onUpdatedВызывается после обновления компонента и обновления DOM. Используется для:
Пример:
import { ref, onUpdated } from 'vue';
setup() {
const count = ref(0);
onUpdated(() => {
console.log('Компонент обновлён');
});
return { count };
}
onBeforeUnmountХук вызывается перед удалением компонента из DOM. Здесь удобно:
Пример:
import { onBeforeUnmount } from 'vue';
setup() {
onBeforeUnmount(() => {
console.log('Компонент готовится к удалению');
});
}
onUnmountedВызывается после удаления компонента из DOM. Используется для окончательной очистки:
Пример:
import { onUnmounted } from 'vue';
setup() {
const intervalId = setInterval(() => console.log('Тик'), 1000);
onUnmounted(() => {
clearInterval(intervalId);
console.log('Компонент удалён и таймер остановлен');
});
}
Все хуки жизненного цикла тесно связаны с реактивной системой Vue.
Внутри setup реактивные переменные и вычисляемые свойства
могут использоваться совместно с хуками, что позволяет:
В Composition API хуки можно комбинировать для создания сложной логики. Например, инициализация API-запросов при монтировании и очистка ресурсов при размонтировании:
import { ref, onMounted, onUnmounted } from 'vue';
setup() {
const data = ref(null);
const fetchData = async () => {
const response = await fetch('https://api.example.com/data');
data.value = await response.json();
};
onMounted(fetchData);
onUnmounted(() => {
data.value = null;
});
return { data };
}
watchEffectwatchEffect и другие реактивные наблюдатели работают
внутри setup, автоматически реагируя на изменения данных.
Комбинируя их с хуками жизненного цикла, можно строить сложные
реактивные сценарии, гарантируя корректное создание и очистку ресурсов.
Например:
import { ref, watchEffect, onUnmounted } from 'vue';
setup() {
const count = ref(0);
const stopWatch = watchEffect(() => {
console.log(`Текущее значение count: ${count.value}`);
});
onUnmounted(() => {
stopWatch(); // остановка наблюдателя при удалении компонента
});
return { count };
}
Эта система хуков предоставляет полный контроль над каждым этапом существования компонента, делая код более предсказуемым, чистым и управляемым, особенно при работе с асинхронными операциями и сторонними библиотеками.