Основні хуки Composition API:
| Хук | Коли спрацьовує |
|---|---|
setup (сам <script setup>) |
створення компонента, до рендеру |
onBeforeMount |
перед першим додаванням у DOM |
onMounted |
компонент у DOM - можна працювати з елементами |
onBeforeUpdate / onUpdated |
до й після оновлення DOM через зміну стану |
onBeforeUnmount / onUnmounted |
перед і після видалення компонента |
onActivated / onDeactivated |
для компонентів у <KeepAlive> |
onErrorCaptured |
помилка в дочірньому компоненті |
<script setup>
import { onMounted, onUnmounted, ref } from 'vue';
const width = ref(window.innerWidth);
const onResize = () => (width.value = window.innerWidth);
onMounted(() => window.addEventListener('resize', onResize));
onUnmounted(() => window.removeEventListener('resize', onResize));
</script>
Хуки мають викликатися синхронно в setup - не в setTimeout і не після await. Інакше Vue не знає, до якого компонента їх прив'язати.
Де завантажувати дані:
- прямо в
setup- запит починається якомога раніше, ще до монтування:
const users = ref([]);
fetch('/api/users').then((r) => r.json()).then((data) => (users.value = data));
onMounted- якщо для запиту потрібен DOM (розміри елемента) або код не повинен виконуватися при серверному рендері:onMountedна сервері не викликається;watchзimmediate: trueабоwatchEffect- якщо дані залежать від props чи параметрів маршруту й мають перезавантажуватися при їх зміні. Найчастіший правильний варіант для сторінок.
Типові помилки:
- доступ до DOM у
setupчиonBeforeMount- елементів ще немає, template ref дорівнюєnull; - не прибрати за собою: обробники на
window, таймери, підписки безonUnmounted- витоки пам'яті, особливо в SPA; onUpdatedдля реакції на дані - для цього єwatch;onUpdatedспрацьовує на будь-яке оновлення компонента і легко зациклюється, якщо змінює стан;- гонитва запитів при швидкій зміні параметрів - потрібне скасування попереднього запиту.
Options API має відповідники (mounted, unmounted...), а також created - його роль у Composition API виконує сам setup.