Vue2 事件的默认和传播行为、事件修饰符

news2024/11/29 22:47:46

前言

在学习vue2时,学到了 事件修饰符,但是对事件的默认行为和传播行为不太理解,所以也就是不知道为啥要使用事件修饰符,所以找了一些资料,在此记录一下。

Vue2官方文档

事件处理 — Vue.js (vuejs.org)https://v2.cn.vuejs.org/v2/guide/events.html

事件的默认和传播行为

在 Web 应用程序中,事件处理是非常常见的需求。事件可以是任何用户交互行为,例如单击、双击、拖动、滚动、键盘按键等等。在处理这些事件时,有时需要避免其默认行为和传播行为。下面是对两种行为的简要说明:

事件的默认行为

当用户执行某些操作时(例如单击链接、提交表单或拖动元素),浏览器会根据默认行为来处理这些事件。例如,单击链接将跳转到链接指定的页面,而提交表单将向服务器发送表单数据。这些默认行为通常符合用户期望和习惯,但在某些情况下,我们希望通过 JavaScript 来修改或取消这些默认行为。

调用 event.preventDefault() 可以取消事件的默认行为

例如,在处理表单时,如果用户没有输入必填项,我们可能希望通过取消表单提交来防止表单被发送到服务器(阻止表单提交的方法有很多种,这只是一种)。

此外,通过 preventDefault()可以自定义一些事件处理逻辑,例如在链接上绑定点击事件,并且 href 属性指向一个新的页面,但是在函数内部根据一些条件取消链接的跳转行为。

事件的传播行为

在 Web 应用程序中,事件不仅会发生在目标元素上,还会沿着 DOM 树向上传播。这种传播被称为事件冒泡,如同水中气泡从下往上冒。例如,当用户单击一个按钮时,单击事件将首先触发按钮上的处理程序。如果该处理程序没有调用 stopPropagation() 来停止事件冒泡,则事件将向父元素传播,依此类推,直到文档根节点。

通过在事件处理程序中调用 event.stopPropagation() 可以阻止事件的传播行为这在某些情况下非常有用,例如在一个嵌套的元素结构中,如果你希望只捕获当前元素的事件而不是其祖先元素中已经注册了相同类型的事件。

如果我们不避免事件的默认行为和传播行为,可能会导致一些不期望的后果。例如,在表单提交时,如果用户未完成必填项,浏览器将自动禁止表单提交,并在表单元素上显示错误提示,但是如果我们取消了默认行为,这个机制就不会生效。同样地,如果我们没有避免事件的传播行为,事件可能会到达意外的元素,导致应用程序不稳定或出现意外行为。

Vue2中的事件修饰符

Vue官方的说法:

在事件处理程序中调用 event.preventDefault() 或 event.stopPropagation() 是非常常见的需求。尽管我们可以在方法中轻松实现这点,但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理 DOM 事件细节。

为了解决这个问题,Vue.js 为 v-on 提供了事件修饰符。之前提过,修饰符是由点开头的指令后缀来表示的。

Vue2中的事件修饰符:

  • .prevent:阻止默认事件(常用)

  • .stop:阻止事件冒泡(常用)

  • .once:事件只触发一次(常用)

  • .self:只有event.target=currentTarget是才触发事件(即只有自己才能触发,也可以用来阻止冒泡)

    (不常用)

  • .passive:事件的默认行为会立即执行,无需等待事件回调函数执行完毕

  • .capture:使用事件的捕获模式。即内部元素触发的事件先在此处理,然后才交由内部元素进行处理

<!-- 阻止单击事件继续传播 -->
<a v-on:click.stop="doThis"></a>

<!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form>

<!-- 修饰符可以串联 -->
<a v-on:click.stop.prevent="doThat"></a>

<!-- 只有修饰符 -->
<form v-on:submit.prevent></form>

