vue事件處理器
監聽事件
可以用v-on指令監聽DOM事件來觸發一些JavaScript代碼
<div >
<button v-on:click="counter += 1">增加 1</button>
<p>這個按鈕被點擊了 {{ counter }} 次。</p>
</div>
<script>
var example1 = new Vue({
el: '#example-1',
data: {
counter: 0
}
})
</script>
方法事件處理器
許多事件處理的邏輯都很複雜,所以直接把JavaScript代碼寫在v-on指令中是不可行的;因此v-on可以接收一個定義
的方法來調用
<div >
<button v-on:click="greet">Greet</button>
</div>
<script>
var example2 = new Vue({
el: '#example-2',
data: {
name: 'Vue.js'
},
methods: {
greet: function (event) {
// `this` 在方法裏指當前 Vue 實例
alert('Hello ' + this.name + '!')
// `event` 是原生 DOM 事件
if (event) {
alert(event.target.tagName)
}
}
}
})
// 也可以用JavaScript直接調用方法
// example2.greet() // -> 'Hello Vue.js!'
</script>
內聯處理器方法
除了直接綁定到一個方法,也可以用內聯 JavaScript 語句
<div >
<button v-on:click="say('hi')">Say hi</button>
<button v-on:click="say('what')">Say what</button>
</div>
<script>
new Vue({
el: '#example-3',
methods: {
say: function (message) {
alert(message)
}
}
})
</script>
有時也需要在內聯語句處理器中訪問原生 DOM 事件。可以用特殊變量 $event 把它傳入方法:
<button v-on:click="warn('Form cannot be submitted yet.', $event)">Submit</button>
<script>
methods: {
warn: function (message, event) {
// 現在我們可以訪問原生事件對象
if (event) event.preventDefault()
alert(message)
}
}
</script>
事件修飾符
在事件處理程序中調用event.preventDefault()或event.stopPropagation()是常見的需求;盡管我們可以在
methods中輕鬆實現這點,但更好的方式是:methods隻有純粹的數據邏輯,而不是去處理DOM事件細節
為了解決這個問題,Vue.js為v-on提供了 事件修飾符;通過由點(.)表示的指令後綴來調用修飾符
eg.stop/.prevent/.capture/.self/.once
<!-- 阻止單擊事件冒泡 -->
<a v-on:click.stop="doThis"></a>
<!-- 提交事件不再重載頁麵 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修飾符可以串聯 -->
<a v-on:click.stop.prevent="doThat"></a>
<!-- 隻有修飾符 -->
<form v-on:submit.prevent></form>
<!-- 添加事件偵聽器時使用事件捕獲模式 -->
<div v-on:click.capture="doThis">...</div>
<!-- 隻當事件在該元素本身(比如不是子元素)觸發時觸發回調 -->
<div v-on:click.self="doThat">...</div>
使用修飾符時順序很重要;相應的代碼會以同樣的順序產生。因此用@click.prevent.self會阻止所有的點擊,而
@click.self.prevent隻會阻止元素上的點擊
<!-- 點擊事件將隻會觸發一次 -->
<a v-on:click.once="doThis"></a>
不像其它隻能對原生的DOM事件起作用的修飾符,.once修飾符還能被用到自定義的組件事件上
鍵值修飾符
在監聽鍵盤事件時,我們經常需要監測常見的鍵值;Vue允許為v-on在監聽鍵盤事件時添加關鍵修飾符:
<!-- 隻有在 keyCode 是 13 時調用 vm.submit() -->
<input v-on:keyup.13="submit">
記住所有的 keyCode 比較困難,所以 Vue 為最常用的按鍵提供了別名:
<!-- 同上 -->
<input v-on:keyup.enter="submit">
<!-- 縮寫語法 -->
<input @keyup.enter="submit">
全部的按鍵別名:.enter/.tab/.delete (捕獲“刪除”和“退格”鍵)/.esc/.space/.up/.down/.left/.right;
可以通過全局config.keyCodes對象自定義鍵值修飾符別名:
// 可以使用 v-on:keyup.f1
Vue.config.keyCodes.f1 = 112
修飾鍵
可以用如下修飾符開啟鼠標或鍵盤事件監聽,使在按鍵按下時發生響應:.ctrl/.alt/.shift/.meta
注意:在Mac係統鍵盤上meta對應命令鍵 (⌘)。在Windows係統鍵盤meta對應windows徽標鍵(⊞)。在Sun操作係統鍵
盤上meta對應實心寶石鍵 (◆)。在其他特定鍵盤上,尤其在MIT和Lisp鍵盤及其後續,比如Knight鍵盤,space-
cadet鍵盤,meta被標記為“META”。在Symbolics鍵盤上,meta被標記為“META”或“Meta”
<!-- Alt + C -->
<input @keyup.alt.67="clear">
<!-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>
修飾鍵比正常的按鍵不同;修飾鍵和keyup事件一起用時,事件引發必須按下正常的按鍵。換種說法:如果要引發
keyup.ctrl,必須按下ctrl時釋放其他的按鍵;單單釋放ctrl不會引發事件
滑鼠按鍵修飾符
.left/.right/.middle;這些修飾符會限製處理程序監聽特定的滑鼠按鍵
為什麼在html中監聽事件
你可能注意到這種事件監聽的方式違背了關注點分離(separation of concern)傳統理念。不必擔心,因為所有的Vue.js事件處理方法和表達式都嚴格綁定在當前視圖的ViewModel上,它不會導致任何維護上的困難。實際上,使用v-on有幾個好處:
1.掃一眼HTML模板便能輕鬆定位在JavaScript代碼裏對應的方法
2.你無須在JavaScript裏手動綁定事件,你的ViewModel代碼可以是非常純粹的邏輯,和DOM完全解耦,更易於測試
3.當一個ViewModel被銷毀時,所有的事件處理器都會自動被刪除。你無須擔心如何自己清理它們
最後更新:2017-08-13 22:25:04