Lekcja krótka, łatwa i przyjemna, poznajemy event modifiers, bardzo przydatną rzecz w Vue.js.
Ok, dodamy do naszej apki takie cudo:
<template>
<img alt="Vue logo" src="./assets/logo.png" >
<HelloWorld msg="Welcome to Your Vue.js App"/>
<NewComponent name="John Doe" @abc="abcHandler"></NewComponent>
<NewComponent name="Jane Doe" @abc="abcHandler"></NewComponent>
<ul>
<li><a href="https://www.google.com" @click.prevent>Google</a></li>
</ul>
</template>
Prevent robi preventDefault, czyli zapobiega domyślnemu działaniu (przez co nie przechodzimy pod link). Możemy też dać tam jakąś funkcję:
<li><a href="https://www.google.com" @click.prevent="abcHandler('google')">Google</a></li>
Modyfikatory możemy chainować:
<li><a href="https://www.google.com" @click.prevent.once="abcHandler('this leads to google')">Google</a></li>
Rzućmy okiem na kilka przykładów z dokumentacji:
<!-- this will fire even if Alt or Shift is also pressed -->
<button @click.ctrl="onClick">A</button>
<!-- this will only fire when Ctrl and no other keys are pressed -->
<button @click.ctrl.exact="onCtrlClick">A</button>
<!-- this will only fire when no system modifiers are pressed -->
<button @click.exact="onClick">A</button>
Jeszcze kilka przykładów:
<!-- the click event's propagation will be stopped -->
<a @click.stop="doThis"></a>
<!-- the submit event will no longer reload the page -->
<form @submit.prevent="onSubmit"></form>
<!-- modifiers can be chained -->
<a @click.stop.prevent="doThat"></a>
<!-- just the modifier -->
<form @submit.prevent></form>
<!-- only trigger handler if event.target is the element itself -->
<!-- i.e. not from a child element -->
<div @click.self="doThat">...</div>
Dla myszy mamy też left, right i middle. Ale to z grubsza większość. Musimy pracując z eventami pamiętać o kilku rzeczach:
- W frameworkach frontendowych co do zasady, defaultowo, obowiązuje zasada jednokierunkowego przepływu danych z góry na dół
- Co do zasady ten przepływ danych odbywa się przez wszystkich pośredników (provide/inject potrafi pomijać ich w komunikacji dziadek/prodzek-wnuk/potomek)
- Co do zasady, eventy JS mają bubble phase i capture phase
- Eventy customowe propagują od elementu HTML markupu swojego komponentu aż do rodzica-komponentu
- Rodzic komponent może słuchać eventów emitowanych przez swoje HTMLowe dzieci, ale te eventy nie propagują w górę do jego rodziców (co do zasady)
- Choć wygląda na to, że Vue tworzy web components (jak w stencilu albo czystym JS) to de facto nie tworzy. Tag <MyComponent> (jakkolwiek by nie był nazwany) to tylko pewna koncepcja, wobec tego słuchanie na komponentach (nie HTMLu) na zwykłe eventy (click na przykład) nie ma sensu i jest bardzo problematyczne
Nie jest łatwo, aby pozyskać reaktywność do swojego backendu, to są zupełnie nowe i nam nieznane koncepcje i podejścia. Musimy się oswoić z tym.