Capitolo 6 di 11

Tutorial VueJS 3 – classi e stili dinamici con v-bind

verificato il 2 Settembre 2026 · 4 min

Risposta rapida

:class accetta un oggetto in cui le chiavi sono nomi di classi e i valori delle condizioni, :style accetta un oggetto di proprietà CSS scritte in camel case. L'attributo class statico e :class dinamico convivono: Vue li fonde.

Alla fine di questo capitolo, saprai riflettere lo stato dell'applicazione nel suo aspetto, senza toccare il DOM.

class e style sono due attributi particolari: oltre alle stringhe, v-bind ci accetta oggetti e array. È quello che permette di riflettere lo stato dell’applicazione nel suo aspetto senza manipolare il DOM a mano.

Pallini colorati

Sostituiamo le parole «Bleu» e «Rouge» con pallini del colore vero. Memorizza prima un codice esadecimale invece di un nome:

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

Poi lega il colore di sfondo:

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

Compaiono due pallini rotondi, uno blu e uno rosso, e il passaggio del mouse continua a cambiare l’immagine.

Camel case o kebab case

L’oggetto passato a :style è un oggetto JavaScript. I nomi delle proprietà CSS si scrivono quindi in camel case:

html
<div :style="{ backgroundColor: variant.color }"></div>

Scrivere background-color senza virgolette verrebbe interpretato come una sottrazione. Il kebab case resta possibile tra virgolette:

html
<div :style="{ 'background-color': variant.color }"></div>

Le due forme danno lo stesso risultato. Scegline una e restaci fedele.

Portare lo stile fuori dal template

Quando le proprietà si moltiplicano, il template diventa illeggibile. Dichiara l’oggetto nello script:

src/App.vue
<script setup>
const styleTitre = ref({
  color: '#111827',
  fontSize: '28px',
  fontWeight: '700'
})
</script>

<template>
  <h1 :style="styleTitre">{{ product }}</h1>
</template>

Un array permette di combinare più oggetti, e gli ultimi hanno la meglio sui primi:

html
<div :style="[styleBase, styleSurcharge]"></div>

Legare una classe

Passiamo al pulsante. Quando il prodotto è esaurito, deve essere allo stesso tempo inattivo e visibilmente inattivo.

Comincia dall’attributo disabled, legato come nel capitolo 2:

src/App.vue
<button class="button" :disabled="!inStock" @click="addToCart">
  Ajouter au panier
</button>

Il pulsante non risponde più al clic, ma niente lo fa vedere. Aggiungi la classe grigia, condizionata allo stesso modo:

src/App.vue
<button
  class="button"
  :class="{ disabledButton: !inStock }"
  :disabled="!inStock"
  @click="addToCart"
>
  Ajouter au panier
</button>

Nell’oggetto passato a :class, la chiave è il nome della classe e il valore è la condizione. Quando !inStock è vero, la classe disabledButton viene aggiunta, altrimenti viene tolta.

class e :class convivono

Il pulsante porta sia class="button" sia :class="{ … }". Vue non li mette in concorrenza: li fonde.

html
<!-- écrit dans le gabarit -->
<button class="button" :class="{ disabledButton: true }">

<!-- rendu dans la page -->
<button class="button disabledButton">

Tieni le classi fisse in class e quelle condizionali in :class.

Più classi condizionali

L’oggetto accetta tutte le voci che ti servono:

html
<div :class="{ actif: estActif, 'en-erreur': aUneErreur, masque: !visible }"></div>

Un nome di classe che contiene un trattino va messo tra virgolette, per lo stesso motivo del kebab case negli stili.

Scegliere tra due classi

L’oggetto aggiunge o toglie una classe. Per alternare due classi, usa un ternario dentro un array:

html
<div :class="[inStock ? 'enStock' : 'enRupture']"></div>

L’array accetta anche un misto di stringhe e di oggetti:

html
<div :class="['color-circle', { selectionne: index === selectedVariant }]"></div>

Dove mettere il CSS

Un componente single-file può portare il proprio stile, isolato dall’attributo scoped:

src/App.vue
<style scoped>
.color-circle {
  width: 50px;
  height: 50px;
  border-radius: 50%;
  cursor: pointer;
}
</style>

Queste classi possono anche essere animate: è l’argomento del capitolo sulle transizioni.

Con scoped, queste regole si applicano solo agli elementi di questo componente: Vue aggiunge un attributo unico ai tag e lo riprende nel selettore. È così che una classe .button definita in un componente non va a ridipingerne un altro.

Con la Options API

Nel template non cambia niente. L’oggetto di stile andrebbe dichiarato in data(), o meglio in computed se dipende da qualcos’altro.

EsercizioAggiungi una classe selectionnee sul pallino di colore attivo, con un bordo più spesso. Ti serviranno l'indice del ciclo e la variante selezionata.

Errori frequenti

background-color senza virgolette Nell'oggetto passato a :style il trattino viene letto come una sottrazione. Scrivi backgroundColor, oppure 'background-color' tra virgolette.
Credere che :class sovrascriva class I due attributi vengono fusi. Tieni le classi fisse in class e quelle condizionali in :class.
Un nome di classe con un trattino senza virgolette { en-erreur: vrai } non è valido in JavaScript: serve { 'en-erreur': vrai }.
Newsletter

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

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