Vue框架学习笔记——事件修饰符

news2024/11/19 18:19:34

文章目录

  • 前文提要
  • 事件修饰符
  • 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修饰符用来阻止事件冒泡,事件冒泡是从内向外的
当一个标签被另一个标签包含的时候,二者都有着相同的触发事件,例如鼠标点击,当你触发内部的标签的时候,也会触发外部标签的事件,从而触发多遍。
回调函数的触发顺序默认也是由内向外的

样例代码:

在这里插入代码片<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 = false
    const 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 = false
    const 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 = false
    const 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 = false
    const 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标签对应的回调函数才能被执行。

思考点,事件是否被阻止传播

在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 = false
    const 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 = false
    const 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>

则会在你点击超链接的时候,马上跳转到百度的官网地址。


至此,结束。

如果你觉得这篇文章写的不错,多多点赞~收藏吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1252372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lombok新版超全面使用教程

一、Lombok介绍 Lombok是一个Java库&#xff0c;可以通过注解来简化Java类的编写&#xff0c;减少冗余的样板代码。它提供了一系列的注解&#xff0c;用于自动生成常见的代码&#xff0c;如getter和setter方法、构造函数、equals和hashCode方法、toString方法等。通过使用Lomb…

交流充电桩与直流充电桩的区别

1、背景 直流充电桩的学名是非车载充电机&#xff0c;是相对于交流充电桩而言的。交流充电桩是采用传导方式为具备车载充电机的电动汽车提供交流电能的专用装置。 2、交流充电桩和直流充电桩 1.1、交流充电桩 交流充电桩包括单相和三相交流充电桩。 图一是交流充电桩原理框…

5.3每日一题(不确定正负号的级数敛散性:和一个正项级数比较判定)

比较判别法和比较判别法的极限形式是对正项级数而言的&#xff0c;若一个级数和p级数比较&#xff0c;结果>0&#xff0c;则同敛散&#xff1b;若结果<0&#xff0c;则结果乘以-1 结果又同敛散了&#xff1b;所以只要比值不等于0&#xff0c;则同敛散&#xff1b; 所以当…

合共软件创新亮相:第102届上海电子展成就技术新篇章

2023年&#xff0c;第102届中国&#xff08;上海&#xff09;电子展活动在全球瞩目中圆满落幕。作为下半年华东地区最具影响力的电子展会&#xff0c;此次盛会吸引了来自全球的600家领先企业&#xff0c;共同探讨电子元器件行业的最新发展成果和趋势。 本届展会围绕核心先导元器…

