# Vue 3 Composition API: Volledige gids voor reactiviteit > De Vue 3 Composition API in de praktijk: ref, reactive, computed, watch en composables voor performante Vue-applicaties. - Published: 2026-01-07 - Updated: 2026-04-06 - Author: SharpSkill - Tags: vue 3, composition api, javascript, frontend, reactivity - Reading time: 12 min --- De Vue 3 Composition API markeert een fundamentele verschuiving in de manier waarop Vue-componenten worden gestructureerd. Deze aanpak organiseert code per functionaliteit in plaats van per optie, waardoor het hergebruik van logica en het onderhoud van complexe applicaties aanzienlijk eenvoudiger wordt. > **Vereisten** > > Deze gids gaat uit van basiskennis van Vue.js. Alle voorbeelden gebruiken de ` ``` Voor objecten met meerdere samenhangende eigenschappen biedt `reactive` een natuurlijkere syntax zonder dat `.value` nodig is. ```javascript // UserProfile.vue ``` De vuistregel: gebruik `ref` voor primitieve waarden (string, number, boolean) en `reactive` voor gestructureerde objecten. ## Berekende eigenschappen met computed Berekende eigenschappen leiden waarden af uit de reactieve state. Ze worden gecacht en alleen herberekend wanneer hun afhankelijkheden veranderen, wat ze bijzonder performant maakt. ```javascript // ProductList.vue ``` Berekende eigenschappen kunnen ook schrijfbaar zijn met een getter en setter, handig voor bidirectionele transformaties. ```javascript // FullName.vue ``` ## Watchers met watch en watchEffect Watchers voeren bijeffecten uit als reactie op datawijzigingen. Vue 3 biedt twee benaderingen: `watch` voor nauwkeurige controle en `watchEffect` voor automatische tracking. > **Wanneer watch en wanneer watchEffect gebruiken?** > > `watch` biedt nauwkeurige controle over afhankelijkheden en levert zowel de oude als de nieuwe waarde. `watchEffect` is eenvoudiger wanneer alle gebruikte reactieve afhankelijkheden het effect moeten triggeren. ```javascript // SearchComponent.vue ``` Om geneste objecten of arrays te observeren, is bij `watch` de optie `deep` noodzakelijk. ```javascript // DeepWatch.vue ``` ## Herbruikbare Composables maken Composables zijn functies die herbruikbare reactieve logica inkapselen. Deze aanpak is een van de grootste troeven van de Composition API voor het delen van code tussen componenten. ```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 } } ``` Dit composable kan vervolgens declaratief in elk willekeurig component worden gebruikt. ```javascript // UserList.vue ``` Hieonder volgt nog een voorbeeld van een composable voor formulierbeheer met validatie. ```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 } } ``` ## Lifecycle Hooks beheren De Composition API biedt lifecycle hooks als functies die binnen setup worden aangeroepen. Deze hooks voeren code uit op specifieke momenten in de levenscyclus van het component. > **Opruimen is essentieel** > > Bijeffecten (timers, event listeners, subscriptions) moeten altijd worden opgeruimd in `onUnmounted` om geheugenlekken te voorkomen. ```javascript // LifecycleDemo.vue ``` ## Template Refs en DOM-toegang Template refs bieden directe toegang tot DOM-elementen of instanties van child-componenten. Dit blijft nuttig voor gevallen waarin directe manipulatie noodzakelijk is. ```javascript // InputFocus.vue ``` ## Communicatie tussen ouder- en kindcomponenten met Props en Emits De Composition API moderniseert de declaratie van props en events met `defineProps` en `defineEmits`, met een verbeterde TypeScript-integratie. ```javascript // ChildComponent.vue ``` ```javascript // ParentComponent.vue ``` ## Provide en Inject voor Dependency Injection Om data te delen tussen verafgelegen componenten zonder prop drilling biedt Vue 3 `provide` en `inject` aan. ```javascript // App.vue (or an ancestor component) ``` ```javascript // DeepNestedComponent.vue (anywhere in the tree) ``` ## Conclusie De Vue 3 Composition API biedt een krachtige en flexibele aanpak voor het organiseren van code in Vue-applicaties. De belangrijkste concepten op een rij: - **ref** voor primitieve waarden, **reactive** voor complexe objecten - **computed** voor afgeleide waarden met automatische caching - **watch** en **watchEffect** voor reactieve bijeffecten - **Composables** om logica te extraheren en hergebruiken tussen componenten - **Functionele lifecycle hooks** (`onMounted`, `onUnmounted`, etc.) - **provide/inject** voor dependency injection zonder prop drilling Deze aanpak vergemakkelijkt het bouwen van onderhoudbare en testbare applicaties en biedt tegelijkertijd een uitstekende TypeScript-integratie. De volgende stap is het verkennen van geavanceerde patterns zoals asynchrone composables en de integratie met Pinia voor globaal state management. --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/nl/blog/vue-nuxt/vue-3-composition-api-complete-guide