# Vue2教程 - 5 事件修饰符
前面介绍了可以使用 v-on 指令绑定事件。下面介绍一下事件修饰符。
# 5.1 +.stop
阻止冒泡。
<!-- 结构 -->
<template>
  <div id="root">
    <!-- 使用  .stop  阻止冒泡 -->
    <div @click="div1Handler">
      <button @click.stop="btnHandler">点我</button>
    </div>
  </div>
</template>
<!-- 脚本 -->
<script>
export default {
  name: 'App',
  methods: {  // // 这个methods属性中定义了当前Vue实例所有可用的方法
    div1Handler: function () {
      console.log("点击了div")
    },
    btnHandler: function () {
      console.log("点击了button")
    }
  },
}
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
如上面的代码,在一个div中有一个按钮,同时给div和按钮添加了点击事件,当点击按钮的时候,会先触发按钮的点击事件,然后再触发div的点击事件,事件是从内部元素向上冒泡的,如果想阻止触发div的点击事件,可以给按钮的点击事件添加 .stop 修饰符,阻止事件冒泡,这样就只会触发按钮的点击事件了。
# 5.2 +.prevent
阻止默认事件。
<!-- 结构 -->
<template>
  <div id="root">
    <!-- 使用 .prevent 阻止默认行为 -->
    <a href="http://www.baidu.com" @click.prevent="clickLink">有问题,先百度</a>
  </div>
</template>
<!-- 脚本 -->
<script>
export default {
  name: 'App',
  methods: {  // // 这个methods属性中定义了当前Vue实例所有可用的方法
    clickLink: function () {
      console.log("点击了链接")
    }
  },
}
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
在上面的代码中有一个 a标签 ,a标签 有一个默认事件是跳转到百度,如果想阻止跳转到百度,可以添加一个点击事件,并添加 .prevent 修饰符阻止 a标签 的默认事件。这样点击 a标签 只会调用点击事件的方法, 这样在方法中处理我们的逻辑就可以了。
使用同样的方式,也可以阻止表单的默认事件等。
# 5.3 +.capture
添加事件侦听器时使用事件捕获模式。
<!-- 结构 -->
<template>
  <div id="root">
    <!-- 使用 .capture 实现捕获触发事件的机制 -->
    <div @click.capture="div1Handler">
        <input type="button" value="点我" @click.stop="btnHandler">
    </div>
  </div>
</template>
<!-- 脚本 -->
<script>
export default {
  name: 'App',
  methods: {  // // 这个methods属性中定义了当前Vue实例所有可用的方法
    div1Handler: function () {
      console.log("点击了div")
    },
    btnHandler: function () {
      console.log("点击了button")
    }
  },
}
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
事件的默认传递是冒泡方式的,是从内部往外部传递的。如果想事件由外向内传递,可以使用 .capture 修饰符来实现捕获触发事件。在上面的代码中,在外部的div的点击事件上添加了.capture 修饰符,那么会先触发div的点击事件。
# 5.4 +.self
只当事件在该元素本身(比如不是子元素)触发时触发回调。
<!-- 结构 -->
<template>
  <div id="root">
    
    <!-- 使用 .self 实现只有点击当前元素时候,才会触发事件处理函数 -->
    <div class="inner" @click.self="div1Handler">
        <input type="button" value="点我" @click="btnHandler">
    </div>
    
  </div>
</template>
<!-- 脚本 -->
<script>
export default {
  name: 'App',
  methods: {  // // 这个methods属性中定义了当前Vue实例所有可用的方法
    div1Handler: function () {
      console.log("点击了div")
    },
    btnHandler: function () {
      console.log("点击了button")
    }
  },
}
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
在外部div元素的事件上添加 .self 修饰符后,只有在点击div本身才会触发div的事件,点击其中的元素不会触发div的事件。
.self 不能阻止内部事件的冒泡,当有多层元素嵌套时,点击了内部元素,本层元素添加了.self 修饰,则本层元素不会接受到事件,但是事件会继续冒泡到更外部元素。
.stop 是点击内部元素时,阻止事件向上传递,效果是点击外部元素本身才会触发外部元素的事件。
.self 也是点击外部元素本身才会触发外部元素的事件,那么 .stop 和 .self 什么区别呢?
.stop 是作用在子元素上的,只会阻止某一个子元素的事件不向上传递;而 .self 是作用在外部元素上的,那么内部所有元素的事件都不会触发外部元素的事件,只监听自身元素的事件。
# 5.5 +.once
事件只触发一次。
<!-- 结构 -->
<template>
  <div id="root">
    <!-- 使用 .once 只触发一次事件处理函数 -->
    <a href="http://www.baidu.com" @click.prevent.once="clickLink">有问题,先百度</a>
  </div>
</template>
<!-- 脚本 -->
<script>
export default {
  name: 'App',
  methods: {  // // 这个methods属性中定义了当前Vue实例所有可用的方法
    clickLink: function () {
      console.log("点击了链接")
    }
  },
}
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
使用 .once 只会触发一次函数处理,修饰符可以串联起来使用。
像上面的代码只会在点击 a标签 的第一次阻止默认事件,当再次点击 a标签 就不会阻止默认事件了,而是会跳转到百度。
← 04-指令 06-Vue中使用样式 →