<!-- 添加事件监听器时使用事件捕获模式 -->
<!-- 即内部元素触发的事件先在此处理,然后才交由内部元素进行处理 -->
<div v-on:click.capture="doThis">...</div>

<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</div>

 下面是另一个例子,读者可以粘贴到自己VSCode中运行,从而更好地理解。(注意:我这里是将vue框架包vue.js直接复制到了项目中,如果你是脚手架搭建的,可能需要改一下,CV自己需要的部分)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="vue.js"></script>
    <style>
        *{
            margin-top:20px
        }
        .demo1{
            height: 50px;
            background-color: skyblue;
        }
        .box1{
            background-color: orange;
        }
        .box2{
            background-color: red;
        }
        .list{
            width:200px;
            height: 200px;
            background-color: aqua;
            overflow: auto;
        }
        .list li{
            height: 100px;
        }


    </style>
</head>
<body>
<div id="root">
    <!-- prevent 住址默认事件,底层用的是e.preventDefault() -->
    <!-- a标签的默认事件是跳转页面,当被prevent修饰后,就不再跳转了,而只是执行showInfo()方法 -->
    <!-- 不被prevent修饰时,会先执行showInfo,然后跳转页面 -->
    <a href="http:www.atguigu.com" @click.prevent="showInfo">点我提示信息(阻止默认事件)</a>

    <!-- 阻止事件冒泡。如果不加,则点击按钮后,button和div都会执行showInfo方法。从里边向外冒 -->
    <!-- 底层用的是e.stopPropagation() -->
    <div class="demo1" @click="showInfo">
        <button @click.stop="showInfo">点我提示信息(阻止事件冒泡)</button>
    </div>
    <!-- 事件只触发一次。即按钮第一次点击才有效,以后点击就无效了 -->
    <button @click.once="showInfo">点我提示信息(事件只触发一次)</button>

    <!-- 使用事件的捕获模式。捕获是从外到内的,冒泡是从内到外的,先经历捕获再经历冒泡 -->
    <!-- 往水里扔石头,从水面到水底是捕获,泡泡从下到上是冒泡 -->
    <!-- 点击里面的div2时,会先输出1,然后输出2,因为div1开启了事件的捕获模式,
    在事件捕获阶段就执行了showMsg(1) -->
    <div class="box1" @click.capture="showMsg(1)" >div1
        <div class="box2" @click="showMsg(2)" >div2</div>
    </div>

    <!-- 只有event.target等于当前元素时才触发事件(即只有自己才能触发)。  -->
    <!-- 下面这个例子,使用self,同样阻止了事件冒泡 -->
    <div class="demo1" @click.self="showInfo">
        <button @click="showInfo">点我提示信息</button>
    </div>

    <!-- passive: passive被动的
        事件的默认行为立即执行,无需等待事件的回调执行完毕
    -->

    <!-- @scroll是监听滚动条的滚动。@wheel是监听鼠标滚动轮的滚动,鼠标滚轮只要滚动一次,
    @wheel就会触发一次,即使滚动条已经到底 .@scoll默认就是异步的,不需要passive修饰,
    先将滚动条滚动,再去执行回调函数,当回调函数执行过程中,
    用户再次滚动,则还是先去响应滚动条,滚动完毕后,继续执行回调函数。
    @wheel="show"默认是先执行完回调函数,滚动条才往下走,显得很卡,可以用passive修饰
    @wheel.passive="show"

    -->
    <ul @scroll="show" class="list">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
    </ul>
</div>
<script>
    const vm = new Vue({
        el: "#root",
        methods:{
            showInfo(){
                alert("同学你好")
            },
            showMsg(number){alert(number)},
            show(){
                for (let i = 0; i <100000 ; i++) {
                    console.log('#')

                }
            }

        }
    })
</script>
</body>
</html>

按键修饰符(键盘事件处理)

事件处理 — Vue.js (vuejs.org)https://v2.cn.vuejs.org/v2/guide/events.html

事件处理 — Vue.js (vuejs.org)

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

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

