Vue.js — 事件处理
1.事件处理
1.1 监听事件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
</style>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<button v-on:click="counter += 1">加1</button>
<p>点击了{{counter}}次。</p>
<button @click="greet">打招呼</button>
<button @click="say('Hello')">Hello</button>
</div>
<script>
new Vue({
el: '#app',
data: {
counter: 0,
name: '张三'
},
methods: {
greet: function(event){
console.log('你好,' + this.name + '!') // 你好,张三!
if(event){
console.log(event.target.tagName) // BUTTON
}
},
say: function(message){
console.log(message);
}
}
})
</script>
</body>
</html>
我们可以使用$event
访问到原始的DOM事件。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
</style>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<button @click="test('Hello', $event)">点击按钮</button>
</div>
<script>
new Vue({
el: '#app',
data: {
counter: 0,
name: '张三'
},
methods: {
test: function(message, event){
if(event){
console.log(event.target.textContent); // 点击按钮
console.log(message); // Hello
}
}
}
})
</script>
</body>
</html>
注意:调用method时不传参数的话,其实method可以接收到原始的DOM事件;如果调用method时需要传其他参数,则需要显式地将$event
作为参数传入才能访问到原始的DOM事件。
1.2 事件修饰符
Vue.js 为v-on
提供了事件修饰符。
.stop
.prevent
.capture
.self
.once
.passive
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
</style>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<div style="width:200px;height:200px;background:gray;" @click="test1">
<div style="width:100px;height:100px;background:blue;" @click.stop="test2"></div>
</div>
</div>
<script>
new Vue({
el: '#app',
data: {
},
methods: {
test1: function(){
alert('外面');
},
test2: function(){
alert('里面');
}
}
})
</script>
</body>
</html>
注意到@click.stop="test2"
使用了事件修饰符.stop
,其作用是防止事件冒泡。
提示:事件修饰符可以串联,比如<a v-on:click.stop.prevent="doThat"></a>
。
1.3 按键修饰符
Vue 允许为v-on
在监听键盘事件时添加按键修饰符。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
</style>
<script src="https://cdn.staticfile.org/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id="app">
<input type="text" @keyup.13="test">
<input type="text" @keyup.enter="test">
</div>
<script>
new Vue({
el: '#app',
data: {
},
methods: {
test: function(event){
console.log(event.keyCode);
console.log(event.target.value);
}
}
})
</script>
</body>
</html>
注意到@keyup.13
的13是按键码,@keyup.enter
的enter是按键码的别名。
keyCode
是按键码,为了在必要的情况下支持旧浏览器,Vue 提供了绝大多数常用的按键码的别名。
.enter
.tab
.delete
.esc
.space
.up
.down
.left
.right
我们可以通过全局config.keyCodes
对象自定义按键修饰符别名。
// 可以使用 `v-on:keyup.f1`
Vue.config.keyCodes.f1 = 112
1.4 系统修饰键
.ctrl
.alt
.shift
.meta
.meta
在Windows系统中是Win键(⊞)。
<!-- Alt + C -->
<input @keyup.alt.67="clear">
<!-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>
<!-- 即使 Alt 或 Shift 被一同按下时也会触发 -->
<button @click.ctrl="onClick">A</button>
<!-- 有且只有 Ctrl 被按下的时候才触发 -->
<button @click.ctrl.exact="onCtrlClick">A</button>
<!-- 没有任何系统修饰符被按下的时候才触发 -->
<button @click.exact="onClick">A</button>
鼠标按钮修饰符:
.left
.right
.middle
参考: