Vue事件捕获方式(capture修饰符)

 更新时间:2025年06月17日 14:08:05   作者:WZMeiei  
这篇文章主要介绍了Vue事件捕获方式(capture修饰符),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、先理解 DOM 事件的 “传播三阶段”

当你点击一个按钮,浏览器处理事件分 3 步(像 “快递送货”,有固定流程):

阶段行为描述类比场景
捕获阶段事件从 document 出发,由外到内找目标(父元素 → 子元素)快递从省会 → 市 → 区 → 小区
目标阶段找到目标元素(比如按钮自己),执行事件快递送到你家门口
冒泡阶段事件从目标元素出发,由内到外向上传播(子元素 → 父元素 → 更外层父元素)你取到快递后,消息从家 → 小区 → 区 → 市

二、默认情况:事件在 “冒泡阶段” 触发

Vue 里写 @click="xxx",默认监听的是 冒泡阶段 的事件。

示例(无 capture 修饰符):

<div class="parent" @click="parentClick">
  父元素
  <button class="child" @click="childClick">子元素(按钮)</button>
</div>
methods: {
  parentClick() { console.log('父元素(冒泡阶段)触发'); },
  childClick() { console.log('子元素(冒泡阶段)触发'); }
}

执行顺序(点击按钮):

  1. 进入捕获阶段:父元素没加 capture,所以捕获阶段不触发 parentClick
  2. 进入目标阶段:触发按钮自己的点击(但按钮逻辑在冒泡阶段,所以这一步不算 “触发方法”)。
  3. 进入冒泡阶段:先触发子元素的 childClick → 再触发父元素的 parentClick

控制台输出:

子元素(冒泡阶段)触发  
父元素(冒泡阶段)触发  

三、加 capture 修饰符:强制 “捕获阶段” 触发

给父元素加 @click.capture,让父元素的事件 在捕获阶段就触发,改变执行顺序。

示例(加 capture 修饰符):

<div class="parent" @click.capture="parentCapture">
  父元素
  <button class="child" @click="childBubble">子元素(按钮)</button>
</div>
methods: {
  parentCapture() { console.log('父元素(捕获阶段)触发'); },
  childBubble() { console.log('子元素(冒泡阶段)触发'); }
}

执行顺序(点击按钮):

  1. 进入捕获阶段:父元素加了 capture,所以先触发 parentCapture
  2. 进入目标阶段:触发按钮自己的点击(不影响方法顺序)。
  3. 进入冒泡阶段:触发子元素的 childBubble

控制台输出:

父元素(捕获阶段)触发  
子元素(冒泡阶段)触发  

四、核心区别:“捕获阶段” vs “冒泡阶段”

场景触发顺序(点击子元素)关键逻辑
无 capture子(冒泡) → 父(冒泡)默认是冒泡阶段
父加 capture父(捕获) → 子(冒泡)父元素 “插队” 到捕获阶段执行

五、再举个极端例子(多层嵌套)

<div class="grandpa" @click.capture="grandpaCapture">
  爷爷元素
  <div class="parent" @click.capture="parentCapture">
    爸爸元素
    <button class="child" @click="childBubble">孙子按钮</button>
  </div>
</div>
methods: {
  grandpaCapture() { console.log('爷爷(捕获)触发'); },
  parentCapture() { console.log('爸爸(捕获)触发'); },
  childBubble() { console.log('孙子(冒泡)触发'); }
}

执行顺序(点击孙子按钮):

  1. 捕获阶段:爷爷(最外层)→ 爸爸(中间层)→ 孙子(目标)
    → 先触发 grandpaCapture → 再触发 parentCapture
  2. 目标阶段:触发孙子按钮(无 capture,不影响)
  3. 冒泡阶段:触发 childBubble

控制台输出:

爷爷(捕获)触发  
爸爸(捕获)触发  
孙子(冒泡)触发  

六、一句话总结 capture

capture 修饰符的作用是:让事件在 “捕获阶段” 就触发,改变默认的 “冒泡阶段触发” 顺序,实现 父元素优先响应(不管子元素有没有触发,父元素先执行自己的逻辑)。

记住一个关键点:

  • 默认是 “子 → 父”(冒泡)
  • capture 是 “父 → 子”(捕获)

@click.capture,相当于是是改变事件传播顺序的 “插队符”

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue实现push数组并删除的例子

    Vue实现push数组并删除的例子

    今天小编就为大家分享一篇Vue实现push数组并删除的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Element el-table 表格使用详解

    Element el-table 表格使用详解

    我们的数据存储到数据库,不就是以表格的形式存在吗,所以在界面上显示、操作,使用表格来处理也是非常合理的,这篇文章给大家介绍Element el-table 表格使用方法,感兴趣的朋友一起看看吧
    2024-03-03
  • 记录vue做微信自定义分享的一些问题

    记录vue做微信自定义分享的一些问题

    这篇文章主要介绍了记录vue做微信自定义分享的一些问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • vue子组件通过.sync修饰符修改props属性方式

    vue子组件通过.sync修饰符修改props属性方式

    这篇文章主要介绍了vue子组件通过.sync修饰符修改props属性方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • VUE 3D轮播图封装实现方法

    VUE 3D轮播图封装实现方法

    这篇文章主要为大家详细介绍了VUE 3D轮播图封装实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • vue webpack实用技巧总结

    vue webpack实用技巧总结

    本篇文章给大家总结了vue+webpack的实用技巧以及相关实例代码分享,有兴趣的朋友可以参考学习下。
    2018-04-04
  • 在Vue3项目中安装和配置Three.js的操作代码

    在Vue3项目中安装和配置Three.js的操作代码

    Three.js是一个轻量级的WebGL封装库,用于在浏览器中渲染复杂的3D图形,它提供了便捷的API,可以快速构建3D场景、对象和动画,Vue.js是一个渐进式JavaScript框架,擅长构建用户界面,本文给大家介绍了在Vue3项目中安装和配置Three.js的操作,需要的朋友可以参考下
    2024-12-12
  • vue-jsonp的使用及说明

    vue-jsonp的使用及说明

    这篇文章主要介绍了vue-jsonp的使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • vue-echarts如何实现图表组件封装详解

    vue-echarts如何实现图表组件封装详解

    由于在项目中需要对数据进行可视化处理,也就是用图表展示,所以下面这篇文章主要给大家介绍了关于vue-echarts如何实现图表组件封装的相关资料,需要的朋友可以参考下
    2022-05-05
  • Vant Uploader实现上传一张或多张图片组件

    Vant Uploader实现上传一张或多张图片组件

    这篇文章主要为大家详细介绍了Vant Uploader实现上传一张或多张图片组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09

最新评论