相关文章

【 Python 全栈开发 - WEB开发篇 - 29 】MySQL初步

文章目录 一、MySQL介绍二、SQL语言三、MySQL安装与配置第一步&#xff1a;下载压缩文件第二步&#xff1a;解压第三步&#xff1a;配置第四步&#xff1a;登录 一、MySQL介绍 MySQL 是一个开源的关系型数据库管理系统&#xff0c;它使用 Structured Query Language&#xff0…

JDBC的增删改查

文章目录 前言创建数据库基础版JDBC实例添加JDBC实例删除JDBC实例修改JDBC实例查询 高级版JDBC实例添加JDBC实例删除JDBC实例修改JDBC实例查询 前言 JDBC编程步骤&#xff1a; 加载数据库驱动程序创建数据库连接对象创建Statement语句对象&#xff08;createStatement、prepa…

谈谈聚簇索引与非聚簇索引

技术主题 聚簇索引是一种数据的存储方式,它的数据行只存放在索引(B+树)的叶子上,内部节点不存放数据。 聚簇索引 聚簇索引默认是主键,如果没有定义主键,innodb会选择一个唯一的非空索引代替。如果没有这种索引,innodb会隐式定义一个主键作为聚簇索引。 非聚簇索引 非…

百度出品,Nature重磅 -- 优化的mRNA设计算法可改善mRNA的稳定性和免疫原性

摘要 尽管mRNA疫苗已用于COVID-19的预防&#xff0c;但仍然面临不稳定和易降解的风险&#xff0c;这是mRNA疫苗存储、配送、效价等面临的重要障碍。先前的研究已表明&#xff0c;增加二级结构可延长mRNA的半衰期&#xff0c;再加上选择优化的密码子&#xff0c;可改善蛋白表达。…

Django实现接口自动化平台(五)httprunner(2.x)基本使用【持续更新中】

上一章&#xff1a; Django实现接口自动化平台&#xff08;四&#xff09;解决跨域问题【持续更新中】_做测试的喵酱的博客-CSDN博客 下一章&#xff1a; 一、参考地址&#xff1a; 使用说明_httprunner2.0 概述及使用说明 二、介绍 HttpRunner是一款面向 HTTP(S) 协议的通…

一文带你了解MySQL之锁

目录 一、解决并发事务带来问题的两种基本方式1.1 一致性读&#xff08;Consistent Reads&#xff09;1.2 锁定读&#xff08;Locking Reads&#xff09;1.2.1 共享锁和独占锁1.2.2 锁定读的语句 1.3 写操作 二、多粒度锁三、MySQL中的行锁和表锁3.1 其他存储引擎中的锁3.2 Inn…

高通KMD框架详解

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、概览二、核心模块解析三、模块初始化四、处理UMD CSL请求 一、概览 利用了V4L2可扩展这一特性&#xff0c;高通在相机驱动部分实现了自有的一套KMD…

未来3年,请善待你的工作

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) “如果不是现在环境差&#xff0c;下家不好找&#xff0c;我早TM跟那个傻X老板翻桌子走人了&#xff0c;这破公司我真是一天都不想待…”这是一位粉丝朋友给K哥私信中的一段话。类似同款的话&#xff…

百度推出基于大模型的代码编写助手“Comate”真的好用吗?

‍ 点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;计算机视觉研究院 学习群&#xff5c;扫码在主页获取加入方式 计算机视觉研究院专栏 Column of Computer Vision Institute 6月6日&#xff0c;在文心大模型技术交流会&#xff08;成都&…

从业务出发,K8S环境自建和非自建整体架构设计比较

新钛云服已累计为您分享751篇技术干货 随着数字化转型的大潮到来&#xff0c;越来越多的企业开始上云&#xff0c;同时也纷纷加入到微服务和K8S队伍中。但在K8S整体环境究竟应该用自建的还是非自建&#xff1f;以及他们需要用到的服务&#xff0c;究竟应该自建还是直接用PAAS服…

