Vue框架学习笔记——事件修饰符
文章目录
- 前文提要
- 事件修饰符
- prevent(常用)
- stop(不常用)
- 事件冒泡
- stop使用方法
- 三层嵌套下的stop
- 三层嵌套看出的stop:
- once(常用)
- capture(不常用)
- self(不常用)
- 思考点,事件是否被阻止传播
- passive(不常用)
- 修饰符叠加
前文提要
本人仅做个人学习记录,如有错误,请多包涵
参考链接:面试官:Vue常用的修饰符有哪些有什么应用场景
事件修饰符
在前文提到了“事件处理”后,我们可以为标签绑定事件,事件也存在着六种修饰符,称为事件修饰符。
它们分别是:prevent、stop、once、capture、self、passive,这些标签具有不同的功能,可以为事件 叠加事件修饰符使用。
前三个常用,后三个了解就好。
prevent(常用)
prevent可以阻止标签的默认行为,例如
<a href="http://www.baidu.com">超链接</a>
当你点击上面代码呈现的超链接的时候,回跳转到百度的首页。
但是当你为这个绑定鼠标点击事件并且添加prevent修饰符的时候(回调函数不一定要添加),则会阻止这个默认行为。也就是,点击过后什么都不会发生,如果添加了回调函数,则响应回调函数,但仍然不会跳转。
<a href="http://www.baidu.com" @click.prevent>超链接</a>
stop(不常用)
事件冒泡
stop修饰符用来阻止事件冒泡,事件冒泡是从内向外的。
当一个标签被另一个标签包含的时候,二者都有着相同的触发事件,例如鼠标点击,当你触发内部的标签的时候,也会触发外部标签的事件,从而触发多遍。
Vue存在两个阶段,捕获阶段和冒泡阶段,先捕获阶段,从外向内,事件传递;后冒泡阶段,从内向外。
默认在冒泡阶段处理事件,从而判断是否触发事件,触发回调函数,所以
回调函数的触发顺序默认也是由内向外的。
样例代码:
在这里插入代码片<body><div id="box" @click="showInfo1" style="background-color:rgb(208, 255, 0);height:50px"><button @click="showInfo2" style="background-color:rgb(0, 255, 13)">点我触发事件</button></div><script type="text/javascript">Vue.config.productionTip = falseconst vm = new Vue({el: '#box',methods: {showInfo1() {console.log(1)},showInfo2() {console.log(2)}}})</script>
</body>
呈现效果如下:

当你点击div标签区域的时候会触发鼠标点击事件,从而调用函数showInfo1,控制台输出1

但是当你点击div标签内部的按钮时,效果则不一样。

控制台先输出2,后输出1。
可以看出,内部按钮先触发事件,外部的div标签后触发事件,这就是事件冒泡,你可以想象一个气泡从下部跑到上部,就是事件从内部到外部传递,回调函数从内向外顺序触发。。
stop使用方法
修改代码,改成下述样式(其余不变)
<div id="box" @click="showInfo1" style="background-color:rgb(208, 255, 0);height:50px"><button @click.stop="showInfo2" style="background-color:rgb(0, 255, 13)">点我触发事件</button></div>

则不会触发事件冒泡,这是两层的情况,在内部那层书写stop,从而阻止事件冒泡。
三层嵌套下的stop
<body><div id="box" @click="showInfo1" style="background-color:rgb(208, 255, 0);height:50px"><h1 @click="showInfo2" style="background-color:rgb(255, 0, 0)"><button @click.stop="showInfo3" style="background-color:rgb(0, 255, 13)">点我触发事件</button></h1></div><script type="text/javascript">Vue.config.productionTip = falseconst vm = new Vue({el: '#box',methods: {showInfo1() {console.log(1)},showInfo2() {console.log(2)},showInfo3() {console.log(3)}}})</script>
</body>
三层中,最里面的标签中加入了stop事件修饰符,其余两层没有。
呈现效果如下:

当你点击按钮的时候,呈现效果如下:

