方法與事件處理器html
方法處理器測試
能夠用 v-on 指令監聽 DOM 事件:this
1
2
3
|
<
div
id
=
"example"
>
<
button
v-on:click
=
"greet"
>Greet</
button
>
</
div
>
|
咱們綁定了一個單擊事件處理器到一個方法 greet。下面在 Vue 實例中定義這個方法:spa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
var
vm =
new
Vue({
el:
'#example'
,
data: {
name:
'Vue.js'
},
// 在 `methods` 對象中定義方法
methods: {
greet:
function
(event) {
// 方法內 `this` 指向 vm
alert(
'Hello '
+
this
.name +
'!'
)
// `event` 是原生 DOM 事件
alert(event.target.tagName)
}
}
})
// 也能夠在 JavaScript 代碼中調用方法
vm.greet()
// -> 'Hello Vue.js!'
|
內聯語句處理器code
除了直接綁定到一個方法,也能夠用內聯 JavaScript 語句:orm
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<div id=
"example-2"
>
<button v-on:click=
"say('hi')"
>Say Hi</button>
<button v-on:click=
"say('what')"
>Say What</button>
</div>
new
Vue({
el:
'#example-2'
,
methods: {
say:
function
(msg) {
alert(msg)
}
}
})
|
相似於內聯表達式,事件處理器限制爲一個語句。htm
有時也須要在內聯語句處理器中訪問原生 DOM 事件。能夠用特殊變量 $event 把它傳入方法:對象
1
|
<
button
v-on:click
=
"say('hello!', $event)"
>Submit</
button
>
|
1
2
3
4
5
6
7
|
// ...
methods: {
say:
function
(msg, event) {
// 如今咱們能夠訪問原生事件對象
event.preventDefault()
}
}
|
事件修飾符事件
在事件處理器中常常須要調用 event.preventDefault() 或 event.stopPropagation()。儘管咱們在方法內能夠輕鬆作到,不過讓方法是純粹的數據邏輯而不處理 DOM 事件細節會更好。ip
爲了解決這個問題,Vue.js 爲 v-on 提供兩個 事件修飾符:.prevent 與 .stop。你是否還記得修飾符是點號打頭的指令後綴?
1
2
3
4
5
6
7
8
9
10
11
|
<!-- 阻止單擊事件冒泡 -->
<
a
v-on:click.stop
=
"doThis"
></
a
>
<!-- 提交事件再也不重載頁面 -->
<
form
v-on:submit.prevent
=
"onSubmit"
></
form
>
<!-- 修飾符能夠串聯 -->
<
a
v-on:click.stop.prevent
=
"doThat"
>
<!-- 只有修飾符 -->
<
form
v-on:submit.prevent></
form
>
|
1.0.16 添加了兩個額外的修飾符:
1
2
3
4
5
|
<!-- 添加事件偵聽器時使用 capture 模式 -->
<
div
v-on:click.capture
=
"doThis"
>...</
div
>
<!-- 只當事件在該元素自己(而不是子元素)觸發時觸發回調 -->
<
div
v-on:click.self
=
"doThat"
>...</
div
>
|
按鍵修飾符
在監聽鍵盤事件時,咱們常常須要檢測 keyCode。Vue.js 容許爲 v-on 添加按鍵修飾符:
1
2
|
<!-- 只有在 keyCode 是 13 時調用 vm.submit() -->
<
input
v-on:keyup.13
=
"submit"
>
|
記住全部的 keyCode 比較困難,Vue.js 爲最經常使用的按鍵提供別名:
1
2
3
4
5
|
<!-- 同上 -->
<
input
v-on:keyup.enter
=
"submit"
>
<!-- 縮寫語法 -->
<
input
@
keyup.enter
=
"submit"
>
|
所有的按鍵別名:
1
2
3
4
5
6
7
8
9
|
enter
tab
delete
esc
space
up
down
left
right
|
1.0.8+: 支持單字母按鍵別名。
1.0.17+: 能夠自定義按鍵別名:
1
2
|
// 可使用 @keyup.f1
Vue.directive(
'on'
).keyCodes.f1 = 112
|
爲何在 HTML 中監聽事件?
你可能注意到這種事件監聽的方式違背了傳統理念 「separation of concern」。沒必要擔憂,由於全部的 Vue.js 事件處理方法和表達式都嚴格綁定在當前視圖的 ViewModel 上,它不會致使任何維護困難。實際上,使用 v-on 有幾個好處:
1.掃一眼 HTML 模板便能輕鬆定位在 JavaScript 代碼裏對應的方法。
2.由於你無須在 JavaScript 裏手動綁定事件,你的 ViewModel 代碼能夠是很是純粹的邏輯,和 DOM 徹底解耦,更易於測試。
3.當一個 ViewModel 被銷燬時,全部的事件處理器都會自動被刪除。你無須擔憂如何本身清理它們。