Passa al contenuto

La Sintassi del Template

Vue utilizza una sintassi di template basata su HTML che ti permette in maniera dichiarativa di legare il DOM renderizzato con i dati dell'istanza del componente sottostante. Tutti i template Vue sono HTML sintatticamente valido che possono essere letti da parser e da browser conformi alle specifiche HTML.

Sotto il cofano, Vue compila i template in codice JavaScript altamente ottimizzato. Combinato con il sistema di reattività, Vue può capire in maniera intelligente il numero minimo di componenti da ri-renderizzare e applicare il minimo numero di modifiche al DOM quando cambia lo stato dell'app.

Se hai familiarità con i concetti del Virtual DOM e preferisci la potenza di JavaScript, con il supporto opzionale a JSX, puoi anche scrivere direttamente le render function invece dei template. Tuttavia, nota che non godono dello stesso livello di ottimizzazioni durante la compilazione dei template.

Interpolazione del Testo

La forma più basilare di data binding è l'interpolazione del testo utilizzando la sintassi "Mustache" (doppie parentesi graffe):

template
<span>Messaggio: {{ msg }}</span>

Il tag mustache verrà sostituito con il valore della proprietà msg dall'istanza del componente corrispondente. Sarà anche aggiornato ogni volta che la proprietà msg cambia.

HTML puro

Le doppie parentesi graffe interpretano i dati come testo normale, non HTML. Per produrre vero HTML, avrai bisogno di utilizzare la direttiva v-html:

template
<p>Usando l'interpolazione del testo: {{ rawHtml }}</p>
<p>Using v-html directive: <span v-html="rawHtml"></span></p>

Usando l'interpolazione del testo: <span style="color: red">Questo dovrebbe essere rosso.</span>

Using v-html directive: Questo dovrebbe essere rosso.

Qui incontriamo qualcosa di nuovo. L'attributo v-html che vedi qui sopra si chiama direttiva (directive). Le direttive sono prefissate con v- per indicare che sono attributi speciali forniti da Vue, e come avrai indovinato, applicano un comportamento reattivo speciale al DOM renderizzato. Con questo codice stiamo dicendo "Mantieni l'HTML interno di questo elemento sempre aggiornato con la proprietà rawHtml dell'istanza attiva corrente".

Il contenuto dello span verrà sostituito con il valore della proprietà rawHtml e interpretato come HTML grezzo - i data binding saranno ignorati. Nota che non è possibile utilizzare v-html per comporre frammenti di template, poiché Vue non è un motore di templating basato su stringhe. Si preferisce, invece, l'uso dei componenti come unità fondamentali per la riutilizzazione e la composizione dell'interfaccia utente.

Avviso di Sicurezza

La renderizzazione dinamica di HTML arbitrario sul tuo sito web può essere molto pericolosa in quanto può facilmente portare a vulnerabilità XSS. Utilizza v-html solo su contenuti di fiducia e mai su contenuti forniti dall'utente.

Associazioni di Attributi (binding)

Le parentesi graffe non possono essere utilizzate all'interno degli attributi HTML. Si può usare, invece, la direttiva v-bind:

template
<div v-bind:id="dynamicId"></div>

La direttiva v-bind indica a Vue di mantenere sincronizzato l'attributo id dell'elemento con la proprietà dinamica dynamicId del componente. Se il valore associato è null o undefined, l'attributo verrà rimosso dall'elemento renderizzato.

Forma abbreviata

dato che v-bind è utilizzato così di frequente, ha una sintassi abbreviata dedicata:

template
<div :id="dynamicId"></div>

Gli attributi che iniziano con : possono sembrare un po' diversi dall'HTML normale, ma in realtà è un carattere valido per i nomi degli attributi e tutti i browser supportati da Vue possono analizzarlo correttamente. Non appaiono, inoltre, nel markup finale renderizzato. La sintassi abbreviata è opzionale, ma probabilmente la apprezzerai quando imparerai qualcosa in più sul suo utilizzo più avanti.

Per il resto della guida, negli esempi di codice utilizzeremo la sintassi abbreviata, dato che è l'uso più comune per gli sviluppatori Vue.

