Obsluha událostí
Naslouchání událostem
Pro naslouchání DOM událostem (events) můžeme použít direktivu v-on, která se typicky zapisuje zkráceně symbolem @. Poté, co jsou události vyvolány, můžeme skrz ni spustit nějaký JavaScript kód. Použití bude v-on:click="handler" nebo zkráceným zápisem @click="handler".
Handler může mít jednu z následujících hodnot:
Inline handlery: Inline JavaScript, který je spuštěn po vyvolání události (stejně jako nativní atribut
onclick).Method handlery: Název proměnné nebo cesta, která ukazuje na funkci definovanou v rámci komponenty.
Inline handlery
Inline handlery se typicky používají v jednoduchých případech, například:
js
const pocet = ref(0)template
<button @click="pocet++">Přidat 1</button> <p>Počet je: {{ pocet }}</p>Method handlery
Logika mnoha event handlerů však bude složitější a pravděpodobně nebude jen s inline handlery proveditelná. To je důvod, proč může v-on přijmout i název funkce, kterou chcete v rámci komponenty volat, nebo cestu k ní.
Například:
js
const jmeno = ref('Vue.js') function greet(event) { alert(`Ahoj, ${jmeno.value}!`) // `event` je nativní událost DOM if (event) { alert(event.target.tagName) } }template
<!-- `greet` je název funkce definované výše --> <button @click="greet">Pozdravit</button>Method handler automaticky přijímá objekt nativní události DOM, který ji vyvolá – ve výše uvedeném příkladu jsme schopni přistupovat k elementu odesílajícímu událost přes event.target.
Viz také: Typování Event handlerů
Detekce Method vs. Inline
Kompilátor šablon detekuje method handlery kontrolou, zda je hodnota v-on platným JavaScript identifikátorem nebo přístupovou cestou k vlastnosti. Například foo, foo.bar a foo['bar'] jsou považovány za method handlery, zatímco foo() a count++ jsou vyhodnoceny jako inline handlery.
Volání funkcí v Inline handleru
Namísto bindingu přímo na název funkce můžeme tyto funkce také volat přímo v inline handleru. To nám umožňuje předat funkci vlastní parametry namísto nativní události:
js
function say(message) { alert(message) }template
<button @click="say('ahoj')">Pozdrav</button> <button @click="say('nashledanou')">Rozluč se</button>Přístup k parametru nativní události in Inline handleru
Někdy potřebujeme přistupovat k původní události DOM i přímo v inline handleru. Můžete jej předat do funkce pomocí speciální proměnné $event nebo použít inline arrow funkci:
template
<!-- použití speciální proměnné $event --> <button @click="warn('Formulář ještě nelze odeslat', $event)"> Odeslat </button> <!-- použití inline arrow funkce --> <button @click="(event) => warn('Formulář ještě nelze odeslat', event)"> Odeslat </button>js
function warn(message, event) { // nyní máme přístup k nativnému eventu if (event) { event.preventDefault() } alert(message) }Modifikátory události
Uvnitř event handlerů je vcelku běžné volat event.preventDefault() nebo event.stopPropagation(). Ačkoli to můžeme snadno udělat uvnitř funkcí, bylo by lepší, kdyby funkce mohly být čistě o datové logice, než aby se musely zabývat detaily událostí DOM.
K vyřešení tohoto požadavku poskytuje Vue pro v-on modifikátory události.
Jde o direktivní postfixy označené tečkou.
.stop.prevent.self.capture.once.passive
template
<!-- šíření události kliknutí bude zastaveno --> <a @click.stop="doThis"></a> <!-- událost odeslání nebude znovu načítat stránku --> <form @submit.prevent="onSubmit"></form> <!-- modifikátory lze řetězit --> <a @click.stop.prevent="doThat"></a> <!-- nebo napsat pouze samotný modifikátor --> <form @submit.prevent></form> <!-- vyvolat handler pouze tehdy, pokud je event.target samotný element --> <!-- t.j. např. ne z potomka --> <div @click.self="doThat">...</div>TIP
Při použití modifikátorů záleží na pořadí, protože příslušný kód je ve stejném pořadí generován. Proto použití @click.prevent.self zabrání výchozí akci kliknutí na element samotný i jeho potomky, zatímco @click.self.prevent zabrání pouze výchozí akci kliknutí na samotný element.
Modifikátory .capture, .once a .passive představují možnosti nativní funkce addEventListener:
template
<!-- při přidávání event listeneru použít capture mód --> <!-- tj. událost zacílená na vnitřní element je dříve --> <!-- zpracována zde, než je zpracována uvnitř --> <div @click.capture="doThis">...</div> <!-- událost kliknutí bude vyvolána nejvýš jednou --> <a @click.once="doThis"></a> <!-- výchozí chování události scroll (scrolling) nastane --> <!-- okamžitě místo čekání na dokončení `onScroll` --> <!-- v případě, že obsahuje `event.preventDefault()` --> <div @scroll.passive="onScroll">...</div>Modifikátor .passive je typicky používán s dotykovými event listenery pro zlepšení výkonu na mobilních zařízeních.
TIP
Nepoužívejte .passive a .prevent dohromady, protože .passive již prohlížeči naznačuje, že nemáte v úmyslu bránit výchozímu chování události. Pokud tak přesto učiníte, pravděpodobně se vám zobrazí varování z prohlížeče.
Modifikátory kláves
Když nasloucháme událostem klávesnice, často potřebujeme zkontrolovat konkrétní klávesy. Vue proto umožňuje při poslechu událostí klávesnice přidávat pro v-on nebo @ modifikátory kláves:
template
<!-- zavolat `submit` pouze pokud byl stisknut `Enter` --> <input @keyup.enter="submit" />Jakékoli platné názvy kláves vystavené prostřednictvím KeyboardEvent.key můžete přímo použít jako modifikátory převedením na kebab-case.
template
<input @keyup.page-down="onPageDown" />Ve výše uvedeném příkladu je handler zavolán pouze, pokud se $event.key rovná 'PageDown'.
Aliasy kláves
Vue poskytuje aliasy pro nejčastěji používané klávesy:
.enter.tab.delete(zachytí jak „Delete“, tak „Backspace“).esc.space.up.down.left.right
Systémové klávesy
Následující modifikátory můžete použít k vyvolání event listenerů naslouchajících myši nebo klávesnici pouze, pokud je stisknuta odpovídající modifikační klávesa:
.ctrl.alt.shift.meta
Poznámka
Na klávesnicích Macintosh je meta klávesa příkazu (⌘). Na klávesnicích Windows je meta klávesa Windows (⊞). Na klávesnicích Sun Microsystems je meta označena jako plný kosočtverec (◆). Na určitých klávesnicích, konkrétně na strojových klávesnicích MIT a Lisp a jejich nástupcích jako je Knight keyboard a space-cadet keyboard, je meta označena jako „META“. Na klávesnicích Symbolics je meta označena „META“ nebo „Meta“.
Například:
template
<!-- Alt + Enter --> <input @keyup.alt.enter="clear" /> <!-- Ctrl + Click --> <div @click.ctrl="foo">Udělej něco</div>TIP
Všimněte si, že modifikační klávesy se od běžných kláves liší a při použití s událostmi keyup je nutné je stisknout, když je událost emitována. Jinými slovy, keyup.ctrl se spustí pouze tehdy, když uvolníte klávesu a zároveň držíte ctrl. Nespustí se, pokud pouze uvolníte klávesu ctrl.
Modifikátor .exact
Modifikátor .exact umožňuje ovládat přesnou kombinaci systémových modifikátorů potřebných k vyvolání události.
template
<!-- bude aktivováno i když je zároveň stisknuto Alt nebo Shift --> <button @click.ctrl="onClick">A</button> <!-- bude aktivováno pouze když je jen samotné Ctrl --> <button @click.ctrl.exact="onCtrlClick">A</button> <!-- bude aktivováno pouze když není stisknut žádný systémový modifikátor --> <button @click.exact="onClick">A</button>Modifikátory tlačítek myši
.left.right.middle
Tyto modifikátory omezují vyvolání event handlerů spouštěných určitým tlačítkem myši.
Pozor však, že ačkoliv jsou názvy modifikátorů .left, .right a .middle odvozeny od typického rozložení myši pro praváky, ve skutečnosti reprezentují triggery událostí main, secondary a auxiliary a nikoliv samotná tlačítka. Proto pro levorukou myš sice může být hlavní tlačítko fyzicky napravo, ale stále bude vyvolávat modifikátor .left. Trackpad může spustit .left poklepáním jednoho, .right dvou a .middle tří prstů. Stejně tak jiná zařízení a zdroje událostí, které generují události myši, mohou mít režimy spouštění, které se pojmů „left“ a „right“ vůbec netýkají.