f in x
Composition API vs Options API in Vue 3: guida pratica alla scelta
> cd .. / HUB_EDITORIALE > Visualizza in Inglese
Analisi dei dati e metriche

Composition API vs Options API in Vue 3: guida pratica alla scelta

[2026-06-05] Author: Ing. Calogero Bono

Stai iniziando un nuovo progetto Vue.js 3 e ti trovi di fronte a un bivio: scrivere componenti con la classica Options API o adottare la Composition API? Non sei il primo. Ogni settimana ci capita di discutere con clienti e team di sviluppo su quale strada prendere. La risposta giusta non è "sempre questa" o "mai quella": dipende dal contesto, dalla complessità e dal team. Noi, di Meteora Web, abbiamo costruito decine di applicazioni Vue — da piccoli widget a piattaforme complesse in Laravel + Vue — e abbiamo visto su pelle i vantaggi e i limiti di entrambe le API. In questa guida ti aiutiamo a scegliere con consapevolezza, senza fanatismi.

Capire le differenze fondamentali

Prima di decidere, devi capire cosa cambia davvero tra le due API. Non è solo sintassi: è un cambio di paradigma nel modo di organizzare la logica.

Options API: il classico che funziona

Se hai già usato Vue 2, conosci l'Options API. Definisci un componente come oggetto con proprietà specifiche: data, methods, computed, watch, mounted e via dicendo. Ogni opzione ha il suo posto fisso.

export default {
  data() {
    return {
      count: 0,
      step: 1
    }
  },
  computed: {
    double() {
      return this.count * 2
    }
  },
  methods: {
    increment() {
      this.count += this.step
    }
  }
}

È semplice, prevedibile, e chiunque abbia visto un componente Vue lo capisce subito. Il problema emerge quando il componente cresce. Logiche diverse (es. autenticazione, form validation, chiamate API) finiscono mescolate in mounted e methods, senza una chiara separazione. Lo abbiamo visto in progetti ereditati: un componente di 800 righe con data che conteneva flag di UI, stato utente e notifiche. Un disastro.

Composition API: organizzazione per funzionalità

La Composition API introduce la funzione setup e il concetto di composables. Non sei più vincolato a sezioni fisse: puoi raggruppare la logica per feature, estrarre funzioni riutilizzabili e avere un flusso più simile a JavaScript puro.

import { ref, computed } from 'vue'

export default {
  setup() {
    const count = ref(0)
    const step = 1
    const double = computed(() => count.value * 2)

    function increment() {
      count.value += step
    }

    return { count, double, increment }
  }
}

Nota: count è un oggetto ref, perché Vue deve tracciare le reattività. Con reactive puoi usare oggetti più complessi. L'importante è che ora possiamo spostare queste funzioni in un file esterno, creando un composable.

// useCounter.js
import { ref, computed } from 'vue'

export function useCounter(initialStep = 1) {
  const count = ref(0)
  const step = initialStep
  const double = computed(() => count.value * 2)

  function increment() {
    count.value += step
  }

  return { count, double, increment }
}

E nel componente:

import { useCounter } from './useCounter'

export default {
  setup() {
    const { count, double, increment } = useCounter(2)
    return { count, double, increment }
  }
}

Ora il componente è snello e la logica è testabile e riutilizzabile. Questo è il vero superpotere della Composition API.

Quando scegliere l'Options API

Non demonizziamo l'Options API. In molti scenari è ancora la scelta migliore:

  • Componenti semplici e piccoli (es. un bottone, un input, un badge). Se hai poche righe di logica, l'Options API è più immediata e meno verbosa.
  • Team con poca esperienza Vue o che provengono da Vue 2. La curva di apprendimento è più bassa e il codice è più autoesplicativo.
  • Progetti piccoli o monouso (es. una landing page con un paio di componenti interattivi). L'overhead della Composition API non è giustificato.
  • Quando usi librerie terze che si aspettano Options API (raro, ma possibile).

Noi stessi, in molti progetti interni o con clienti che richiedono manutenibilità immediata, usiamo l'Options API per il 70% dei componenti. La Composition API la riserviamo a logiche complesse o a componenti che devono essere riutilizzati in più contesti.

Quando passare alla Composition API

