Obsługa Zdarzeń
Nasłuchiwanie zdarzeń
Możemy użyć dyrektywy v-on, którą zazwyczaj skracamy do symbolu @, aby nasłuchiwać zdarzeń DOM i uruchamiać JavaScript, gdy zostaną one wywołane. Używa się v-on:click="handler" lub skrótu, @click="handler".
Sposóby użycia funkcji obsługi zdarzeń:
Inline handlers: Kod JavaScript wykonywany w linii, gdy zdarzenie zostanie wywołane (podobny do natywnego atrybutu
onclick).Method handlers: Nazwa właściwości lub ścieżka, która wskazuje na metodę zdefiniowaną w komponencie.
Funkcje obsługi inline
Funkcji obsługi zdarzeń inline używa się zazwyczaj w prostych przypadkach, na przykład:
js
const count = ref(0)
template
<button @click="count++">Add 1</button>
<p>Count is: {{ count }}</p>
Funkcja obsługi zdarzeń na bazie metody.
Logika wielu mechanizmów obsługi zdarzeń będzie jednak bardziej złożona i prawdopodobnie nie będzie możliwa do zrealizowania za pomocą funkcji inline. Dlatego v-on może również przyjąć nazwę lub ścieżkę do metody komponentu, którą chcemy wywołać.
Dla przykładu:
js
const name = ref('Vue.js')
function greet(event) {
alert(`Hello ${name.value}!`)
// `event` jest zdarzeniem DOM
if (event) {
alert(event.target.tagName)
}
}
template
<!-- `greet` jest nazwą metody zdefiniowanej powyżej -->
<button @click="greet">Greet</button>
Metoda obsługi automatycznie otrzymuje natywny obiekt zdarzenia DOM, który ją wywołuje - w powyższym przykładzie możemy uzyskać dostęp do elementu wysyłającego zdarzenie poprzez event.target.tagName.
Zobacz także: Typowanie Event Handlers
Wykrywanie - Method czy Inline
Kompilator szablonów wykrywa metodę obsługi zdarzeń przez sprawdzenie, czy ciąg znaków v-on jest poprawnym kodem JavaScript lub ścieżką dostępu do właściwości. Na przykład, foo, foo.bar i foo['bar'] są traktowane jako funkcje obsługi przez metodę, podczas gdy foo() i count++ są traktowane jako funkcje obsługi inline.
Wywoływanie metod w obsłudze typu inline
Zamiast wiązać się bezpośrednio z nazwą metody, możemy również wywoływać metody w obsłudze typu inline. Dzięki temu możemy przekazać metodzie niestandardowe argumenty zamiast natywnego zdarzenia:
js
function say(message) {
alert(message)
}
template
<button @click="say('hello')">Say hello</button>
<button @click="say('bye')">Say bye</button>
Dostęp do argumentu zdarzenia w inline handlerach
Czasami potrzebujemy także dostępu do oryginalnego zdarzenia DOM w inline handlerze. Możesz przekazać je do metody, używając specjalnej zmiennej $event, lub użyć funkcji strzałki inline:
template
<!-- użycie zmiennej specjalnej $event -->
<button @click="warn('Form cannot be submitted yet.', $event)">
Submit
</button>
<!-- użycie funkcji strzałkowej w obsłudze typu inline -->
<button @click="(event) => warn('Form cannot be submitted yet.', event)">
Submit
</button>
js
function warn(message, event) {
// teraz mamy dostęp do zdarzenia natywnego
if (event) {
event.preventDefault()
}
alert(message)
}
Modyfikatory zdarzeń
Bardzo często zachodzi potrzeba wywołania event.preventDefault() lub event.stopPropagation() wewnątrz obsługi zdarzeń. Chociaż możemy to łatwo zrobić wewnątrz metod, byłoby lepiej, gdyby metody mogły zajmować się wyłącznie logiką danych, a nie szczegółami zdarzeń DOM.
Aby rozwiązać ten problem, Vue dostarcza modyfikatory zdarzeń dla v-on. Przypomnijmy, że modyfikatory to postfiksy instrukcji oznaczane kropką.
.stop.prevent.self.capture.once.passive
template
<!-- kontynuacja zdarzenia kliknięcia zostanie zatrzymana -->
<a @click.stop="doThis"></a>
<!-- zdarzenie submit nie będzie już powodować przeładowania strony -->
<form @submit.prevent="onSubmit"></form>
<!-- modyfikatory mogą być łączone razem -->
<a @click.stop.prevent="doThat"></a>
<!-- tylko modyfikator -->
<form @submit.prevent></form>
<!-- wywołaj handler tylko wtedy, gdy event.target jest samym elementem -->
<!-- tzn. nie z elementu potomnego -->.
<div @click.self="doThat">...</div>
TIP
Kolejność ma znaczenie podczas używania modyfikatorów, ponieważ odpowiedni kod jest generowany w tej samej kolejności. Dlatego użycie @click.prevent.self zapobiegnie domyślnemu działaniu kliknięć na samym elemencie i jego dzieciach, podczas gdy @click.self.prevent zapobiegnie tylko domyślnemu działaniu kliknięć na samym elemencie.
Modyfikatory .capture, .once i .passive odzwierciedlają opcje natywnej metody addEventListener method:
template
<!-- użyj trybu przechwytywania podczas dodawania funkcji obsługi zdarzeń -->.
<!-- tzn. zdarzenie skierowane do elementu wewnętrznego jest obsługiwane tutaj, zanim zostanie obsłużone przez ten element -->.
<div @click.capture="doThis">...</div>
<!-- zdarzenie kliknięcia zostanie wywołane co najwyżej raz -->
<a @click.once="doThis"></a>
<!-- domyślne zachowanie zdarzenia przewijania (przewijanie) będzie miało miejsce -->
<!-- natychmiast, zamiast czekać na zakończenie `onScroll` -->.
<!-- w przypadku, gdy zawiera ono `event.preventDefault()` -->.
<div @scroll.passive="onScroll">...</div>
Modyfikator .passive jest zwykle używany z nasłuchiwaniem zdarzeń dotykowych w celu poprawy wydajności na urządzeniach przenośnych.
TIP
Nie używaj .passive i .prevent razem, ponieważ .passive już wskazuje przeglądarce, że nie zamierzasz zapobiec domyślnemu zachowaniu zdarzenia, i prawdopodobnie zobaczysz ostrzeżenie od przeglądarki, jeśli to zrobisz.
Modyfikatory klawiszy
Podczas nasłuchiwania zdarzeń na klawiaturze często musimy sprawdzać, czy nie występują określone klawisze. Vue umożliwia dodawanie modyfikatorów klawiszy dla v-on lub @ podczas nasłuchiwania zdarzeń klawiszowych:
template
<!-- wywołaj `vm.submit()` tylko wtedy, gdy `key` jest `Enter` -->.
<input @keyup.enter="submit" />
Jako modyfikatorów można bezpośrednio używać dowolnych poprawnych nazw klawiszy dostępnych przez KeyboardEvent.key, konwertując je na kebab-case.
template
<input @keyup.page-down="onPageDown" />
W powyższym przykładzie, funkcja obsługi zdarzenia zostanie wywołana tylko wtedy, gdy $event.key jest równy 'PageDown'.
Aliasy klawiszy
Vue udostępnia aliasy dla najczęściej używanych klawiszy:
.enter.tab.delete(przechwytuje zarówno klawisze "Delete", jak i "Backspace").esc.space.up.down.left.right
Klawisze modyfikatorów systemu
Można użyć następujących modyfikatorów, aby wywołać nasłuchiwanie zdarzeń myszy lub klawiatury tylko wtedy, gdy zostanie naciśnięty odpowiedni klawisz modyfikatora:
.ctrl.alt.shift.meta
Note
Na klawiaturach Macintosha meta to klawisz polecenia (⌘). Na klawiaturach Windows meta to klawisz Windows (⊞). Na klawiaturach Sun Microsystems meta jest oznaczona jako romb (◆). Na niektórych klawiaturach, w szczególności na klawiaturach MIT i Lisp machine oraz ich następcach, takich jak klawiatura Knight, klawiatura z klawiszami spacji i kadetu, meta jest oznaczona jako "META". Na klawiaturach Symbolics meta jest oznaczana jako "META" lub "Meta".
Na przykład:
template
<!-- Alt + Enter -->
<input @keyup.alt.enter="clear" />
<!-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>
TIP
Zauważ, że klawisze modyfikujące różnią się od zwykłych klawiszy i kiedy są używane ze zdarzeniami keyup, muszą być wciśnięte w momencie emisji zdarzenia. Innymi słowy, keyup.ctrl wywoła się tylko wtedy, gdy puścisz klawisz trzymając wciśnięty ctrl. Nie wywoła się, jeśli zwolnisz sam klawisz ctrl.
Modyfikator `.exact
Modyfikator .exact pozwala kontrolować dokładną kombinację modyfikatorów systemowych potrzebnych do wywołania zdarzenia.
template
<!-- to zadziała nawet jeśli wciśnięty jest również Alt lub Shift -->
<button @click.ctrl="onClick">A</button>
<!-- to zadziała tylko wtedy, gdy zostanie naciśnięty Ctrl i żadne inne klawisze -->
<button @click.ctrl.exact="onCtrlClick">A</button>
<!-- to zadziała tylko wtedy, gdy nie zostaną naciśnięte żadne modyfikatory systemowe -->
<button @click.exact="onClick">A</button>
Modyfikatory przycisków myszy
.left.right.middle
Te modyfikatory ograniczają obsługę do zdarzeń wywoływanych przez określony przycisk myszy.