在vue也可以綁定事件,開啟事件用v-on
並寫下想執行的js code
< tagName v-on:javascriptEvent="jsCode" >< /tagName >
縮寫
< tagName @javascriptEvent="jsCode" >< /tagName >
HTML
< div id="example-1" >
< button v-on:click="counter += 1" >Add 1< /button >
< p >The button above has been clicked {{ counter }} times.< /p >
< /div >
javascript
var example1 = new Vue({
el: '#example-1',
data: {
counter: 0
}
})
Result
The button above has been clicked {{ counter }} times.
很複雜的話...做成function嘛
HTML< div id="example-2" >
< !-- `greet` is the name of a method defined below -- >
< button v-on:click="greet" >Greet< /button >
< /div >
Javasctipt
var example2 = new Vue({
el: '#example-2',
data: {
name: 'Vue.js'
},
// define methods under the `methods` object
methods: {
greet: function (event) {
// `this` inside methods points to the Vue instance
alert('Hello ' + this.name + '!')
// `event` is the native DOM event
if (event) {
alert(event.target.tagName)
}
}
}
})
Result
你也可以在console
執行這一行,會跳出對話框,顯示 Hello Vue.js!
example2.greet()
可以直接在HTML的inline丟js的參數
HTML< div id="example-3" >
< button v-on:click="say('hi')" >Say hi< /button >
< button v-on:click="say('what')" >Say what< /button >
< /div >
Javascript
new Vue({
el: '#example-3',
methods: {
say: function (message) {
alert(message)
}
}
})
Result
還可以用$event
呼叫原生的event callback function的參數
此例就送出了一個submit,但是取消了預設行為,所以不會跳頁。
HTML< div id="example-3-1" >
< button v-on:click = "warn('Form cannot be submitted yet.', $event)" >
Submit
< /button >
< /div >
Javascript
new Vue({
el: '#example-3-1',
methods: {
warn : function ( message, event ) {
// 現在我們可以訪問原生事件對象
if (event) event.preventDefault()
alert(message)
}
}
})
Result
事件有時需要event.preventDefault()
(取消預設行為)或event.stopPropagation()
(停止漣波效應)之類的,這往往和我們寫的邏輯混在一起。
最理想的情況是,邏輯歸邏輯、事件細節歸事件細節!!!
為了解決這個問題Vue提供「事件修飾符」,在事件名稱後加上.
來呼叫
.stop
.prevent
.capture
.self
.once
(能用在組件,其它不行)兩層都有click,外層執行×2,內層執行+1
counter: {{ counter }}
指定鍵盤的鍵。
< !-- 只有在keyCode 是13 時呼叫vm.submit() -- >
< input v-on:keyup.13 = "submit" >
還有為特別的鍵提供別名
.enter
.tab
.delete
(捕獲delete
和backspace
).esc
.space
.up
.down
.left
.right
點一下,+1
按enter, +1counter: {{ counter }}
你也可以自訂別名(全域設定)
// enable v-on:keyup.f1
Vue.config.keyCodes.f1 = 112
還支援Ctrl等...的操作
.ctrl
.alt
.shift
.meta
點一下,+1
counter: {{ counter }}
其中meta
在各個鍵盤上的定義有些許不同。可以看看官網文件
使用上,是按下ctrl
再keyup
其它指定的鍵,才會觸發method
< !-- Alt + C -- >
< input @keyup.alt.67="clear" >
< !-- Ctrl + Click -- >
< div @click.ctrl="doSomething" >Do something< /div >
滑鼠的左鍵、中鍵、右鍵
.left
.right
.middle
點一下,+1
counter: {{ counter }}
這看似違背關注點分離的做法,其實有它的好處。
傳統的做法上,js歸js,html歸html,使得js上混著事件細節、畫面邏輯,而且該function都是全域的。
在Vue的做上,所有的邏輯都自己寫,所有的事件細節交給Vue,該function都在Vue物件中,不會是全域的。
官網文件提出了幾個解釋