SQL Injection (Blind)`

SQL Injection (Blind) SQL Injection (Blind) SQL盲注&#xff0c;是一种特殊类型的SQL注入攻击&#xff0c;它的特点是无法直接从页面上看到注入语句的执行结果。在这种情况下&#xff0c;需要利用一些方法进行判断或者尝试&#xff0c;这个过程称之为盲注。 盲注的主要形式有…

【Leetcode】【实现循环队列】【数据结构】

代码实现&#xff1a; typedef struct {int front;int back;int k;int* a;} MyCircularQueue;bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->frontobj->back; }bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->back1)%(obj->…

M2BLS

U are randomly generated&#xff0c;g is an activation function 辅助信息 作者未提供代码

网页设计作业-音乐网站首页

效果图 网盘链接 链接&#xff1a;https://pan.baidu.com/s/1CO4jAOY0zk1AWTx_pC3UmA?pwdfuck 提取码&#xff1a;fuck

【仿写C++中的move函数和forward函数】

仿写实现move函数 一、值的类型 1.左值 描述&#xff1a;能够取地址的值成为左值 int a 10; const int b 15; int *pa &a; const int *pb &b;2.纯右值 描述&#xff1a;赤裸裸的字面值 eg(false , 3 , 12.23等) int a 13; int *p &a; //取a的地址 int …

【电路笔记】-分流器

分流器 文章目录 分流器1、概述2、通用/网络配置3、无功分流器3.1 电阻电容分流器3.2 电阻-电感分流器 4、总结 我们在之前关于分压器的文中已经看到&#xff0c;分压过程是通过在串联配置中关联相同的组件来实现的。 在本文中&#xff0c;我们将重点关注电流分频器执行的电流分…

【Qt之QFileInfo】使用

描述 QFileInfo类提供了与系统无关的文件信息。 QFileInfo提供有关文件的名称和位置&#xff08;路径&#xff09;在文件系统中的信息&#xff0c;以及它的访问权限、是否为目录或符号链接等。还可以获取文件的大小和最后修改/读取时间。QFileInfo还可以用于获取关于Qt资源的信…

强化学习,快速入门与基于python实现一个简单例子(可直接运行)

文章目录 一、什么是“强化学习”二、强化学习包括的组成部分二、Q-Learning算法三、迷宫-强化学习-Q-Learning算法的实现全部代码&#xff08;复制可用&#xff09;可用状态空间检查是否超出边界epsilon 的含义更新方程 总结 一、什么是“强化学习” 本文要记录的大概内容&am…

python自动化测试——自动化基本技术原理

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

【教学类-06-11】20231125(55格版)X-Y之间“除法÷题”(以1-9乘法口诀表倒推)(随机抽取和正序抽取)

图片展示 &#xff08;随机打乱排序&#xff09; 正序&#xff08;每张都一样&#xff09; 背景需求&#xff1a; 前面三篇写到了随机加法、随机减法、随机乘法&#xff0c;既然做了三套&#xff0c;怎么能不试试最后一款“除法”呢 模仿乘法版本&#xff0c;制作打乱版和正…

【手写实现一个简单版的Dubbo,深刻理解RPC框架的底层实现原理】

手写实现一个简单版的Dubbo&#xff0c;深刻理解RPC框架的底层实现原理 RPC框架简介了解Dubbo的实现原理服务暴露服务引入服务调用 手写实现一个简单版的Dubbo服务暴露ServiceBeanProxyFactory#getInvokerProtocol#exportRegistryProtocol#export 服务引入RegistryProto#referD…

3、点亮一个LED

新建工程 project—>New uVision Project LED介绍 中文名&#xff1a;发光二极管 外文名&#xff1a;Light Emitting Diode 简称&#xff1a;LED 用途&#xff1a;照明、广告灯、指引灯 电路图分析 进制的转换 生成下载文件&#xff1a; 代码 //导包 #inclu…

Keil5个性化设置及常用快捷键

Keil5个性化设置及常用快捷键 1.概述 这篇文章是Keil工具介绍的第三篇文章&#xff0c;主要介绍下Keil5优化配置&#xff0c;以及工作中常用的快捷键提高开发效率。 第一篇&#xff1a;《安装嵌入式单片机开发环境Keil5MDK以及整合C51开发环境》https://blog.csdn.net/m0_380…

leetcode刷题详解——买卖股票的最佳时机含手续费

1. 题目链接&#xff1a;714. 买卖股票的最佳时机含手续费 2. 题目描述&#xff1a; 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续费用。 你可以无限次地完成交易&#xff0c;但是你每笔交易都需要付手…

PostgreSQL 分区表插入数据及报错:子表明明存在却报不存在以及column “xxx“ does not exist 解决方法

PostgreSQL 分区表插入数据及报错&#xff1a;子表明明存在却报不存在以及column “xxx“ does not exist 解决方法 问题1. 分区表需要先创建子表在插入&#xff0c;创建子表立马插入后可能会报错子表不存在&#xff1b;解决&#xff1a; 创建子表及索引后&#xff0c;sleep10毫…

动态规划经典例题leetcode思路代码详解

目录 动态规划基础篇例题 leetcode70题.爬楼梯 leetcode746题.使用最小花费爬楼梯 leetcode198题.打家劫舍 leetcode62题.不同路径 leetcode64题.最小路径和 leetcode63题.63不同路径II 动态规划基础篇例题 这一篇的例题解答是严格按照我上一篇写的动态规划三部曲做的&…