La Composition API brilla in questi casi:

  • Componenti con logiche miste (es. un form che gestisce validazione, upload file, autocomplete). Con l'Options API finiresti con un groviglio; con la Composition API ogni feature può essere un composable separato.
  • Riuso di logica tra componenti. Invece di mixin (problematici) o slot, usi composables. Ad esempio, un composable useAuth per gestire login stato in tutta l'app.
  • Test unitari. I composables sono pure funzioni JavaScript, testabili senza montare componenti. Noi abbiamo ridotto il tempo di test del 40% passando a composables.
  • Grandi applicazioni con decine di componenti. La Composition API permette di organizzare il codice per dominio, non per tipo di opzione.
  • TypeScript. La Composition API è più facile da tipizzare (inferenza automatica con ref e reactive).

Un esempio concreto: un cliente voleva un componente di dashboard con filtri, grafici e tabella. Con l'Options API avremmo avuto un mostro di 500 righe. Con la Composition API abbiamo creato useFilters, useChartData e useTableState. Ogni composable è stato testato isolatamente e riutilizzato in altre viste. Fatto.

Come migrare gradualmente (senza riscrivi tutto)

Non devi convertire ogni componente. Vue 3 supporta entrambe le API nello stesso progetto. Puoi iniziare a usare la Composition API per i nuovi componenti complessi e lasciare i vecchi in Options API. Nel tempo, quando tocchi un componente per bug o feature, lo puoi refactorizzare.

Ecco un esempio di migrazione di un componente con Options API che usa mounted per caricare dati:

// Options API
import axios from 'axios'
export default {
  data() {
    return { users: [], loading: false }
  },
  mounted() {
    this.loadUsers()
  },
  methods: {
    async loadUsers() {
      this.loading = true
      try {
        const res = await axios.get('/api/users')
        this.users = res.data
      } finally {
        this.loading = false
      }
    }
  }
}

Versione con Composition API:

import { ref, onMounted } from 'vue'
import axios from 'axios'

export default {
  setup() {
    const users = ref([])
    const loading = ref(false)

    async function loadUsers() {
      loading.value = true
      try {
        const res = await axios.get('/api/users')
        users.value = res.data
      } finally {
        loading.value = false
      }
    }

    onMounted(loadUsers)

    return { users, loading }
  }
}

Puoi anche estrarre la logica in un composable useUsers subito o dopo.

Errori comuni e best practices

Abbiamo visto alcuni errori frequenti quando si passa alla Composition API:

  • Perdere la reattività: usare const count = 0 invece di ref(0). Ricorda: Vue non traccia variabili normali.
  • Mischiare stili nello stesso file: evitare di avere metà componente in Options e metà in setup. Scegli una volta e sii coerente.
  • Creare troppi ref per ogni proprietà: a volte un oggetto reactive è più pulito. Esempio: const state = reactive({ count: 0, step: 1 }).
  • Non gestire la cleanup: nei composable che usano watch o onMounted, ricordati di fermare gli effetti con onUnmounted o watchEffect con cleanup.
  • Over-engineering: non creare composable per ogni singola linea di logica. Se un componente ha 3 righe di setup, resta in Options API o in semplici ref.

Una best practice che seguiamo: inizia sempre con Options API, poi estrai in composable solo quando la logica cresce o si ripete. Così eviti astrazioni premature.

In sintesi — cosa fare adesso

  1. Valuta il tuo contesto: componente semplice? Team junior? Progetto piccolo? Usa Options API.
  2. Identifica logiche riutilizzabili: autenticazione, filtri, chiamate API comuni? Scrivi un composable con Composition API.
  3. Non riscrivere tutto: mescola le due API nello stesso progetto finché non è necessario refactorizzare.
  4. Testa i composable in isolamento: sono funzioni pure, approfittane.
  5. Documenta le scelte nel team: stabilisci una convenzione (es. “nuovi componenti con logica > 50 righe usano Composition API”).

Noi di Meteora Web usiamo questa regola pratica: l'Options API va forte per componenti di presentazione, la Composition API per logica di business. Se hai dubbi, parti dall'Options API e rifattorizza quando senti il puzzo di codice che si ripete. Come abbiamo visto anche per i React Hooks, la capacità di estrarre logica in funzioni autonome cambia la manutenibilità di un progetto. Scegli con testa, non con moda.

Sponsored Protocol

Ing. Calogero Bono

> AUTHOR_EXTRACTED

Ing. Calogero Bono

Co-founder di Meteora Web. Ingegnere informatico, sviluppo ecosistemi digitali ad alte prestazioni. AI, automazione, SEO tecnica e infrastrutture web. Scrivo di tecnologia per rendere complesso… semplice.

[ Read Full Dossier ]

Hai bisogno di applicare questa strategia?

Esegui il protocollo di contatto per iniziare un progetto con noi.

> INIZIA_PROGETTO

Sponsored

> MW_JOURNAL

> READ_ALL()