Capitolo 7 di 11

Tutorial VueJS 3: le proprietà calcolate con computed

verificato il 2 Settembre 2026 · 4 min

Risposta rapida

computed() dichiara un valore derivato da altri valori. Vue mette il risultato in cache e lo ricalcola solo se una dipendenza cambia, a differenza di una funzione chiamata dal template, che viene eseguita a ogni rendering. Una proprietà calcolata deve essere pura: legge e restituisce, senza effetti collaterali.

Alla fine di questo capitolo, saprai dedurre un valore dallo stato invece di tenerlo aggiornato a mano.

Una proprietà calcolata è un valore derivato da altri valori. Vue la ricalcola quando una delle sue dipendenze cambia, e solo in quel momento. È lo strumento che tiene la logica fuori dal template.

Un primo calcolo

La scheda deve mostrare la marca e il prodotto. Si potrebbe fare nel template:

html
<h1>{{ brand + ' ' + product }}</h1>

Funziona, ma la logica si sparpaglia nell’HTML. Meglio dichiarare una proprietà calcolata:

src/App.vue
<script setup>
import { computed, ref } from 'vue'

const product = ref('T-Shirt')
const brand = ref('Gekkode')

const title = computed(() => `${brand.value} ${product.value}`)
</script>

<template>
  <h1>{{ title }}</h1>
</template>

computed riceve una funzione e restituisce un riferimento in sola lettura. Nello script si legge title.value, nel template {{ title }}, come per un ref.

La cache

È la vera differenza rispetto a una funzione qualunque. Una proprietà calcolata conserva il proprio risultato e lo ricalcola solo se una delle sue dipendenze è cambiata.

html
<!-- appelée à chaque rendu, même si rien n’a changé -->
<p>{{ calculerTitre() }}</p>

<!-- calculée une fois, puis relue depuis le cache -->
<p>{{ title }}</p>

Su una concatenazione la differenza è nulla. Su un ordinamento o un filtro applicato a diverse centinaia di voci, e mostrato in tre punti della pagina, diventa netta.

Pilotare la variante selezionata

Passiamo a un caso utile. Ora ogni variante ha la propria quantità in stock:

src/App.vue
<script setup>
const variants = ref([
  { id: 2234, color: '#2563eb', image: '/images/t-shirt-bleu.svg', quantity: 20 },
  { id: 2235, color: '#dc2626', image: '/images/t-shirt-rouge.svg', quantity: 0 }
])
</script>

Il blu è disponibile, il rosso no. L’immagine mostrata e la disponibilità dipendono ora entrambe dalla variante sotto il cursore. Invece di tenere aggiornate due variabili a mano, conserviamo una sola informazione: quale variante è selezionata.

src/App.vue
<script setup>
const selectedVariant = ref(0)

function updateVariant(index) {
  selectedVariant.value = index
}
</script>

Il ciclo passa l’indice, recuperato come al capitolo 4:

src/App.vue
<div
  v-for="(variant, index) in variants"
  :key="variant.id"
  class="color-circle"
  :style="{ backgroundColor: variant.color }"
  @mouseover="updateVariant(index)"
></div>

Il resto si deduce. image e inStock non sono più dati, ma calcoli:

src/App.vue
<script setup>
const image = computed(() => variants.value[selectedVariant.value].image)
const inStock = computed(() => variants.value[selectedVariant.value].quantity > 0)
</script>

Passa il cursore sul pallino rosso: l’immagine cambia, il messaggio diventa «En rupture» e il bottone si spegne grazie al binding di classe. È cambiata una sola variabile, i tre elementi l’hanno seguita.

Restituisci un booleano, non un numero

Scrivere computed(() => variants.value[selectedVariant.value].quantity) sembra funzionare: una quantità di 0 è falsa, una quantità di 20 è vera. Ma allora inStock vale 20, e se un giorno lo mostri con {{ inStock }} la pagina scriverà «20». Confronta esplicitamente con > 0.

Quando usare una proprietà calcolata

  • Per un valore derivato dallo stato: totale di un carrello, lista filtrata, testo assemblato. È il caso normale.
  • Non per un effetto collaterale. Una proprietà calcolata deve essere una funzione pura: legge e restituisce. Non modifica niente, non chiama API, non fa partire richieste. Per quello ci sono watch e watchEffect.
  • Non per un valore che cambia da solo, come l’ora corrente: niente avviserebbe Vue che deve ricalcolare.

Una proprietà calcolata in scrittura

Per impostazione predefinita una proprietà calcolata è in sola lettura. Vue avvisa in console se provi ad assegnarle un valore. Per i casi in cui la scrittura ha senso, fornisci una coppia get / set:

javascript
const nomComplet = computed({
  get: () => `${prenom.value} ${nom.value}`,
  set: (valeur) => {
    [prenom.value, nom.value] = valeur.split(' ')
  }
})
Con la Options API

Le proprietà calcolate vivono nell’opzione computed e leggono lo stato tramite this: computed: { title() { return this.brand + ' ' + this.product } }. Il principio della cache è lo stesso.

EsercizioAggiungi una proprietà calcolata resume che restituisca «Gekkode T-Shirt, blu, disponibile» a partire dalla variante selezionata. Poi verifica con un console.log dentro la funzione che non viene ricalcolata a ogni rendering.

Errori frequenti

Restituire un numero invece di un booleano Una quantità di 0 è falsa e una quantità di 20 è vera, quindi il codice sembra funzionare. Ma mostrando il valore comparirebbe «20». Confronta esplicitamente: quantity > 0.
Mettere un effetto collaterale in una proprietà calcolata Una chiamata di rete o una modifica di stato scatterebbero in modo imprevedibile. Usa watch o watchEffect.
Assegnare un valore a una proprietà calcolata Di default è in sola lettura, Vue avvisa in console. Fornisci una coppia get/set se la scrittura ha senso.
Newsletter

I nuovi test, tutorial e progetti, via e-mail.

Test riproducibili, codice versionato, risultati datati. Mai spam.