事件監聽
使用 v-on 指令監聽 DOM 事件。
範例
點擊 Add 1 按鈕,在觸發 click 時執行 counter + 1
1 | <div id="example-1"> |
事件處理方法
多數的事件處理(event handlers)邏輯更為複雜,不好直接寫在 v-on 指令裡,而是讓 v-on 接收一個被調用的方法名稱。
1 | <div id="example-2"> |
行內處理方法
除了直接綁定一個方法名稱,也能在行內的 JavaScript 陳述式裡使用方法。
1 | <div id="example-3"> |
點擊不同的按鈕時,會因陳述式的不同而有不同的結果。
事件修飾符
修飾符為 . 後的後綴,表示一個指令的特殊綁定。
- .stop (停止觸發上層 DOM 元素事件。)
- .prevent (避免瀏覽器預設行為。)
- .capture (不管觸發事件的目標是否是下層, 設定 capture 的事件一定會先觸發。)
- .self (只有觸發此 DOM 元素本身才會觸發 self 事件。)
- .once (此事件只觸發一次。)
- .passive (無視 prevent 功能。)
※ 括號內文字參考自 Peter Chen:https://ithelp.ithome.com.tw/articles/10206828
範例方法
以下範例的方法皆為
1 | methods: { |
.stop
相當於調用 event.stopPropagation(),能夠阻止事件冒泡。
正常情況下會先顯示 child 然後顯示 parent
1 | <div @click="test('parent')"> |
使用 .stop 則只會顯示 child
1 | <div @click="test('parent')"> |
.prevent
相當於 event.preventDefault(),能夠阻止預設行為。
點擊 a 標籤前往連結頁面
1 | <a href="https://www.google.com/">To Google</a> |
使用 .prevent 則不觸發頁面跳轉
1 | <a href="https://www.google.com/" |
.capture
使用 .capture 的事件會優先觸發。
正常順序應該是 child -> parent -> Grandparent
1 | <div @click="test('Grandparent')"> |
在 Grandparent 上使用了 capture 修飾符後,順序變為 Grandparent -> child -> parent,Grandparent 被優先觸發,但 child 與 parent 仍是正常順序
1 | <div @click.capture="test('Grandparent')"> |
.self
只在 event.target 是元素本身時才會觸發。
點擊 child 時,會先觸發 child 再觸發 parent
1 | <div @click="test('parent')"> |
加上 self 後,點擊 child 時,只觸發 child
1 | <div @click.self="test('parent')"> |
.once
使用 .once 只會觸發一次。
只要點擊就會顯示 not once,不論次數
1 | <div @click="test('not once')">not once</div> |
只有第一次點擊時會顯示 once
1 | <div @click.once="test('once')">once</div> |
.passive
作用為無視 event.preventDefault() 功能。
即使加上 prevent 也還是會跳轉連結頁面
1 | <a @click.passive.prevent="test('跳轉')" |
注意使用修飾符的順序,前會先於後,因此 v-on:click.prevent.self 會阻止所有點擊,而 v-on:click.self.prevent 只會阻止對元素自身的點擊。
按鍵修飾符
鍵盤事件的專門修飾符。
- .enter
- .tab
- .delete (both “Delete” and “Backspace” keys)
- .esc
- .space
- .up
- .down
- .left
- .right
只有在 按鍵是 Enter 時調用 vm.submit()
1 | <input v-on:keyup.enter="submit"> |
滑鼠修飾符
僅在特定的滑鼠按鈕觸發事件。
- .left
- .right
- .middle