一、阻止冒泡事件修饰符
什么是冒泡事件?在div嵌套的条件下,给所有div同时绑定click事件,点击最里面的div事件会一层一层由内向外触发父div的事件。事件从最里层的后代div逐层传出,这部分我们叫冒泡过程。
如何阻止事件冒泡,在vue修饰符中有一个指令为“ .stop” ,为内层的div绑定该指令,则可以解决冒泡事件。代码如下:
@click.stop="btnclick"
<body>
<div class="inner" @click="divclick" >
<input type="button" value="点击" @click.stop="btnclick">
</div>
</body>
</html>
<script src="vue-2.4.0.js"></script>
<script>
var vm = new Vue({
el:".inner",
data:{
msg:'触发了事件input',
msg1:'触发了事件div'
},
methods:{
btnclick(){ // 该方法 等同于btnclick:function(){ },简写省略了其中的 :function
console.log(this.msg);
},
divclick(){
console.log(this.msg1);
}
}
})
冒泡事件的应用场景:
我们在使用中多数情况下只使用冒泡监听。例如一条购物车信息,在这条信息中,右下角有一个删除按钮。点击这条消息可查看详情,点击删除按钮可将此商品移除。我们会分别给信息的div和删除button添加一个冒泡的click事件监听。如果不做阻止传递,点击删除button后,会显示商品详情。显然这不是我们想看到的。这时我们给button一个阻止事件传递的功能,点击删除按钮后,事件就会结束,就不再显示商品详情。
二、阻止默认行为修饰符 .prevent
当有链接的时候,链接会自动跳转,而prevent则是阻止链接的自动跳转,只触发当前事件。
<body>
<div class="inner" @click="divclick" >
<!-- 使用 .prevent 阻止默认行为 -->
<a href="http://www.baidu.com" @click.prevent="linkClick">有问题,先去百度</a>
</div>
</body>
</html>
<script src="vue-2.4.0.js"></script>
<script>
var vm = new Vue({
el:".inner",
data:{ },
methods:{
linkClick() {
console.log('触发了点击事件')
}
}
})
</script>
三、实现捕获触发事件的机制 .capture
当有两个div时,点击内层的触发事件,让其先获取外层的触发事件,再触发本身的div。
<!-- 使用 .capture 实现捕获触发事件的机制 -->
<!-- <div class="inner" @click.capture="div1Handler">
<input type="button" value="戳他" @click="btnHandler">
</div> -->
<script>
// 创建 Vue 实例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {},
methods: {
div1Handler() {
console.log('这是触发了 inner div 的点击事件')
},
btnHandler() {
console.log('这是触发了 btn 按钮 的点击事件')
}
}
});
</script>
四、实现自身触发 .self
只有点击当前元素时候,才会触发事件处理函数.。
.self只会阻止自己身上冒泡行为的触发,并不会真正阻止 冒泡的行为
<div class="inner" @click.self="div1Handler"> <input type="button" value="戳他" @click="btnHandler"> </div> <script> // 创建 Vue 实例,得到 ViewModel var vm = new Vue({ el: '#app', data: {}, methods: { div1Handler() { console.log('这是触发了 inner div 的点击事件') }, btnHandler() { console.log('这是触发了 btn 按钮 的点击事件') } } });
五、 使用 .once 只触发一次事件处理函数