Gestione degli Eventi
Ascolto degli Eventi
Possiamo utilizzare la direttiva v-on
, che di solito abbreviamo con il simbolo @
, per ascoltare gli eventi del DOM e eseguire del codice JavaScript quando vengono attivati. L'utilizzo nella forma estesa sarebbe v-on:click="handler"
o con la scorciatoia, @click="handler"
.
Il valore dell'handler può essere uno dei seguenti:
Handler in linea: Codice JavaScript, scritto in linea, da eseguire quando l'evento viene innescato (simile all'attributo nativo
onclick
).Handler di un Metodo: Un nome di una proprietà o un percorso che punta a un metodo definito nel componente.
Handler In Linea
Gli handler in linea (Inline handlers) sono usati in genere per casi semplici, ad esempio:
js
const count = ref(0)
template
<button @click="count++">Aggiungi 1</button>
<p>Il conteggio è: {{ count }}</p>
Handler del Metodo
Per molti Handler di eventi, però, la logica sarà più complessa e, molto probabilmente, non sarà fattibile con gli handler in linea. Ecco perché v-on
può accettare anche il nome, o il percorso, di un metodo del componente che si desidera utilizzare (Method Handlers).
Ad esempio:
js
const name = ref('Vue.js')
function greet(event) {
alert(`Hello ${name.value}!`)
// `event` è l'Evento nativo del DOM
if (event) {
alert(event.target.tagName)
}
}
template
<!-- `greet` è il nome del metodo definito sopra -->
<button @click="greet">Saluta</button>
Un handler del metodo riceve automaticamente l'oggetto Evento nativo del DOM che lo innesca. Nell'esempio sopra, possiamo accedere all'elemento che dispaccia l'evento tramite event.target.tagName
.
Guarda anche: Tipizzazione degli Handler degli Eventi
Rilevamento di codice Inline o del Metodo
Il compilatore del template rileva gli handler dei metodi verificando che la stringa del valore v-on
sia un identificatore JavaScript valido o un percorso di accesso alla proprietà. Ad esempio: foo
, foo.bar
e foo['bar']
sono trattati come handler del metodo, mentre foo()
e count++
sono trattati come handler inline.
Usare i Metodi negli Handler Inline
Invece di collegarsi direttamente a un nome di un metodo, possiamo chiamare metodi anche in un handler inline. Ciò ci consente di passare al metodo degli argomenti personalizzati invece dell'evento nativo:
js
function say(message) {
alert(message)
}
template
<button @click="say('ciao')">Dì ciao</button>
<button @click="say('arrivederci')">Dì arrivederci</button>
Accesso all'Argomento dell'Evento negli Handler Inline
A volte in un handler inline abbiamo bisogno di accedere anche all'evento originale del DOM. Puoi passarlo a un metodo utilizzando la variabile speciale $event
, o utilizzare una funzione arrow inline:
template
<!-- utilizzando la variabile speciale $event -->
<button @click="warn('Il Form non può essere ancora inviato.', $event)">
Invia
</button>
<!-- utilizzando la funzione arrow inline -->
<button @click="(event) => warn('Il Form non può essere ancora inviato.', event)">
Invia
</button>
js
function warn(message, event) {
// ora abbiamo accesso all'evento nativo
if (event) {
event.preventDefault()
}
alert(message)
}
Modificatori dell'Evento
In molti casi negli handler degli eventi c'è bisogno di usare event.preventDefault()
o event.stopPropagation()
. Anche se possiamo farlo facilmente nei metodi, sarebbe meglio se i metodi riguardassero esclusivamente la logica dei dati, invece di dover gestire i dettagli dell'evento del DOM.
Per risolvere questo problema, per v-on
, Vue fornisce i modificatori dell'evento. Ricorda che i modificatori sono aggiunti alle direttive tramite un punto.
.stop
.prevent
.self
.capture
.once
.passive
template
<!-- la propagazione dell'evento click verrà interrotta -->
<a @click.stop="doThis"></a>
<!-- l'evento submit non ricaricherà più la pagina -->
<form @submit.prevent="onSubmit"></form>
<!-- i modificatori possono essere concatenati -->
<a @click.stop.prevent="doThat"></a>
<!-- singolo modificatore -->
<form @submit.prevent></form>
<!-- attiva l'handler solo se event.target corrisponde all'elemento stesso -->
<!-- cioè non da un elemento figlio -->
<div @click.self="doThat">...</div>
TIP
L'ordine conta quando si utilizzano i modificatori perché il codice correlato viene generato nello stesso ordine. Per questo l'utilizzo di @click.prevent.self
impedirà l'azione predefinita del click sull'elemento stesso e sui suoi figli, mentre @click.self.prevent
impedirà solo l'azione predefinita del click sull'elemento stesso.
I modificatori .capture
, .once
e .passive
riflettono le opzioni del metodo nativo addEventListener
:
template
<!-- usa la modalità di cattura quando aggiungi il listener dell'evento -->
<!-- cioè un evento che punta a un elemento interno viene gestito qui prima di essere gestito da quell'elemento -->
<div @click.capture="doThis">...</div>
<!-- l'evento click sarà attivato al massimo una volta -->
<a @click.once="doThis"></a>
<!-- il comportamento predefinito dell'evento di scorrimento (scrolling) avverrà -->
<!-- immediatamente, invece di aspettare che `onScroll` sia completato -->
<!-- nel caso contenga `event.preventDefault()` -->
<div @scroll.passive="onScroll">...</div>
Il modificatore .passive
è tipicamente usato con i listener degli eventi touch per migliorare le prestazioni sui dispositivi mobili.
TIP
Non usare .passive
e .prevent
insieme, perché .passive
indica già al browser che non intendi impedire il comportamento predefinito dell'evento, se lo fai, probabilmente riceverai un avviso dal browser.
Modificatori dei Tasti
Quando si ascoltano gli eventi della tastiera, spesso è necessario verificare specifici tasti. Vue permette di aggiungere i modificatori dei tasti per v-on
o @
quando si ascoltano gli eventi dei tasti:
template
<!-- chiama `submit` solo quando la `key` è `Enter` -->
<input @keyup.enter="submit" />
Come modificatore è possibile utilizzare qualsiasi nome di tasto valido, esposto tramite KeyboardEvent.key
, convertendolo in kebab-case.
template
<input @keyup.page-down="onPageDown" />
Nell'esempio sopra, l'handler verrà chiamato solo se $event.key
è uguale a 'PageDown'
.
Alias per i Tasti
Vue fornisce degli alias per i tasti utilizzati più di frequente:
.enter
.tab
.delete
(cattura sia il tasto "Delete" sia "Backspace").esc
.space
.up
.down
.left
.right
Tasti Modificatori di Sistema
Puoi utilizzare i seguenti modificatori per attivare i listener di eventi del mouse, o della tastiera, solo quando viene premuto il corrispondente tasto modificatore:
.ctrl
.alt
.shift
.meta
Nota
Sulle tastiere Macintosh, meta
è il tasto command (⌘). Sulle tastiere Windows, meta
è il tasto Windows (⊞). Sulle tastiere Sun Microsystems, meta
è contrassegnato da un rombo pieno (◆). Su alcune tastiere, in particolare le tastiere MIT e Lisp e le loro successive, come la tastiera Knight e la tastiera space-cadet, meta
è etichettato come “META”. Sulle tastiere Symbolics, meta
è etichettato come “META” o “Meta”.
For example:
template
<!-- Alt + Enter -->
<input @keyup.alt.enter="clear" />
<!-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>
TIP
Nota che i tasti modificatori sono diversi dai tasti regolari e quando vengono utilizzati con gli eventi keyup
, devono essere premuti quando l'evento viene emesso. In altre parole, keyup.ctrl
si attiverà solo se rilasci un tasto tenendo premuto ctrl
. Non si attiverà se rilasci il tasto ctrl
da solo.
Modificatore .exact
Il modificatore .exact
consente di controllare la combinazione esatta dei tasti modificatori di sistema necessari per attivare un evento.
template
<!-- questo handler si attiverà anche se vengono premuti Alt o Shift insieme a Ctrl -->
<button @click.ctrl="onClick">A</button>
<!-- questo handler si attiverà solo quando viene premuto Ctrl e nessun altro tasto -->
<button @click.ctrl.exact="onCtrlClick">A</button>
<!-- questo handler si attiverà solo se non vengono premuti tasti modificatori di sistema -->
<button @click.exact="onClick">A</button>
Modificatori dei Tasti del Mouse
.left
.right
.middle
Questi modificatori limitano l'handler agli eventi attivati da un specifico tasto del mouse.