Vue 事件修饰符

384 阅读2分钟

当我们没有使用事件修饰的时候,事件可能会发生像外层溢出的情况,举个例子

<template>
    <div class="box1" @click="clickBox1">
        box1
        <div class="box2" @click="clickBox2">
            box2
            <div class="box3" @click="clickBox3">
                box3
            </div>
        </div>
    </div>
</template>

给这三个框设置一下样式,使他们颜色不相同,便于区分

<style>
    .box1{
        height: 300px;
        width: 300px;
        background-color: skyblue;
        line-height: 50px;
    }
    .box2{
        height: 200px;
        width: 200px;
        background-color: beige;
    }
    .box3{
        height: 100px;
        width: 100px;
        background-color: yellow;
    }
</style>

点击事件

<script>
export default {
  methods:{
    clickBox1(){ console.log('我是Box1');},
    clickBox2(){ console.log('我是Box2');},
    clickBox3(){ console.log('我是Box3');}
  }
}
</script>

当我们点击最里层 class="box3" 的div时,会依次触发clickBox3、clickBox2、clickBox1方法

image.png

.stop

.stop 阻止事件冒泡

还是刚刚那个例子 在这里我们给Box3添加.stop事件

<div class="box3" @click.stop="clickBox3">box3</div>

image.png

这时候点击 class="box3" 盒子时,就只会触发clickBox3方法

.prevent

.prevent 阻止默认行为,提交事件不再重载页面

在这里,我们举个例子:

 <a href="https://www.baidu.com" @click="linkClick">百度链接</a>
 <a href="https://www.baidu.com" @click.prevent="linkClick">百度链接</a>
 
 linkClick(){
    console.log("百度链接");     
},

前者执行 linkClick 函数并跳转到百度页面, 后者执行 linkClick 函数但不跳转页面

image.png

.once

.once 只触发一个事件处理函数

例如当使用 prevent 修饰符, 会一直阻止默认行为,但使用 once 后只会阻止一次默认行为,也就是我们再次点击这个百度链接后会进行跳转

<a href="https://www.baidu.com" @click.prevent.once="linkClick">百度链接</a>

.capture

.capture 实现捕获触发事件的机制,即内部元素触发的事件先在此处理,然后才交由内部元素进行处理

    <div class="box1" @click="clickBox1">
        <div class="box2" @click.capture="clickBox2">
            <div class="box3" @click="clickBox3">
            </div>
        </div>
    </div>

image.png

这时候点击 class="box3" 的div时, 触发方法的先后顺序改变,会先执行clickBox2方法

.self

.self 只有点击当前元素的时候才会触发事件处理函数

我们将 box2 设置 .self 看看效果

发现点击box3盒子时, 触发 clickBox3、 clickBox1 方法;

image.png 点击box2盒子时, 触发 clickBox2、 clickBox1 方法

image.png ;即使用.self修饰符,只有点击这个方法才会触发

使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。

.passive

该修饰符表示就是设置{passive:true},表示处理事件函数中不会调用preventDefault函数(如果事件是可取消的,则 preventDefault() 方法会取消该事件,这意味着属于该事件的默认操作将不会发生),就会减少了额外的监听,从而提高了性能;所以不能和.prevent修饰符一同使用,否则浏览器会报错。

注意:

不要把 .passive 和 .prevent 一起使用,因为 .prevent 将会被忽略,同时浏览器可能会向你展示一个警告。.passive 会告诉浏览器你不想阻止事件的默认行为。