事件冒泡在添加了stop修饰符的这层直接被阻止,后面两层根本不会事件冒泡。
当你点击第二层的h1标签,也就是红色那层没添加stop的时候,呈现效果如下:

点击中间第二层没添加过stop修饰符,后面两层仍然可以触发事件冒泡,最里面那层的stop修饰符,并不能管到整个嵌套的结构。
再次修改代码(其余部分不变):
<div id="box" @click="showInfo1" style="background-color:rgb(208, 255, 0);height:50px"><h1 @click.stop="showInfo2" style="background-color:rgb(255, 0, 0)"><button @click="showInfo3" style="background-color:rgb(0, 255, 13)">点我触发事件</button></h1></div>
三层嵌套中,只在中间的第二层添加stop事件修饰符,最里层和最外层不添加stop。
点击按钮,呈现效果如下:
嘴里
最里层触发的事件,会冒泡到第二层,触发事件后,才被阻止继续冒泡。
如果点击中间的h1标签层,呈现效果如下:

点击中间层触发事件,事件则会直接在这层被阻止,不会继续事件冒泡,不会到第三层。
三层嵌套看出的stop:
stop修饰符,仅能阻止事件在当前标签触发后,不会继续冒泡传播。
不会管前一层触发的事件如何传播,也不会管触发在这层之外的嵌套层触发的事件会不会接着冒泡。
once(常用)
once能够让事件仅能够触发一次。
如果代码写成这样:
<body><div id="box"><button @click="showInfo">点我触发事件</button></div><script type="text/javascript">Vue.config.productionTip = falseconst vm = new Vue({el: '#box',methods: {showInfo() {console.log(1)}}})</script>
</body>
那么可以点击按钮多次,从而多次触发鼠标点击事件,在控制台输出多个1。

但是如果修改这里代码中的部分,添加once修饰符,改成下面这样
<button @click.once="showInfo">点我触发事件</button>

则无论如何点击这个按钮,右侧控制台永远只会输出一次1,这意味着事件永远只会被触发一次
capture(不常用)
前文提到过事件在冒泡阶段处理,因此回调函数是从内向外触发的,那么capture则是让事件在捕捉模式处理,回调函数从外向内触发。
当你的代码写成下面这样:
点击外层的div标签的时候,呈现效果如下:
<body><div id="box" @click.capture="showInfo1" style="background-color:rgb(208, 255, 0);height:50px"><button @click.capture="showInfo2" style="background-color:rgb(0, 255, 13)">点我触发事件</button></div><script type="text/javascript">Vue.config.productionTip = falseconst vm = new Vue({el: '#box',methods: {showInfo1() {console.log(1)},showInfo2() {console.log(2)}}})</script>
</body>
点击div标签对应的范围:

只出现了1,说明只触发了div对应的回调函数,说明事件并不会从外层传到内层。
点击按钮:

先出现1,后出现2,有两个数,事件触发两次,回调函数从外向内被调用。
self(不常用)
self会要求事件触发者是自己的时候,才允许回调函数的执行,也可以用来阻止事件冒泡(阻止得不完全)。
代码写成这样(其余保持不变):
<div id="box" @click.self="showInfo1" style="background-color:rgb(208, 255, 0);height:50px"><button @click="showInfo2" style="background-color:rgb(0, 255, 13)">点我触发事件</button>
</div>
点击按钮:

只有按钮对应的回调函数被触发了,并没有触发div标签的回调函数。
点击div标签:

当触发事件的是自己的时候,div标签对应的回调函数才能被执行。
event.target在传递的过程中是不变的,因此可以使用这个查看事件的触发者
思考点,事件是否被阻止传播
在stop修饰符中,如果三层的标签中间有一个stop,最内层的事件,传递到中间这层,触发事件之后,就无法继续传播了,那么,self是吗?
修改代码如下:
<body><div id="box" @click="showInfo1" style="background-color:rgb(208, 255, 0);height:50px"><h1 @click.self="showInfo2" style="background-color:rgb(255, 0, 0)"><button @click="showInfo3" style="background-color:rgb(0, 255, 13)">点我触发事件</button></h1></div><script type="text/javascript">Vue.config.productionTip = falseconst vm = new Vue({el: '#box',methods: {showInfo1() {console.log(1)},showInfo2() {console.log(2)},showInfo3() {console.log(3)}}})</script>
</body>
在中间层添加self修饰符,其余两层没有修饰符。
点击最内层的按钮:

