# Vue 3 Composition API: Повний посібник з реактивності та композиції > Практичний посібник з Vue 3 Composition API. ref, reactive, computed, watch і composables — усе необхідне для створення продуктивних Vue-застосунків. - Published: 2026-01-07 - Updated: 2026-04-06 - Author: SharpSkill - Tags: vue 3, composition api, javascript, frontend, reactivity - Reading time: 12 min --- Composition API у Vue 3 являє собою докорінну зміну в організації компонентів. Код структурується навколо функціональності, а не опцій, що спрощує повторне використання логіки та підтримку складних застосунків. > **Передумови** > > Цей посібник передбачає базове знання Vue.js. У прикладах використовується синтаксис ` ``` Для об'єктів із кількома пов'язаними властивостями `reactive` пропонує природніший синтаксис без необхідності `.value`. ```javascript // UserProfile.vue ``` Загальне правило: `ref` для примітивних значень (string, number, boolean) і `reactive` для структурованих об'єктів. ## Обчислювані властивості з computed Обчислювані властивості (computed) виводять значення з реактивного стану. Вони кешуються і перераховуються лише при зміні залежностей, що забезпечує високу продуктивність. ```javascript // ProductList.vue ``` Обчислювані властивості також можуть бути записуваними завдяки getter і setter — це корисно для двонаправлених перетворень. ```javascript // FullName.vue ``` ## Спостерігачі з watch і watchEffect Спостерігачі (watchers) виконують побічні ефекти у відповідь на зміну даних. Vue 3 пропонує два підходи: `watch` для точного контролю та `watchEffect` для автоматичного відстеження залежностей. > **Коли використовувати watch, а коли watchEffect?** > > `watch` забезпечує точний контроль над залежностями та надає як старе, так і нове значення. `watchEffect` простіший, коли всі використовувані реактивні залежності мають запускати ефект. ```javascript // SearchComponent.vue ``` Для спостереження за вкладеними об'єктами або масивами у `watch` необхідна опція `deep`. ```javascript // DeepWatch.vue ``` ## Створення повторно використовуваних composables Composables — це функції, що інкапсулюють реактивну логіку для повторного використання. Цей підхід є однією з головних переваг Composition API для обміну кодом між компонентами. ```javascript // composables/useFetch.js import { ref, watchEffect, toValue } from 'vue' // Composable for HTTP requests // Automatically handles loading, errors, and refetching export function useFetch(url) { const data = ref(null) const error = ref(null) const isLoading = ref(false) // Reusable fetch function async function fetchData() { isLoading.value = true error.value = null try { // toValue() allows accepting a ref or a value const response = await fetch(toValue(url)) if (!response.ok) { throw new Error(`HTTP ${response.status}`) } data.value = await response.json() } catch (e) { error.value = e.message } finally { isLoading.value = false } } // watchEffect for automatic refetch if url is a ref watchEffect(() => { fetchData() }) // Expose state and methods return { data, error, isLoading, refetch: fetchData } } ``` Створений composable можна декларативно використовувати в будь-якому компоненті. ```javascript // UserList.vue ``` Інший приклад — composable для керування станом форми з валідацією. ```javascript // composables/useForm.js import { reactive, computed } from 'vue' // Form management composable export function useForm(initialValues, validationRules) { // Form state const form = reactive({ values: { ...initialValues }, errors: {}, touched: {} }) // Validate a specific field const validateField = (field) => { const rules = validationRules[field] if (!rules) return true for (const rule of rules) { const result = rule(form.values[field]) if (result !== true) { form.errors[field] = result return false } } form.errors[field] = null return true } // Validate entire form const validate = () => { let isValid = true for (const field in validationRules) { if (!validateField(field)) { isValid = false } } return isValid } // computed: form is valid if no errors const isValid = computed(() => { return Object.values(form.errors).every(e => !e) }) // Mark a field as touched (to display errors) const touch = (field) => { form.touched[field] = true validateField(field) } // Reset the form const reset = () => { form.values = { ...initialValues } form.errors = {} form.touched = {} } return { form, isValid, validate, validateField, touch, reset } } ``` ## Управління хуками життєвого циклу Composition API надає хуки життєвого циклу як функції, що викликаються всередині setup. Вони дозволяють виконувати код у певні моменти існування компонента. > **Важливо: очищення ресурсів** > > Завжди видаляйте побічні ефекти (таймери, слухачі подій, підписки) в `onUnmounted`, щоб уникнути витоків пам'яті. ```javascript // LifecycleDemo.vue ``` ## Template Refs і доступ до DOM Template refs забезпечують прямий доступ до елементів DOM або екземплярів дочірніх компонентів. Вони залишаються корисними, коли потрібна безпосередня маніпуляція. ```javascript // InputFocus.vue ``` ## Комунікація батько-дитина з Props і Emits Composition API модернізує оголошення пропсів і подій через `defineProps` і `defineEmits`, забезпечуючи кращу інтеграцію з TypeScript. ```javascript // ChildComponent.vue ``` ```javascript // ParentComponent.vue ``` ## Provide і Inject для впровадження залежностей Для обміну даними між віддаленими компонентами без прокидання пропсів (prop drilling) Vue 3 пропонує механізм `provide` та `inject`. ```javascript // App.vue (or an ancestor component) ``` ```javascript // DeepNestedComponent.vue (anywhere in the tree) ``` ## Висновок Vue 3 Composition API пропонує потужний і гнучкий підхід до організації коду Vue-застосунків. Ключові концепції: - **ref** для примітивних значень, **reactive** для складних об'єктів - **computed** для похідних значень з автоматичним кешуванням - **watch** і **watchEffect** для реактивних побічних ефектів - **Composables** для виділення та повторного використання логіки між компонентами - **Функційні хуки життєвого циклу** (`onMounted`, `onUnmounted` тощо) - **provide/inject** для впровадження залежностей без prop drilling Такий підхід полегшує створення застосунків, які легко підтримувати та тестувати, водночас забезпечуючи відмінну інтеграцію з TypeScript. Наступний крок — вивчення просунутих патернів, таких як асинхронні composables та інтеграція з Pinia для глобального управління станом. --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/uk/blog/vue-nuxt/vue-3-composition-api-complete-guide