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.