Impara da zero il framework JavaScript progressivo più amato: direttive, componenti riutilizzabili, props, slot, lifecycle hooks, routing e Composition API. 43 lezioni con editor live interattivo.
Vue HOME
Vue.js è un framework JavaScript progressivo per costruire interfacce utente reattive. È leggero, facile da apprendere e si integra in qualsiasi progetto.
Perché scegliere Vue?
🚀 Reattività automatica: i dati cambiano, la UI si aggiorna da sola
📦 Progressivo: aggiungilo a un progetto esistente o usalo come SPA completa
📖 Facile da imparare: sintassi vicina a HTML e JavaScript puro
🔧 Ricco di strumenti: router, store, devtools già pronti
📘 Premi ▶ Provalo tu su ogni esempio per vedere il codice in azione e modificarlo in tempo reale.
Il tuo primo componente Vue
Vue Intro
Vue.js è stato creato da Evan You nel 2014. È open source e oggi è uno dei framework JavaScript più usati al mondo, con milioni di sviluppatori.
Come funziona Vue
Vue collega il DOM HTML a un oggetto JavaScript reattivo. Quando i dati cambiano, Vue aggiorna automaticamente solo le parti della pagina che ne hanno bisogno.
Versione CDN (senza installazione)
Per iniziare subito basta includere lo script CDN nell'HTML:
Con v-bind si possono collegare src, href, class, style, disabled e qualsiasi altro attributo.
v-bind: collega attributi dinamicamente
Vue v-if
v-if mostra o nasconde un elemento in base a una condizione. Se la condizione è falsa, l'elemento viene rimosso completamente dal DOM.
v-if / v-else-if / v-else
<p v-if="loggato">Benvenuto!</p>
<p v-else-if="guest">Sei un ospite</p>
<p v-else>Accedi per continuare</p>
💡 Usa v-if quando l'elemento non serve spesso. Usa v-show quando l'elemento si nasconde e riappare frequentemente.
v-if con punteggio
Vue v-show
v-show mostra o nasconde un elemento usando display:none. L'elemento rimane nel DOM, ma viene reso invisibile.
v-show vs v-if
<!-- v-show: usa display:none, l'elemento resta nel DOM -->
<div v-show="visibile">Sono qui!</div>
<!-- v-if: rimuove/aggiunge l'elemento al DOM -->
<div v-if="visibile">Sono qui!</div>
Quando usare v-show: quando l'elemento si alterna frequentemente, perché evita di ricostruire il DOM ogni volta.
v-show: pannello toggle
Vue v-for
v-for renderizza una lista di elementi iterando su un array o un oggetto. Richiede sempre :key per aiutare Vue a tracciare gli elementi.
Sintassi v-for
<!-- Array -->
<li v-for="(item, index) in lista" :key="index">
{{ index }}. {{ item }}
</li>
<!-- Array di oggetti -->
<li v-for="corso in corsi" :key="corso.id">
{{ corso.nome }}
</li>
v-for: lista dinamica con aggiunta
Vue Events
Vue gestisce gli eventi del browser tramite la direttiva v-on (shorthand: @). Si collega un evento HTML a un metodo Vue.
All'interno dei methods si usa this per accedere ai dati del componente.
Calcolatrice semplice
Vue Event Modifiers
I modificatori di evento si aggiungono dopo l'evento con un punto. Rendono il codice più leggibile evitando chiamate esplicite a metodi come preventDefault().
Modificatore
Effetto
.prevent
event.preventDefault()
.stop
event.stopPropagation()
.once
L'evento si attiva una volta sola
.self
Solo se cliccato l'elemento stesso
.enter
Tasto Invio (key modifier)
Modificatori in pratica
Vue v-model
v-model crea un binding bidirezionale tra un elemento del form e i dati Vue. Quando l'utente cambia il valore, Vue aggiorna i dati e viceversa.
Modificatori utili: v-model.trim (rimuove spazi), v-model.number (converte in numero), v-model.lazy (aggiorna al blur).
Form con v-model
Vue CSS Binding
Vue permette di collegare dinamicamente classi CSS e stili inline tramite :class e :style.
Binding di classi e stili
<!-- Oggetto: aggiunge la classe se il valore è true -->
<div :class="{ attivo: isAttivo, errore: hasErrore }"></div>
<!-- Array: applica più classi -->
<div :class="[classeBase, classeExtra]"></div>
<!-- Stile inline -->
<div :style="{ color: colore, fontSize: dimensione + 'px' }"></div>
CSS Binding dinamico
Vue Computed Properties
Le computed properties sono valori derivati dai dati del componente. Vengono messe in cache: si ricalcolano solo quando i loro dati cambiano.
Computed vs Methods
<script>
computed: {
// Ricalcolato solo se 'lista' cambia
totale() {
return this.lista.reduce((s, i) => s + i.prezzo, 0)
}
},
methods: {
// Eseguito ogni volta che il template viene rivalutato
getTotale() {
return this.lista.reduce((s, i) => s + i.prezzo, 0)
}
}
</script>
Ricerca con computed
Vue Watchers
I watcher eseguono una funzione ogni volta che un dato specifico cambia. Sono utili per effetti collaterali come chiamate API o validazioni.
Definire i watcher
<script>
watch: {
// Osserva 'nome', viene chiamato a ogni modifica
nome(nuovoValore, vecchioValore) {
console.log(`da ${vecchioValore} a ${nuovoValore}`)
this.validato = nuovoValore.length >= 3
}
}
</script>
💡 Usa computed per valori derivati, watch per reazioni a cambiamenti (chiamate HTTP, animazioni, ecc.).
Watcher per validazione
Vue Templates
Il template Vue è l'HTML del componente arricchito con la sintassi reattiva. Vue compila il template in una funzione di rendering ottimizzata.
Interpolazione di testo
Sintassi template
<!-- Interpolazione testo -->
<p>{{ messaggio }}</p>
<!-- HTML grezzo (attenzione agli XSS!) -->
<p v-html="htmlContent"></p>
<!-- Espressioni JavaScript -->
<p>{{ numero * 2 }}</p>
<p>{{ ok ? 'Sì' : 'No' }}</p>
<p>{{ testo.split(' ').reverse().join(' ') }}</p>
Template e interpolazioni
Vue Why, How and Setup
Quando l'app cresce, Vue offre un sistema a componenti e gli SFC (Single File Components) con estensione .vue. Richiedono una build con Vite.
Installazione con Vite
Crea un progetto Vue con Vite
npm create vue@latest mio-progetto
cd mio-progetto
npm install
npm run dev
Vite avvia un server locale su http://localhost:5173 con hot-reload automatico.
📘 Per fare pratica subito senza build, tutti gli esempi di questo corso usano la versione CDN di Vue 3.
CDN vs Vite: stessa sintassi
Vue First SFC Page
Un SFC (Single File Component) è un file .vue con tre sezioni: template, script e style.
L'attributo scoped limita i CSS solo a quel componente, evitando conflitti.
Simula un SFC con CDN
Vue Components
I componenti sono blocchi di UI riutilizzabili. Si registrano globalmente o localmente e si usano come tag HTML personalizzati.
Registrazione e uso di un componente
<!-- In un progetto Vite, importeresti il file .vue -->
const app = createApp(App)
// Registrazione globale
app.component('MioBottone', {
template: '<button>Click!</button>'
})
app.mount('#app')
Con CDN si definiscono i componenti come oggetti e si registrano con app.component().
Componente contatore riutilizzabile
Vue Props
I props permettono al componente padre di passare dati ai figli. Sono come i parametri di una funzione per i componenti.
Definire e usare i props
<!-- Nel componente figlio -->
export default {
props: ['titolo', 'colore'],
// oppure con validazione:
props: {
titolo: { type: String, required: true },
colore: { type: String, default: 'blue' }
}
}
<!-- Nel componente padre -->
<carta titolo="HTML" colore="red"></carta>
<carta :titolo="dinamico" :colore="c"></carta>
Props: carta corso
Vue v-for Components
Si può usare v-for direttamente su un componente personalizzato per renderizzare una lista di componenti.
v-for su componenti
<lista-item
v-for="item in items"
:key="item.id"
:testo="item.testo"
></lista-item>
💡 La prop :key è obbligatoria con v-for sui componenti: aiuta Vue a identificare e riutilizzare efficientemente gli elementi.
Lista di componenti con v-for
Vue $emit()
$emit() permette a un componente figlio di comunicare eventi al padre. È il meccanismo per il flusso dati dal basso verso l'alto.
Usare $emit()
<!-- Figlio -->
export default {
emits: ['aumenta'],
methods: {
clicca() {
this.$emit('aumenta', 5) // passa un valore
}
}
}
<!-- Padre -->
<figlio @aumenta="totale += $event"></figlio>
$emit: comunicazione figlio→padre
Vue Fallthrough Attributes
Quando passi attributi a un componente che non sono dichiarati come props, Vue li applica automaticamente all'elemento radice del template del componente. Si chiama fallthrough.
Fallthrough automatico
<!-- Padre -->
<mio-bottone class="grande" id="btn1"></mio-bottone>
<!-- Figlio (template) -->
<button>Click</button>
<!-- Risultato: <button class="grande" id="btn1">Click</button> -->
Per disabilitare questo comportamento: inheritAttrs: false e v-bind="$attrs" manualmente.
Fallthrough in azione
Vue Scoped Styling
Con gli SFC, l'attributo scoped limita i CSS solo al componente corrente, evitando conflitti con altri componenti.
Style scoped in un SFC
<style scoped>
/* Questo stile vale SOLO per questo componente */
h2 { color: green; }
.card { border: 1px solid #e2e8f0; }
</style>
Vue aggiunge un attributo unico come data-v-f3f3eg9 a ogni elemento e al selettore CSS, isolando gli stili.
Simula stili scoped con componenti
Vue Local Components
I componenti possono essere registrati localmente all'interno di un solo componente, invece che globalmente con app.component().
Registrazione locale (SFC)
<script>
import CardCorso from './CardCorso.vue'
import BtnAzione from './BtnAzione.vue'
export default {
components: {
CardCorso,
BtnAzione
}
}
</script>
La registrazione locale è preferita perché riduce il bundle finale: un componente non usato non viene incluso.
Componenti locali
Vue Slots
Gli slot permettono al componente padre di iniettare contenuto HTML dentro un componente figlio, rendendolo molto flessibile.
Slot di base
<!-- Componente Card -->
<template>
<div class="card">
<slot>Contenuto di default</slot>
</div>
</template>
<!-- Uso nel padre -->
<card>
<h2>Titolo personalizzato</h2>
<p>Testo personalizzato</p>
</card>
Slot: contenuto flessibile
Vue v-slot
Con gli slot con nome si possono definire più zone di inserimento in un componente. Si usano con v-slot.
Slot con nome
<!-- Componente con slot multipli -->
<div class="card">
<header><slot name="header"></slot></header>
<main><slot></slot></main>
<footer><slot name="footer"></slot></footer>
</div>
<!-- Uso nel padre -->
<card>
<template v-slot:header>Titolo</template>
<p>Corpo principale</p>
<template #footer>Footer</template>
</card>
Slot con nome: layout flessibile
Vue Scoped Slots
Gli scoped slot permettono al componente figlio di passare dati al contenuto dello slot del padre, invertendo il normale flusso.
Scoped slot
<!-- Figlio: espone 'item' tramite lo slot -->
<slot v-for="item in lista" :item="item"></slot>
<!-- Padre: riceve 'item' e decide come renderizzarlo -->
<lista-componente v-slot="{ item }">
<span>{{ item.nome }}</span>
</lista-componente>
Scoped slot: lista flessibile
Vue Dynamic Components
Il tag speciale <component :is="..."> permette di cambiare componente dinamicamente in base a un valore.
Componenti dinamici
<component :is="componenteCorrente"></component>
<!-- Con keep-alive: mantiene lo stato quando si cambia -->
<keep-alive>
<component :is="tab"></component>
</keep-alive>
Tab con componenti dinamici
Vue Teleport
<Teleport> sposta il contenuto di un componente in un altro punto del DOM, pur mantenendolo logicamente nel componente padre.
Uso di Teleport
<!-- Il contenuto viene renderizzato in body,
ma la logica rimane in questo componente -->
<Teleport to="body">
<div class="modal" v-if="modale">
Sono una modale fuori dal normale flusso DOM!
</div>
</Teleport>
Utile per modali, tooltip e notifiche che devono stare in cima allo stack (z-index) senza problemi di overflow.
Modale semplice
Vue HTTP Request
Vue non include un client HTTP: si usa fetch() nativo o la libreria Axios. Le chiamate API si fanno tipicamente in mounted().
I template refs danno accesso diretto a un elemento DOM o a un'istanza di un componente figlio tramite l'attributo ref.
Usare ref
<input ref="mioInput">
<script>
mounted() {
// Accesso diretto all'elemento DOM
this.$refs.mioInput.focus()
}
</script>
I ref sono disponibili solo dopo che il componente è montato (mounted()). Prima il valore è null.
Template ref: focus automatico
Vue Lifecycle Hooks
I lifecycle hooks sono metodi chiamati automaticamente nei diversi momenti della vita di un componente.
Hook
Quando viene chiamato
beforeCreate
Prima dell'inizializzazione
created
Dopo l'inizializzazione (dati disponibili)
mounted
Dopo il montaggio nel DOM
updated
Dopo ogni aggiornamento del DOM
unmounted
Dopo la rimozione dal DOM
Lifecycle hooks in azione
Vue Provide/Inject
provide e inject permettono a un componente antenato di condividere dati con tutti i discendenti, senza passarli manualmente come props a ogni livello.
Vue ha attributi speciali built-in che aggiungono comportamenti alle direttive e ai componenti.
Attributo
Descrizione
key
Aiuta Vue a tracciare elementi in v-for
ref
Riferimento diretto all'elemento DOM o al componente
is
Specifica il componente in <component :is="...">
Attributo :key in v-for
Vue Built-in Components
Vue include alcuni componenti speciali integrati che non è necessario registrare.
Componente
Scopo
<Transition>
Anima singoli elementi (v-if/v-show)
<TransitionGroup>
Anima liste con v-for
<KeepAlive>
Mantiene lo stato dei componenti dinamici
<Teleport>
Sposta contenuto in un altro nodo del DOM
<Suspense>
Gestisce componenti asincroni con fallback
KeepAlive: preserva lo stato
Vue Directives Reference
Riepilogo completo di tutte le direttive built-in di Vue.
Direttiva
Descrizione
v-text
Imposta il textContent dell'elemento
v-html
Imposta l'innerHTML (attenzione: rischio XSS)
v-show
Mostra/nasconde con CSS display
v-if
Renderizza condizionalmente
v-else
Blocco else per v-if
v-else-if
Blocco else-if per v-if
v-for
Renderizza una lista
v-on / @
Ascolta eventi
v-bind / :
Collega attributi e props
v-model
Binding bidirezionale
v-slot
Slot con nome o scoped slot
v-pre
Salta la compilazione del nodo
v-once
Renderizza solo una volta
v-memo
Memoizza il sotto-albero
v-cloak
Nasconde fino al montaggio
v-text, v-html, v-once, v-pre
Conclusione
Complimenti! 🎉 Hai completato il corso di Vue.js completo e gratuito in italiano: dalle direttive e il data binding, ai componenti e le props, fino a Vue Router, Pinia, la Composition API e le performance. Ora sai costruire SPA moderne con Vue 3.
Il modo migliore per consolidare Vue.js è costruire un progetto reale: crea un'app con routing, store globale e chiamate API. Rifai gli esempi interattivi, esplora la documentazione ufficiale e sperimenta con Nuxt.js per il SSR.
E ora?
Dopo Vue.js il passo successivo naturale è esplorare Angular per scoprire un approccio più strutturato ai framework enterprise, oppure approfondire React per confrontare le tre grandi librerie JavaScript. Se vuoi un percorso guidato personalizzato, posso seguirti con ripetizioni di informatica in presenza a Roma.