# Vue 3 Composition API: Kompletny przewodnik po reaktywności i kompozycji > Praktyczny przewodnik po Vue 3 Composition API. Ref, reactive, computed, watch i composables — wszystko, czego potrzeba do budowania wydajnych aplikacji 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 w Vue 3 to fundamentalna zmiana w sposobie budowania komponentów. Kod organizowany jest wokół funkcjonalności, a nie opcji, co ułatwia ponowne wykorzystanie logiki i utrzymanie złożonych aplikacji. > **Wymagania wstępne** > > Przewodnik zakłada podstawową znajomość Vue.js. Przykłady wykorzystują składnię ` ``` Dla obiektów z wieloma powiązanymi właściwościami `reactive` oferuje bardziej naturalną składnię bez konieczności stosowania `.value`. ```javascript // UserProfile.vue ``` Ogólna zasada: `ref` dla wartości prostych (string, number, boolean) i `reactive` dla obiektów strukturalnych. ## Właściwości obliczane z computed Właściwości obliczane (computed) wyprowadzają wartości ze stanu reaktywnego. Są cachowane i przeliczane tylko wtedy, gdy zmienią się ich zależności, co zapewnia wysoką wydajność. ```javascript // ProductList.vue ``` Właściwości obliczane mogą być również zapisywalne dzięki getterowi i setterowi — przydatne przy dwukierunkowych transformacjach. ```javascript // FullName.vue ``` ## Obserwatory z watch i watchEffect Obserwatory (watchers) wykonują efekty uboczne w odpowiedzi na zmiany danych. Vue 3 oferuje dwa podejścia: `watch` zapewniający precyzyjną kontrolę i `watchEffect` z automatycznym śledzeniem zależności. > **Kiedy użyć watch, a kiedy watchEffect?** > > `watch` daje precyzyjną kontrolę nad zależnościami i udostępnia zarówno starą, jak i nową wartość. `watchEffect` jest prostszy, gdy wszystkie użyte zależności reaktywne powinny wyzwalać efekt. ```javascript // SearchComponent.vue ``` Aby obserwować zagnieżdżone obiekty lub tablice, opcja `deep` jest niezbędna w przypadku `watch`. ```javascript // DeepWatch.vue ``` ## Tworzenie kompozycji wielokrotnego użytku (composables) Composables to funkcje enkapsulujące reaktywną logikę wielokrotnego użytku. To jedno z największych atutów Composition API — współdzielenie kodu między komponentami staje się naturalne. ```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 } } ``` Tak stworzony composable można deklaratywnie wykorzystać w dowolnym komponencie. ```javascript // UserList.vue ``` Kolejny przykład to composable do zarządzania stanem formularza z walidacją. ```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 } } ``` ## Zarządzanie hookami cyklu życia Composition API udostępnia hooki cyklu życia jako funkcje wywoływane w setup. Umożliwiają one wykonywanie kodu w określonych momentach istnienia komponentu. > **Ważne: sprzątanie zasobów** > > Należy zawsze usuwać efekty uboczne (timery, listenery zdarzeń, subskrypcje) w `onUnmounted`, aby uniknąć wycieków pamięci. ```javascript // LifecycleDemo.vue ``` ## Template Refs i dostęp do DOM Template refs zapewniają bezpośredni dostęp do elementów DOM lub instancji komponentów potomnych. Pozostają przydatne w sytuacjach wymagających bezpośredniej manipulacji. ```javascript // InputFocus.vue ``` ## Komunikacja rodzic-dziecko z Props i Emits Composition API modernizuje deklarowanie propsów i zdarzeń za pomocą `defineProps` i `defineEmits`, oferując lepszą integrację z TypeScriptem. ```javascript // ChildComponent.vue ``` ```javascript // ParentComponent.vue ``` ## Provide i Inject — wstrzykiwanie zależności Aby współdzielić dane między odległymi komponentami bez przekazywania propsów przez kolejne warstwy (prop drilling), Vue 3 oferuje mechanizm `provide` i `inject`. ```javascript // App.vue (or an ancestor component) ``` ```javascript // DeepNestedComponent.vue (anywhere in the tree) ``` ## Podsumowanie Vue 3 Composition API oferuje wydajne i elastyczne podejście do organizacji kodu aplikacji Vue. Najważniejsze zagadnienia: - **ref** dla wartości prostych, **reactive** dla złożonych obiektów - **computed** dla wartości pochodnych z automatycznym cachowaniem - **watch** i **watchEffect** dla reaktywnych efektów ubocznych - **Composables** do ekstrakcji i ponownego wykorzystania logiki między komponentami - **Funkcyjne hooki cyklu życia** (`onMounted`, `onUnmounted` itd.) - **provide/inject** do wstrzykiwania zależności bez prop drillingu Takie podejście ułatwia tworzenie łatwych w utrzymaniu i testowalnych aplikacji, oferując jednocześnie doskonałą integrację z TypeScriptem. Kolejnym krokiem może być eksploracja zaawansowanych wzorców, takich jak asynchroniczne composables i integracja z Pinią do zarządzania globalnym stanem. --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/pl/blog/vue-nuxt/vue-3-composition-api-complete-guide