你会发现,最内层和最外层的鼠标点击事件对应的回调函数全被触发了,说明self修饰符并不会阻止事件的传播,它只会阻止回调函数的调用(因为鼠标点击事件的触发者是内部的按钮,并不是带有self修饰符的h1标签)
passive(不常用)
passive会使标签的默认行为立即执行,默认行为一般会在触发事件的回调函数处理完之后执行,如果回调函数需要处理很久很久,默认行为则会因此延迟,造成使用上的不便。
<body><div id="box" ><a href="http://www.baidu.com" @click="showInfo">超链接</a></div><script type="text/javascript">Vue.config.productionTip = falseconst vm = new Vue({el: '#box',methods: {showInfo() {for (var i = 0; i < 10000; i++){console.log(1)}}}})</script>
</body>
我使用的chrome浏览器,会在计数到四千的时候再跳转到百度的官网,具备一定的延迟,数值越大的时候,延迟越明显。
如果为超链接中增加passive修饰符,如下(其余不变):
<a href="http://www.baidu.com" @click.passive="showInfo">超链接</a>
则会在你点击超链接的时候,马上跳转到百度的官网地址。
修饰符叠加
<a href="http://www.baidu.com" @click.prevent.stop>超链接</a>
这样a标签既不会跳转,也会阻止事件冒泡,如果代码写成这样:
<a href="http://www.baidu.com" @click.stop.prevent>超链接</a>
也是可以的,二者是等价的。
至此,结束。
如果你觉得这篇文章写的不错,多多点赞~收藏吧!
相关文章:
Vue框架学习笔记——事件修饰符
文章目录 前文提要事件修饰符prevent(常用)stop(不常用)事件冒泡stop使用方法三层嵌套下的stop三层嵌套看出的stop: once(常用)capture(不常用)self(不常用&a…...
嵌入式虚拟机原理
欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…...
AMESim|Make failed:Unable to create an excutable for the system
最近在AMESIM与MATLAB进行联合仿真的时候遇到如下问题: Make failed:Unable to create an excutable for the system. 看了网上的解决办法如下 配置环境变量重装AMESIM,有顺序要求,首先是VS,然后是AMESIM与MATLAB。在AMESIM安装…...
OpenHarmony之NAPI框架介绍
张志成 诚迈科技高级技术专家 NAPI是什么 NAPI的概念源自Nodejs,为了实现javascript脚本与C库之间的相互调用,Nodejs对V8引擎的api做了一层封装,称为NAPI。可以在Nodejs官网(https://nodejs.org/dist/latest-v20.x/docs/api/n-api…...
计算机网络之网络层
一、概述 主要任务是实现网络互连,进而实现数据包在各网络之间的传输 1.1网络引入的目的 从7层结构上看,网络层下是数据链路层 从4层结构上看,网络层下面是网络接口层 至少我们看到的网络层下面是以太网 以太网解决了什么问题? 答…...
【C指针(五)】6种转移表实现整合longjmp()/setjmp()函数和qsort函数详解分析模拟实现
🌈write in front :🔍个人主页 : 啊森要自信的主页 ✏️真正相信奇迹的家伙,本身和奇迹一样了不起啊! 欢迎大家关注🔍点赞👍收藏⭐️留言📝>希望看完我的文章对你有小小的帮助&am…...
浅谈电力设备智能无线温度检测系统
安科瑞 华楠 摘要:在长期工作中,由于设备基础变化、温湿度变化、严重超负荷运行、触点氧化等原因造成的电力设备压接不紧,触头接触部分发生改变。终导致接触电阻增大,造成巨大的风险隐患。本系统将通过无线测温的方式,…...
通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示(二)
通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示(二) mp4媒体流数据 #include <ros/ros.h> #include <signal.h> #include <sensor_msgs/Image.h> #include <message_filters/subscriber.h> #include <message_filters/synchroniz…...
LeetCode [简单] 283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 283. 移动零 - 力扣(LeetCode) 思路: 快慢指针&…...
深信服实验学习笔记——nmap常用命令
文章目录 1. 主机存活探测2. 常见端口扫描、服务版本探测、服务器版本识别3. 全端口(TCP/UDP)扫描4. 最详细的端口扫描5. 三种TCP扫描方式 1. 主机存活探测 nmap -sP <靶机IP>-sP代表 2. 常见端口扫描、服务版本探测、服务器版本识别 推荐加上-v参…...
面试:Kubernetes相关问题
文章目录 Kubernetes的工作流程可以分为以下几个步骤:简述Kubernetes中的Deployment、StatefulSet、DaemonSet的区别在Kubernetes中,如何进行存储管理在Kubernetes中,如何实现滚动升级和回滚在Kubernetes中,如何进行日志和监控的管…...
Go 本地搭建playground
搭建go playground 的步骤 1、安装docker 如果你使用的Ubuntu,docker的安装步骤可以参见这里,这是我之前写的在Ubuntu18.04下安装fabric,其中有docker的安装步骤,这里就不再赘述了。 CentOS下安装docker的,可以参见…...
Mybatis-plus常见标签
1.< 代表小于号(<)2.> 代表大于号(>)3.≤ 代表小于或等于符号(≤)4.≥ 代表大于或等于符号(≥)5.< 代表<6.> 代表>7.ne; 代表不等于 <>8…...
一致性 Hash 算法 Hash 环发生偏移怎么解决
本篇是对文章《一文彻底读懂一致性哈希算法》的重写,图文并茂,篇幅较长,欢迎阅读完提供宝贵的建议,一起提升文章质量。如果感觉不错不要忘记点赞、关注、转发哦。原文链接: 《一文彻底读懂一致性Hash 算法》 通过阅读本…...
Javaweb之Vue组件库Element的详细解析
4 Vue组件库Element 4.1 Element介绍 不知道同学们还否记得我们之前讲解的前端开发模式MVVM,我们之前学习的vue是侧重于VM开发的,主要用于数据绑定到视图的,那么接下来我们学习的ElementUI就是一款侧重于V开发的前端框架,主要用…...
IBM X3650M4安装ESXI6.5卡在/lsl_mr3.v00
环境:IBM X3650M4服务器双盘配置raid1,通过rufus制作启动U盘,安装VMware Vsphere 5.5系统 问题:卡在/lsi_mr3.v00界面无法往下运行(两台配置一样的机器遇到同样的问题) 解决方案: 直接在U盘根…...
【Python3】【力扣题】338. 比特位计数
【力扣题】题目描述: 题解:从0到n的整数,逐一统计二进制中1的个数,记录在一个新列表中。 【Python3】代码: 1、解题思路:Python函数。 知识点:bin(...):转为二进制字符串ÿ…...
Lubuntu 23.10用户可使用LXQt 1.4桌面
导读在众多 Lubuntu 用户的要求下,Lubuntu 开发人员决定将 LXQt 1.4 桌面环境向后移植到最新的 Lubuntu 23.10 (Mantic Minotaur) 版本。 是的,您没看错,您现在可以使用官方的 Lubuntu Backports PPA(个人软…...
语音识别入门——常用软件及python运用
工具以及使用到的库 ffmpegsoxaudacitypydubscipylibrosapyAudioAnalysisplotly 本文分为两个部分: P1:如何使用ffmpeg和sox处理音频文件 P2:如何编程处理音频文件并执行基本处理 P1 处理语音数据——命令行方式 格式转换 ffmpeg -i video…...
maven 将Jar包安装到本地仓库
window系统: 注意事项:在windows中,使用mvn指令将jar安装到本地仓库时,一定要将相关资源使用“"”包裹上,不然会报下面的错: mvn install:install-file "-DfileD:\BaiduNetdiskDownload\qianzixi…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
