Sintaksa
Vue pruža veoma lep način integrisanja event listener-a na bilo kom elementu DOM-a. Kao i kod ostalih metoda i event callback metode imaju direktan pristup Vue podacima koristeći “this” ključnu reč.
a) Standardna sintaksa
Da bismo event listener priključili bilo kojem HTML elementu, koristimo direktivu v-on: na koju nadovezujemo naziv vrste dogadjaja koji osluškujemo. Pored toga je potrebno da na kraju takve sintakse da “dodelimo” odgovarajuću event handler metodu.
1 2 3 4 5 6 7 8 9 10 |
<button v-on:click="nekiEventHandler"></button> <script> let vm = new Vue ({ methods: { nekiEventHandler : function (event) { console.log(event.target) } } }); </script> |
Skraćeno pisanje sintakse
1 |
<button @click="nekiEventHandler"></button> |
b) Objektna sintaksa za više “zakačenih” dogadjaja
Ova sintaksa se koristi kada “kačimo” više različitih dogadjaja na isti elemenat
1 |
<button v-on="{ mousedown: doThis, mouseup: doThat }"></button> |
Prosledjivanje argumenata handler funkciji:
a) prosledjivanje samo event objekta
Ako u sklopu direktive ne prosledimo nikakv argument, Vue.js automatski u pozadini uvek prosledjuje “event objekat”. Stoga ga uvek možemo iskoristi i pozvati u sklopu event handler metode.
Primer
See the Pen Vue event by Web programiranje (@chos) on CodePen.
b) prosledjivanje argumenta
Kada želimo da callback funkciji prosledimo neki parametar, a da to nije event objekat, potrebno je da koristimo sledeću sintaksu:
1 |
<button v-on:click="nekiEventHandler('specificniArgument')"></button> |
Primer
See the Pen Vue prosledjivanje argumenta event handleru by Web programiranje (@chos) on CodePen.
c) Prosledjivanje argumenta i event objekta
Kada callback funkciji pored specifičnog parametra želimo da prosledimo i “event objekat” potrebno je da ga navedemo sa “$event”:
1 |
<button v-on:click="nekiEventHandler('specificniArgument', $event)"></button> |
Event modifiers
Modifikatori direktive (eng.modifiers) su posebni postfiksi koji se nadovezuju korišćenjem tačke na direktivu, i svojim postojanjem ukazuju na to da direktiva treba da bude izmenjena na neki poseban način.
NAPOMENA:
Modifikatori dogadjaja se mogu nadovezivati jedan na drugi
<button @click.stop.prevent="doThis"></button>
Pošto se i izvršavaju prema redosledu kako su navedeni, treba na to obratiti pažnju.
.stop
Kada se ovaj modifikator nadoveže na direktivu ima istu funkcionalnosti kao da smo tom u sklopu event handlera pozvali metodu event.stopPropagation() i tako sprečili propagaciju dogadjaja
Primer
See the Pen Stop modifier by Web programiranje (@chos) on CodePen.
.prevent
Kada se ovaj modifikator nadoveže na direktivu ima istu funkcionalnosti kao da smo tom u sklopu event handlera pozvali metodu event.preventDefault().
1 2 |
<!-- just the modifier --> <form v-on:submit.prevent></form> |
Primer
U ovome primeru koristeći modifikator .prevent sprečavamo defaultno ponašanje forme da se pri kliku na dugme “izračunaj” da se submit-uje. Kada ovaj kod ne bi koristio modifier “prevent” onda bi se odmah nakon klika na dugme stranica ponovno učitala, jer submitujemo formu. Pri kliku na dugme bi se takodje pozivao i event handler “calculate”, ali stranica bi se reloadovala pa ne bi videli rezult. Treba pojasniti da bi istu funkcionalnost postigli bez modifikatora ubacivanjem koda event.preventDefault(); na početku metode “calculate”. Medjutim korišćenje modifikatora je jednostavnije i sam pogled na HTML jasno daje do znanja da je sprečeno podrazumevano ponašanje forme.
See the Pen Modifier na event direktivi v-on by Web programiranje (@chos) on CodePen.
Key modifikatori
Ovi modifikatori omogućavaju da se aktivira event handler funkcija samo ukoliko se koristi odredjeno dugme. Najčešće korišćeni key modifikatori su:
-
.enter
-
.tab
-
.delete
-
.esc
-
.space
-
.up
-
.down
-
.left
-
.right
-
.ctrl
-
.alt
-
.shift
-
.meta (na macintosh-u ⌘, a na windows-u ⊞)
Pored ovih “običnih” dugmadi tastature, često se koriste i sistemska dugmad:
Primer
1 2 3 |
<input @keyup.alt.67="clear"> // Alt + C <div @click.ctrl="doSomething">Do something</div> // Ctrl + Click |
Primer
Pored samog naziva dugmeta možemo da koristimo i njihov alijas (Enter je 13):
1 2 |
<input v-model="b" @keyup.enter="calculate"> <input v-model="a" @keyup.13="calculate"> |
Mouse modifikatori
Ovi modifikatori se koriste da se sa njima jasnije definiše dogadjaj vezan za rad miše, u zavisnosti od korišćenog dugmeta.
-
.left
-
.right
-
.middle
Za levo dugme je podrazumevani dogadjaj “onclick”, dok je za desni taster podrazumevan dogadjaj “oncontextmenu”, srednje dugme nema definisan podrazumevani tip dogadjaja. Pored podrazumevanih dogadjaja na sva tri dugmeta se mogu koristi još i “onmousedown” ili “onmouseup” dogadjaji. Pošto za podrazumevane dogadjaje nema potrebe da koriste modifikatore, sledi da mouse modifikatore koristimo samo za “onmousedown” ili “onmouseup” dogadjaje.
Primer
Pošto je za “onclick” event već podrazumevano koristi levi taster, glupo je koristiti ovaj modifikator na “onclick” dogadjaju, stoga modifikator koristimo samo za jedan od dva moguća dogadjaja onmousedown:
1 2 3 |
<div v-on:mousedown.left="onDivClick"> Use the left mouse button in this area. </div> |
.capture
Podrazumevano redosled prenošenja dogadjaja je “bubbling” (dogadjaj se prenosi od unutrašnjosti ka spoljašnjem elemetu), medjutim ukoliko želimo da koristimo obrnuti smer prosledjivanja dogadjaja tzv. “capturing” je neophodno da koristimo modifikator .capture. Više o redosledu izvršavanja dogadjaja pročitajte u članku “Dogadjaji u JavaScript=u”
1 |
<div v-on:click.capture="doThis">...</div> |
Primer
U ovom primeru iako je event listener ugradjen na srednjem elementu, ukoliko kliknemo na unutrašnji elelment i on će aktivirati dogadjaj jer se dogadjaj zbog “capture” modifikatora prosledjuje od spoljašnjosti ka unutrašnjosti. Medjutim iz istog razloga se ništa neće desiti ukoliko se klikne na spoljašnji element
See the Pen Vue Capture v-on modifikator by Web programiranje (@chos) on CodePen.
.self
Ovaj modifikator omogućava da dogadjaj bude “okinut” samo ukoliko se klikne baš na element na kome je direktiva.
1 |
<div v-on:click.self="doThat">...</div> |
Primer
U ovome primeru se može primetiti da nema ni bubbling ni capturinig prosledjivanja dogadjaja, i da će dogadjaj biti “okinut” samo na elementu na kome je definisana direktiva (event listener), u ovom slučaju samo na srednjem elementu.
See the Pen Vue event modifikator self by Web programiranje (@chos) on CodePen.
.native
Vue.js ima svoj sistem za događaje kada su u pitanju komponente, pod nazivom “prilagođeni događaji” (eng.custom events). Ovaj sistem je odvojen od standardnih (nativnih) događaja u browseru, tako da Vue.js očekuje baš custom click dogadjaj, a ne nativni dogadjaj. Stoga, ukoliko nam ipak treba nativni browserov tip dogadjaja, onda je potrebno koristiti .native modifikator na v-on direktivi.
.once
Kada se na direktivu doda .once modifikator, onda se na tom elementu može okinuti samo jedan dogadjaj.
1 |
<a v-on:click.once="doThis"></a> |
Ustvari dogadjaj se ponaša kao da je u opcijama za dogadjaj u options delu
1 |
target.addEventListener(type, listener[, options]); |
definisana vrednost { once: true }. Pogledajte više o ovome u dokumentaciji u članku “EventTarget.addEventListener()”.
.passive
Kada se na direktivu doda .pasive modifikator, onda on obezbedjuje da se na tom elementu nikada ne pozove preventDefault () metoda. Čak i ako se nekada to desi, Vue.js će ga ignorisati i generisati upozorenje u konzoli.
1 |
<div v-on:scroll.passive="onScroll">...</div> |
Ustvari event listener se ponaša kao kada se u njegovom options delu definiše vrednost { passive: true }.
1 |
target.addEventListener(type, listener[, options]); |
Pogledajte više o ovome u MDN dokumentaciji u članku “addEventListener()”.