# Vue 3 Composition API: Guida completa alla reattività > Padroneggiare la Vue 3 Composition API con questa guida pratica. ref, reactive, computed, watch e composables per applicazioni Vue performanti. - Published: 2026-01-07 - Updated: 2026-04-06 - Author: SharpSkill - Tags: vue 3, composition api, javascript, frontend, reactivity - Reading time: 12 min --- La Vue 3 Composition API rappresenta un cambiamento radicale nella strutturazione dei componenti Vue. Questo approccio organizza il codice per funzionalità anziché per opzioni, semplificando il riutilizzo della logica e la manutenzione di applicazioni complesse. > **Prerequisiti** > > Questa guida presuppone una conoscenza di base di Vue.js. Gli esempi utilizzano la sintassi ` ``` Per oggetti con più proprietà correlate, `reactive` offre una sintassi più naturale senza la necessità di `.value`. ```javascript // UserProfile.vue ``` La regola generale: utilizzare `ref` per i valori primitivi (string, number, boolean) e `reactive` per gli oggetti strutturati. ## Proprietà calcolate con computed Le proprietà calcolate derivano valori dallo stato reattivo. Vengono messe in cache e ricalcolate solo quando le loro dipendenze cambiano, il che le rende particolarmente performanti. ```javascript // ProductList.vue ``` Le proprietà calcolate possono anche essere scrivibili con un getter e un setter, utili per trasformazioni bidirezionali. ```javascript // FullName.vue ``` ## Watchers con watch e watchEffect I watchers eseguono effetti collaterali in risposta alle modifiche dei dati. Vue 3 offre due approcci: `watch` per un controllo preciso e `watchEffect` per il tracciamento automatico. > **Quando usare watch e quando watchEffect?** > > `watch` offre un controllo preciso sulle dipendenze e fornisce sia il vecchio che il nuovo valore. `watchEffect` risulta più semplice quando tutte le dipendenze reattive utilizzate devono attivare l'effetto. ```javascript // SearchComponent.vue ``` Per osservare oggetti o array annidati, con `watch` è necessaria l'opzione `deep`. ```javascript // DeepWatch.vue ``` ## Creare Composables riutilizzabili I composables sono funzioni che incapsulano logica reattiva riutilizzabile. Questo approccio rappresenta uno dei principali punti di forza della Composition API per la condivisione del codice tra componenti. ```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 } } ``` Questo composable può poi essere utilizzato in modo dichiarativo in qualsiasi componente. ```javascript // UserList.vue ``` Ecco un altro esempio di composable per la gestione dello stato del form con validazione. ```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 } } ``` ## Gestione dei Lifecycle Hooks La Composition API fornisce i lifecycle hooks come funzioni da invocare all'interno di setup. Questi hooks eseguono codice in momenti specifici del ciclo di vita del componente. > **Pulizia fondamentale** > > Gli effetti collaterali (timer, event listener, subscription) vanno sempre ripuliti in `onUnmounted` per evitare perdite di memoria. ```javascript // LifecycleDemo.vue ``` ## Template Refs e accesso al DOM I template refs forniscono accesso diretto agli elementi DOM o alle istanze dei componenti figli. Rimangono utili nei casi in cui la manipolazione diretta è necessaria. ```javascript // InputFocus.vue ``` ## Comunicazione tra componenti padre e figlio con Props ed Emits La Composition API modernizza la dichiarazione di props ed eventi con `defineProps` e `defineEmits`, offrendo una migliore integrazione con TypeScript. ```javascript // ChildComponent.vue ``` ```javascript // ParentComponent.vue ``` ## Provide e Inject per la Dependency Injection Per condividere dati tra componenti distanti senza prop drilling, Vue 3 mette a disposizione `provide` e `inject`. ```javascript // App.vue (or an ancestor component) ``` ```javascript // DeepNestedComponent.vue (anywhere in the tree) ``` ## Conclusione La Vue 3 Composition API offre un approccio potente e flessibile per organizzare il codice delle applicazioni Vue. I concetti chiave da ricordare: - **ref** per i valori primitivi, **reactive** per gli oggetti complessi - **computed** per valori derivati con caching automatico - **watch** e **watchEffect** per effetti collaterali reattivi - **Composables** per estrarre e riutilizzare la logica tra componenti - **Lifecycle hooks funzionali** (`onMounted`, `onUnmounted`, ecc.) - **provide/inject** per la dependency injection senza prop drilling Questo approccio facilita la creazione di applicazioni mantenibili e testabili, offrendo al contempo un'eccellente integrazione con TypeScript. Il passo successivo consiste nell'esplorare pattern avanzati come i composables asincroni e l'integrazione con Pinia per la gestione dello stato globale. --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/it/blog/vue-nuxt/vue-3-composition-api-complete-guide