Attributi Booleani

Gli Attributi Booleani sono attributi che possono indicare valori veri / falsi con la loro presenza su un elemento. Ad esempio,disabled è uno degli attributi booleani più comunemente utilizzati.

In questo caso v-bind funziona un po' diversamente:

template
<button :disabled="isButtonDisabled">Button</button>

L'attributo disabled sarà incluso se isButtonDisabled ha un valore truthy. Sarà incluso anche se il valore è una stringa vuota, mantenendo la coerenza con <button disabled="">. Per altri valori falsy l'attributo sarà omesso.

Associazione Dinamica di Attributi Multipli

Se hai un oggetto JavaScript che rappresenta attributi multipli che assomiglia a questo:

js
const objectOfAttrs = {
  id: 'container',
  class: 'wrapper'
}
js
data() {
  return {
    objectOfAttrs: {
      id: 'container',
      class: 'wrapper'
    }
  }
}

Puoi associarli a un singolo elemento utilizzando v-bind senza un argomento:

template
<div v-bind="objectOfAttrs"></div>

Utilizzo delle Espressioni JavaScript

Finora abbiamo associato nei nostri template solo semplici chiavi di proprietà ma, all'interno di tutti i data binding, Vue supporta tutta la potenza delle espressioni JavaScript:

template
{{ number + 1 }}

{{ ok ? 'SI' : 'NO' }}

{{ message.split('').reverse().join('') }}

<div :id="`list-${id}`"></div>

Queste espressioni verranno valutate come JavaScript nello scope dei dati nell'istanza del componente corrente.

Nei template Vue le espressioni JavaScript possono essere utilizzate nelle seguenti posizioni:

  • All'interno delle interpolazioni di testo (mustache)
  • Nel valore dell'attributo di qualsiasi direttiva Vue (attributi speciali che iniziano con v-)

Singole espressioni

Un'espressione è un pezzo di codice che può essere valutato per ottenere un valore. Un semplice test è verificare se può essere utilizzato dopo return.

Pertanto, il seguente codice NON funzionerà:

template
<!-- questa è un'istruzione, non un'espressione: -->
{{ var a = 1 }}

<!-- nemmeno il controllo di flusso funzionerà , usa espressioni ternarie -->
{{ if (ok) { return message } }}

Chiamata di Funzioni

È possibile chiamare un metodo esposto da un componente all'interno di un'espressione di binding:

template
<time :title="toTitleDate(date)" :datetime="date">
  {{ formatDate(date) }}
</time>

TIP

Le funzioni chiamate all'interno delle espressioni di binding verranno chiamate ogni volta che il componente si aggiorna, quindi accertati che non abbiano alcun effetto collaterale, come modificare i dati o innescare operazioni asincrone.

Accesso Limitato alle Globali

Le espressioni del template sono isolate e hanno accesso solo a una lista limitata delle Globali. La lista espone le globali native usate comunemente come Math e Date.

Le Globali (oggetti, funzioni) non incluse nella lista, ad esempio le proprietà aggiunte dall'utente alla window, non saranno accessibili nelle espressioni del template. Puoi comunque definire esplicitamente delle globali aggiuntive per tutte le espressioni di Vue, aggiungendole a app.config.globalProperties.

Le Direttive

Le direttive sono attributi speciali con il prefisso v-. Vue fornisce un numero di direttive native, tra cui v-html e v-bind che abbiamo introdotto in precedenza.

I valori degli attributi delle direttive dovrebbero essere singole espressioni JavaScript (ad eccezione di v-for, v-on e v-slot, che saranno presentati nell relative sezioni in seguito). Il compito di una direttiva è applicare reattivamente gli aggiornamenti al DOM quando il valore della sua espressione cambia. Prendiamo come esempio v-if:

template
<p v-if="seen">Ora mi vedi</p>

Qui, la direttiva v-if può rimuovere / inserire l'elemento <p> in base alla veridicità del valore dell'espressione seen.

Arguments

Alcune direttive possono accettare un "argomento", indicato da due punti dopo il nome della direttiva. Ad esempio, la direttiva v-bind viene utilizzata per aggiornare in maniera reattiva un attributo HTML:

template
<a v-bind:href="url"> ... </a>

<!-- shorthand -->
<a :href="url"> ... </a>

Qui href è l'argomento, che indica alla direttiva v-bind di collegare l'attributo href dell'elemento al valore dell'espressione url. Nella forma abbreviata, tutto ciò che precede l'argomento (cioè v-bind:) è condensato in un singolo carattere :.

Un altro esempio è la direttiva v-on che ascolta gli eventi del DOM:

template
<a v-on:click="doSomething"> ... </a>

<!-- shorthand -->
<a @click="doSomething"> ... </a>

Qui l'argomento è il nome dell'evento da ascoltare: click. v-on ha una corrispondente forma abbreviata, ovvero il carattere @. Più avanti parleremo nel dettaglio anche della gestione degli eventi.

Argomenti Dinamici

È possibile utilizzare anche un'espressione JavaScript come argomento di direttiva, racchiudendola tra parentesi quadre:

template
<!--
Nota che ci sono alcune limitazioni all'uso di espressioni nell'argomento,
come spiegato nelle sezioni "Vincoli sul Valore dell'Argomento Dinamico" e "Vincoli sulla Sintassi dell'Argomento Dinamico" qui sotto.
-->
<a v-bind:[attributeName]="url"> ... </a>

<!-- shorthand -->
<a :[attributeName]="url"> ... </a>

Qui attributeName verrà valutato dinamicamente come un'espressione JavaScript e il suo valore generato verrà utilizzato come valore finale per l'argomento. Ad esempio, se l'istanza del tuo componente ha una proprietà dati, attributeName, il cui valore è "href", allora questo binding sarà equivalente a v-bind:href.

Allo stesso modo puoi utilizzare argomenti dinamici per collegare un handler (gestore) ad un nome di evento dinamico:

template
<a v-on:[eventName]="doSomething"> ... </a>

<!-- shorthand -->
<a @[eventName]="doSomething">

In questo esempio, quando il valore di eventName è "focus", v-on:[eventName] sarà equivalente a v-on:focus.

Vincoli sul Valore dell'Argomento Dinamico

Gli argomenti dinamici si aspettano di ricevere (valutare) una stringa, con l'eccezione di null. Il valore speciale null può essere utilizzato per rimuovere esplicitamente il binding. Qualsiasi altro valore non stringa causerà un avviso.

Vincoli sulla Sintassi dell'Argomento Dinamico

Le espressioni degli argomenti dinamici hanno alcuni vincoli di sintassi perché alcuni caratteri, come spazi e virgolette, non sono validi all'interno dei nomi degli attributi HTML. Ad esempio, il seguente codice è non valido:

template
<!-- Questo causerà un avviso (warning) del compilatore.  -->
<a :['foo' + bar]="value"> ... </a>

Se hai bisogno di passare un argomento dinamico complesso, è probabilmente meglio utilizzare una computed property, che tratteremo a breve.

Quando si utilizzano template in-DOM (template scritti direttamente in un file HTML), si dovrebbe anche evitare di nominare le chiavi con caratteri maiuscoli, poiché i browser convertiranno i nomi degli attributi in minuscolo:

template
<a :[someAttr]="value"> ... </a>

Il codice qui sopra verrà convertito in :[someattr] nei template in-DOM. Se il tuo componente ha una proprietà someAttr invece di someattr, il tuo codice non funzionerà. I template all'interno dei Componenti Single-File non sono soggetti a questo vincolo.

Modificatori

I modificatori sono speciali suffissi, contrassegnati da un punto, che indicano ad una direttiva di comportarsi in maniera particolare. Ad esempio, il modificatore .prevent indica alla direttiva v-on di usare event.preventDefault() sull'evento innescato:

template
<form @submit.prevent="onSubmit">...</form>

Vedrai altri esempi di modificatori più avanti, per v-on e per v-model, quando esploreremo queste funzionalità.

Ecco, infine, la sintassi completa della direttiva visualizzata:

grafico della sintassi della direttiva

La Sintassi del Template has loaded