02.加载GDT表,进入保护模式

加载GDT表&#xff0c;进入保护模式 加载GDT表&#xff0c;实现操作系统从实模式进入保护模式 参考 操作系统学习 — 启动操作系统&#xff1a;进入保护模式 保护模式与实模式 GDT、GDTR、LDT、LDTR 调用门与特权级 趣谈 Linux 操作系统 在01.硬盘启动盘&#xff0c;加载操作系…

要能力、要稳定也要降本——百度多媒体技术回顾

摘要&#xff1a;多媒体技术生态进入到存量市场&#xff0c;客户既要又要还要成为常态。如何将能力、质量与稳定性、成本不断优化&#xff0c;就是各个多媒体技术平台的必修课。本文以百度智能视频云为例&#xff0c;纵览了其在RTC、边缘计算、视频编码等关键能力与用户体验和成…

腾讯搜索的系统架构是如何达到99.994%高可用的?

&#x1f449;腾小云导读 本文主要是搜索在稳定性治理实践的经验总结&#xff0c;讲述了搜狗搜索在技术债治理基础上如何将可用性提升一个量级&#xff0c;事故级 MTTD&#xff08;平均故障检测时间&#xff09;、MTTR&#xff08;平均响应时间&#xff09;优化一个量级&#x…

chatgpt赋能python:Python的IDLE运行方式

Python的IDLE运行方式 Python是一种非常流行的编程语言&#xff0c;其优雅简洁的语法和丰富的库资源&#xff0c;使得Python在很多领域都得到广泛应用。在Python的开发过程中&#xff0c;IDLE是一种常用的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;对于初学者…

关于操作系统调度器的三篇论文

【引子】没有忘记&#xff0c;目前从事的是DingOS 操作系统相关工作&#xff0c;没有因为LLM 而迷失。LLM 会成为基础设施&#xff0c;LLM 会为操作系统赋能&#xff0c;但是操作系统的价值是客观存在的&#xff0c;除非&#xff0c;计算机体系结构发生了翻天覆地的变化。 在任…

Java面试都只是背答案吗

Java 八股文面试当然要背&#xff0c;不背很难通过面试的 Java基础 Java基础面试题 Java的特点Java 与 C 的区别JDK/JRE/JVM三者的关系Java程序是编译执行还是解释执行&#xff1f;面向对象和面向过程的区别&#xff1f;面向对象有哪些特性&#xff1f;数组到底是不是对象&a…

编写Python程序求数组中最长的字符串

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 移船相近邀相见&#xff0c;添酒回灯重开宴。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python白银群【王子】问了一个Python基础的问题&#x…

Ubuntu离线安装docker与nvidia-docker

Ubuntu离线安装docker与nvidia-docker 安装 docker 20.10.17安装 nvidia-docker 和 nvidia-container-toolkit docker与nvidia-docker离线安装包 安装 docker 20.10.17 查看Ubuntu操作系统版本的详细信息&#xff0c;不同的版本所依赖的deb不同。 lsb_release -aCodename为&a…

一文带你读懂:TCP连接的三次握手和四次挥手(上篇)

TCP 是面向连接的协议&#xff0c;所以使用 TCP 前必须先建立连接&#xff0c;而建立连接是通过三次握手来进行的。 天下没有不散的宴席&#xff0c;对于 TCP 连接也是这样&#xff0c; TCP 断开连接是通过四次挥手方式。 下面我们通过实操&#xff0c;来彻底理解三次握手和四次…

linux ubi文件系统更新失败问题分析2

昨天打包了一个ubi根文件系统&#xff0c;打包成功&#xff0c;写板子flash成功&#xff0c;但系统运行后还是老的文件系统&#xff0c;具体过程如下&#xff1a; 使用脚本1&#xff0c;打包rootfs系统&#xff1a; 打包后的文件系统&#xff0c;下载到板子后&#xff0c;查看…