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

样例代码:

在这里插入代码片<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>

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


至此,结束。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue开发中遇到的问题记录

文章目录 前言1、css 即时使用了scoped子组件依然会生效2、路由配置如果出现重复name&#xff0c;只会生效最后一个&#xff0c;且前端的路由无效3、组件之间事件传递回调需要先定义emits: []&#xff0c;不然会警告提示总结如有启发&#xff0c;可点赞收藏哟~ 前言 1、css 即…

共享模型之内存

JMM JMM&#xff1a;Java内存模型。定义了主存&#xff08;所有线程共享的数据&#xff09;、工作内存&#xff08;每个线程对应的私有数据&#xff09;的抽象概念。 JMM存在以下几个特征 原子性&#xff1a;保证指令不会受到线程上下文切换所影响。可见性&#xff1a;保证指…

【数据集】全网最全的常见已公开医学影像数据集

目录 一&#xff0c;极市医学数据集汇总 1.CT 医学图像 ​编辑 2.恶性与良性皮肤癌 3.白内障数据集 4.胸部 X 光图像&#xff08;肺炎&#xff09; 5.用于图像增强的内窥镜真实合成曝光过度和曝光不足帧 6.医学家 7.乳房组织病理学图像 8.皮肤癌 MNIST&#xff1a;HA…

elementPlus之home页面布局

可以根据自己喜欢的格式选择 现在 header 部分 Aside 部分 Main部分 加上背景色以及命名 <template><div class="common-layout"><el-container><el-header class="homeHeader"><div class="headerTitle">Dev…

【Flutter】设置顶部状态栏的显示、隐藏、半透明灰色显示

【Flutter】设置顶部状态栏的显示、隐藏、半透明灰色显示 设置方法&#xff1a; // 这种模式不现实状态栏 SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); // 这种模式显示状态栏 SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); // 修…

Yakit工具篇:WebFuzzer模块之热加载技术

简介 官方定义&#xff1a; 什么是热加载&#xff1f; 广义上来说&#xff0c;热加载是一种允许在不停止或重启应用程序的情况下&#xff0c;动态加载或更新特定组件或模块的功能。这种技术常用于开发过程中&#xff0c;提高开发效率和用户体验。 在Yakit 的Web Fuzzer中&…

C#调用ffmpeg从视频提取图片

微信公众号“CSharp编程大全”的文章《C#从视频提取图片&#xff1f;》介绍了基于Microsoft.DirectX.AudioVideoPlayback.Video类实现从视频提取图片的方式&#xff0c;本来是想学习并测试该类的用法&#xff0c;但实际测试过程中却没有测通。百度从视频提取图片&#xff0c;网…

Kotlin学习——kt里面的函数,高阶函数 函数式编程 扩展函数和属性

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

如何使用Python在3dMax控制网格对象?

我们以一个在3dMax中使用Python脚本在网格对象对象上创建水波变形作为例子。 首先&#xff0c;在3dmax创建两个对象&#xff0c;一个“box”对象&#xff0c;将长宽方向的分段设置的多一些&#xff08;目的是为了后面的水波变形&#xff09;&#xff0c;一个“点”帮助对象&am…

P13 C++ 类 | 结构体内部的静态static

目录 01 前言 02 类内部创建静态变量的例子 03 在类的内部创建静态变量的作用 04 最后的话 01 前言 本期我们讨论 static 在一个类或一个结构体中的具体情况。 在几乎所有面向对象的语言中&#xff0c;静态在一个类中意味着特定的东西。这意味着在类的所有实例中&#xff…

AI换脸教程

方法一、MJ换脸大法 1.点击这个网站添加一个机器人到自己的服务器 https://discord.com/oauth2/authorize?client_id1090660574196674713&permissions274877945856&scopebot 2. /saveid 回车选择你自己的照片&#xff0c;并且在名字框命名身份&#xff0c;回车 3.…

Linux关于定时任务crontab相关知识了解配合理解shell反弹远程控制

Linux关于定时任务crontab相关知识了解配合理解shell反弹远程控制 几点需要知道的信息 【1】crontab一般来说服务器都是有的&#xff0c;依赖crond服务&#xff0c;这个服务也是必须安装的服务&#xff0c;并且也是开机自启动的服务&#xff0c;也就是说&#xff0c;他基本上是…

LiveGBS流媒体平台GB/T28181功能-查看国标设备会话列表直播会话、回放会话、下载会话、对讲会话

LiveGBS流媒体平台GB/T28181功能-查看国标设备会话列表直播会话、回放会话、下载会话、对讲会话 1、会话列表2、会话类型3、搭建GB28181视频直播平台 1、会话列表 LiveGBS-> 国标设备-》点击在线状态 点击会话列表 2、会话类型 下拉会话类型可以看到 直播会话、回放会话、…

Rust UI开发(一):使用iced构建UI时,如何在界面显示中文字符

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 iced的基本逻辑是&#xff1a; UI交互产生消息message&#xff0c;message传递给后台的update&#xff0c;在这个函数中编写逻辑&#xff0c;然后通过…

python安装redis库

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

#BUG SHOW# 深挖一个6年前的老“bug”

引言 最近参与了一个业务迁移的项目&#xff0c;需要把站点A迁移到站点B。不同的站点拥有各自独立的服务和数据库&#xff0c;可以说是毫无关联。为了兼容迁移过程中的存在的一部分特殊交易数据&#xff08;正向[支付]交易在站点A&#xff0c;但逆向[退款]操作在站点B操作&…

使用new Vue()的时候发生了什么?

前言 Vue.js是一个流行的JavaScript前端框架&#xff0c;用于构建单页面应用&#xff08;SPA&#xff09;和用户界面。当我们使用new Vue()来创建一个Vue实例时&#xff0c;Vue会执行一系列的初始化过程&#xff0c;将数据变成响应式&#xff0c;编译模板&#xff0c;挂载实例…

基于WSL2+Docker+VScode搭建机器学习(深度学习)开发环境

基于WSL2DockerVScode搭建机器学习(深度学习)开发环境 内容概述&#xff1a;由于最近配发了新的工作电脑但不想装双系统&#xff0c;因此通过本博文来记录基于Windows子系统WSLDocker搭建机器学习与深度学习开发环境的流程步骤&#xff0c;同时记录该过程中所遇到的相关问题及解…

FFmpeg命令分隔视频

有一个视频如a.mp4&#xff0c;此视频采用帧率为30生成&#xff0c;共有299帧&#xff0c;这里通过FFmpeg命令分隔成1秒一个个的小视频&#xff0c;即每个小视频帧数为30帧。 用到的FFmpeg参数如下所示&#xff1a; (1).-i:指定输入视频文件的名称&#xff1b; (2).-c:指…

Guitar Pro软件8.0官方最新版本下载

Guitar Pro 8是一款由法国Arobas Music公司开发的吉他学习与MIDI音序制作辅助软件&#xff0c;它具有丰富的功能&#xff0c;包括吉他谱、六线谱、四线谱绘制、打印、查看、试听等方面&#xff0c;能够帮助音乐爱好者更方便地进行音乐学习和创作。Guitar Pro 8拥有独特的gtp格式…