Skip to content

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:

  1. Inline handlery: Inline JavaScript, který je spuštěn po vyvolání události (stejně jako nativní atribut onclick).

  2. 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)
js
data() {
  return {
    pocet: 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)
  }
}
js
data() {
  return {
    jmeno: 'Vue.js'
  }
},
methods: {
  greet(event) {
    // `this` uvnitř funkce odkazuje na právě aktivní instanci
    alert(`Ahoj, ${this.jmeno}!`)
    // `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.

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()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)
}
js
methods: {
  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)
}
js
methods: {
  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í.

Obsluha událostí has loaded
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy