<div id="app">
<button v-on:click='count+=1'>点击+1</button>
<p>被点击了{{ count }}次</p>
</div>
<script>
const vm = new Vue({
el: '#app',
data: {
count: 0
}
});
</script>
<div id="app">
<button v-on:click='addCount'>点击+1</button>
<p>被点击了{{ count }}次</p>
</div>
<script>
const vm = new Vue({
el: '#app',
data: {
count: 0
},
methods: {
addCount(){
this.count += 1;
console.log(e.target);
}
}
});
</script>
<div id="app">
<button v-on:click='addCount(2,$event)'>点击+1</button>
<p>被点击了{{ count }}次</p>
</div>
<script>
const vm = new Vue({
el: '#app',
data: {
count: 0
},
methods: {
addCount(n,e){
this.count += n;
console.log(e.target);
}
}
});
</script>
<div id="app">
<button v-on:[event]="addCount(2)">点击,弹出1</button>
<p>被点击了{{ count }}次</p>
</div>
<script>
const vm = new Vue({
el: '#app',
data: {
count: 0,
event: 'click'
},
methods: {
addCount(n) {
this.count += n;
}
}
})
</script>
<div v-on="{ mousedown: doThis, mouseup: doThat }"></div>
@
<div id="app">
<button @click="addCount(2)">点击,弹出1</button>
<p>被点击了{{ count }}次</p>
</div>
这里修饰符很多,不用过多记忆,保留一定印象,遇到问题时翻阅笔记即可
调用 event.stop,阻止事件冒泡
<div id="app">
<div @click="alert('div')" :style="{backgroundColor: 'red'}">
<button @click.stop="alert('button')">点击</button>
</div>
</div>
<script>
const vm = new Vue({
el: '#app',
data: {
count: 0
},
methods: {
alert(str) {
alert(str);
}
}
});
</script>
调用 event.preventDefault(),阻止默认事件
<div id="app">
<form @submit.prevent="onSubmit">//提交时页面不再刷新
<input type="submit">
</form>
<!-- 也可以只有修饰符 -->
<form @submit.prevent>
<input type="submit">
</form>
</div>
<script>
const vm = new Vue({
el: '#app',
data: {
count: 0
},
methods: {
onSubmit() {
console.log('submit');
}
}
});
</script>
事件捕获模式
<div id="app">
<div @click.capture="alert('div')" :style="{backgroundColor: 'red'}">
<button @click="alert('button')">点击</button>//会先触发div
</div>
</div>
<script>
const vm = new Vue({
el: '#app',
data: {
count: 0
},
methods: {
alert(str) {
alert(str);
}
}
});
</script>
只当事件是从侦听器绑定的元素本身触发时才触发回调
<div id="app">
<div @click.self="alert('div')" :style="{backgroundColor: 'red'}">//冒泡时不再触发
<button @click="alert('button')">点击</button>
</div>
</div>
<script>
const vm = new Vue({
el: '#app',
data: {
count: 0
},
methods: {
alert(str) {
alert(str);
}
}
});
</script>
只触发一次回调(2.1.4新增)
点击两次button按钮,只弹出一次button
<div id="app">
<button @click.once="alert('button')">点击</button>
</div>
设置 addEventListener 中的 passive 选项,能够提升移动端的性能(2.3.0新增)
//手机浏览器,如果不监听默认事件,则屏幕内容跟着手指滑动,否则等滑动结束后屏幕再滑动
<div @click.passive="handleClick" :style="{backgroundColor: 'red'}"></div>
即使在触发触摸事件时,执行了一个空的函数,也会让页面卡顿。因为浏览器不知道监听器到底会不会阻止默认事件,所以浏览器要等到执行完整个函数后,才能决定是否要滚动页面。passive事件监听器,允许开发者告诉浏览器,监听器不会阻止默认行为,从而浏览器可以放心大胆的滚动页面,这样可以大幅度提升移动端页面的性能,因为据统计只有20%的触摸事件会阻止默认事件。
.passive 会告诉浏览器你不想阻止事件的默认行为
注意
在监听键盘事件时,我们经常需要检查详细的按键。Vue 允许为 v-on 在监听键盘事件时添加按键修饰符
<input v-on:keyup.enter="submit">
你可以直接将 KeyboardEvent.key 暴露的任意有效按键名转换为 kebab-case 来作为修饰符。
<input v-on:keyup.page-down="onPageDown">
在上述示例中,处理函数只会在 $event.key 等于 PageDown 时被调用。
使用 keyCode 特性也是允许的:
<input v-on:keyup.13="submit">
注意:keyCode 的事件用法已经被废弃了,并可能不会被最新的浏览器支持。
为了在必要的情况下支持旧浏览器,Vue 提供了绝大多数常用的按键码的别名:
除了使用Vue提供的按键别名之外,还可以自定义按键别名:
// 全局配置
// 可以使用 `v-on:keyup.f1`
Vue.config.keyCodes.f1 = 112
Vue.config.keyCodes = {
v: 86,
f1: 112,
// 小驼峰 不可用
mediaPlayPause: 179,
// 取而代之的是 短横线分隔 且用双引号括起来
"media-play-pause": 179,
up: [38, 87]
}
<input type="text" @keyup.media-play-pause="method">
可以用如下修饰符来实现仅在按下相应按键时才触发鼠标或键盘事件的监听器。
修饰键与常规按键不同,在和 keyup 事件一起用时,事件触发时修饰键必须处于按下状态,换句话说,只有在按住 ctrl 的情况下释放其它按键,才能触发 keyup.ctrl。而单单释放 ctrl 也不会触发事件。如果你想要这样的行为,请为 ctrl 换用 keyCode:keyup.17。
<input @keyup.alt.67="clear">
<div @click.ctrl="doSomething">Do somethingdiv>
<button @click.ctrl="onClick">Abutton>
<button @click.ctrl.exact="onCtrlClick">Abutton>
<button @click.exact="onClick">Abutton>