当前位置: 首页 > news >正文

Vue-事件修饰符

事件修饰符

prevent (阻止默认事件)

超链接 + 点击事件

  • 代码
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>事件修饰符</title><!--  引入Vue  --><script type="text/javascript" src="../js/vue.js"></script></head><body><div id="root"><h1>事件修饰符</h1><h2> prevent 阻止默认事件 </h2><a target="_blank" href="http://www.baidu.com"  @click="showTip">点我提示信息</a> </div></body><script type="text/javascript">Vue.config.productionTip = false; // 阻止vue在启动是生成生产提示      new Vue({el:'#root', data:{ name:"菜逼"},methods: {showTip(e){console.log("你好 " + this.name)}},});</script>
</html>
  • 效果
  1. 控制台输出 : 你好 菜逼
  2. 新标签页打开: 百度首页
    在这里插入图片描述

想禁止超链接的默认跳转

  • 解决办法
    • 调用事件的阻止默认操作方法 preventDefault
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>事件修饰符</title><!--  引入Vue  --><script type="text/javascript" src="../js/vue.js"></script></head><body><!-- 准备一个容器 --><div id="root"><h1>事件修饰符</h1><h2> prevent 阻止默认事件 </h2><a target="_blank" href="http://www.baidu.com"  @click="showTip">点我提示信息</a> </div></body><script type="text/javascript">Vue.config.productionTip = false; // 阻止vue在启动是生成生产提示      new Vue({el:'#root', data:{ name:"菜逼"},methods: {showTip(e){e.preventDefault(); // 阻止默认事件方法console.log("你好 " + this.name)}},});</script>
</html>
  • 效果
  1. 控制台输出:你好 菜逼
  2. 不打开新标签页跳转百度首页

在这里插入图片描述

  • 简写

@click="showTip" => @click.prevent="showTip"

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>事件修饰符</title><!--  引入Vue  --><script type="text/javascript" src="../js/vue.js"></script></head><body><div id="root"><h1>事件修饰符</h1><h2> prevent 阻止默认事件 </h2><a target="_blank" href="http://www.baidu.com"  @click.prevent="showTip">点我提示信息</a> </div></body><script type="text/javascript">Vue.config.productionTip = false; // 阻止vue在启动是生成生产提示      new Vue({el:'#root', data:{ name:"菜逼"},methods: {showTip(e){// e.preventDefault(); // 阻止默认事件方法console.log("你好 " + this.name)}},});</script>
</html>

stop (阻止事件冒泡)

DIV 及其 子元素 Button 均包含点击事件

  • 代码
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>事件修饰符</title><!--  引入Vue  --><script type="text/javascript" src="../js/vue.js"></script></head><body><div id="root"><h1>事件修饰符</h1><h2> stop 阻止事件冒泡 </h2><div @click="showDiv"><button @click="showButton">点我提示信息</button></div></div></body><script type="text/javascript">Vue.config.productionTip = false; // 阻止vue在启动是生成生产提示      new Vue({el:'#root', data:{ name:"菜逼"},methods: {showDiv(e){console.log("你好 Div")},showButton(e){console.log("你好 Button")}},});</script>
</html>
  • 效果
  1. 点击按钮, 输出: 你好 Button
  2. div上的点击事件也触发了,输出: 你好 Div

在这里插入图片描述

想禁止触发 Div 的点击事件

  • 解决办法
    • 调用事件的阻止事件冒泡方法 stopPropagation
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>事件修饰符</title><!--  引入Vue  --><script type="text/javascript" src="../js/vue.js"></script></head><body><div id="root"><h1>事件修饰符</h1><h2> stop 阻止事件冒泡 </h2><div @click="showDiv"><button @click="showButton">点我提示信息</button></div></div></body><script type="text/javascript">Vue.config.productionTip = false; // 阻止vue在启动是生成生产提示      new Vue({el:'#root', data:{ name:"菜逼"},methods: {showDiv(e){console.log("你好 Div")},showButton(e){e.stopPropagation();// 阻止事件冒泡console.log("你好 Button")}},});</script>
</html>
  • 效果

点击按钮, 只输出: 你好 Button
在这里插入图片描述

  • 简写

@click="showButton" => @click.stop="showButton"

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>事件修饰符</title><!--  引入Vue  --><script type="text/javascript" src="../js/vue.js"></script></head><body><div id="root"><h1>事件修饰符</h1><h2> stop 阻止事件冒泡 </h2><div @click="showDiv"><button @click.stop="showButton">点我提示信息</button></div></div></body><script type="text/javascript">Vue.config.productionTip = false; // 阻止vue在启动是生成生产提示      new Vue({el:'#root', data:{ name:"菜逼"},methods: {showDiv(e){console.log("你好 Div")},showButton(e){console.log("你好 Button")}},});</script>
</html>

once (只触发一次)

  • 代码
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>事件修饰符</title><!--  引入Vue  --><script type="text/javascript" src="../js/vue.js"></script></head><body><div id="root"><h1>事件修饰符</h1><h2> once 只触发一次 </h2><div @click="showDiv"><button @click.once="showButton">点我提示信息</button></div></div></body><script type="text/javascript">Vue.config.productionTip = false; // 阻止vue在启动是生成生产提示      new Vue({el:'#root', data:{ name:"菜逼"},methods: {showButton(e){console.log("你好 Button")}},});</script>
</html>
  • 效果

多次点击,只输出一次:你好 Button

在这里插入图片描述

capture (使用事件的捕获模式)

Div1、2嵌套且均包含点击事件

  • 代码
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>事件修饰符</title><!--  引入Vue  --><script type="text/javascript" src="../js/vue.js"></script><style>*{margin-top: 20px;}.div1{padding: 5px;background-color: gray;}.div2{padding: 5px;background-color: red;}</style></head><body><div id="root"><h1>事件修饰符</h1><h2> capture 使用事件的捕获模式 </h2><div class="div1"  @click="showMsg('div1')">div1<div class="div2"  @click="showMsg('div2')">div2</div></div></div></body><script type="text/javascript">Vue.config.productionTip = false; // 阻止vue在启动是生成生产提示      new Vue({el:'#root', data:{ name:"菜逼"},methods: {showMsg(msg){console.log("你好 " + msg)}},});</script>
</html>
  • 效果
  1. 事件的捕获是 从外到内 div1 -> div2
  2. 事件的冒泡是 从内到外 div2 -> div1·
  3. 因此先输出 你好 div2 再输出 你好 div1

在这里插入图片描述

想让按照事件捕获顺序触发事件

  • 代码
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>事件修饰符</title><!--  引入Vue  --><script type="text/javascript" src="../js/vue.js"></script><style>*{margin-top: 20px;}.div1{padding: 5px;background-color: gray;}.div2{padding: 5px;background-color: red;}</style></head><body><div id="root"><h1>事件修饰符</h1><h2> capture 使用事件的捕获模式 </h2><div class="div1"  @click.capture="showMsg('div1')">div1<div class="div2"  @click="showMsg('div2')">div2</div></div></div></body><script type="text/javascript">Vue.config.productionTip = false; // 阻止vue在启动是生成生产提示      new Vue({el:'#root', data:{ name:"菜逼"},methods: {showMsg(msg){console.log("你好 " + msg)}},});</script>
</html>
  • 效果
  1. @click="showMsg('div1')" => @click.capture="showMsg('div1')"
  2. 开启了捕获模式,捕获时就调用方法
  3. 先输出 你好 div1 再输出 你好 div2

在这里插入图片描述

self (只有event.target是自己时才调用)

DIV 及其 子元素 Button 均包含点击事件

  • 代码
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>事件修饰符</title><!--  引入Vue  --><script type="text/javascript" src="../js/vue.js"></script><style>*{margin-top: 20px;}.div1{padding: 5px;background-color: gray;}</style></head><body><div id="root"><h1>事件修饰符</h1><h2> self 只有event.target是自己时才触发事件 </h2><div class="div1" @click="showDiv"><button @click="showButton">点我提示信息</button></div></div></body><script type="text/javascript">Vue.config.productionTip = false; // 阻止vue在启动是生成生产提示      new Vue({el:'#root', data:{ name:"菜逼"},methods: {showDiv(e){console.log("你好 Div")console.log("div的event.target->",e.target)},showButton(e){console.log("你好 Button")}},});</script>
</html>
  • 效果
  1. 先输出 你好 Button
  2. 再输出 你好 Div
  3. 输出div触发事件的target是 <button >点我提示信息</button> 。(因为是点击按钮的冒泡事件)

在这里插入图片描述

想不是点击div自己就不触发事件

  • 代码

@click="showDiv" => @click.self="showDiv"

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>事件修饰符</title><!--  引入Vue  --><script type="text/javascript" src="../js/vue.js"></script><style>*{margin-top: 20px;}.div1{padding: 5px;background-color: gray;}</style></head><body><div id="root"><h1>事件修饰符</h1><h2> self 只有event.target是自己时才触发事件 </h2><div class="div1" @click.self="showDiv"><button @click="showButton">点我提示信息</button></div></div></body><script type="text/javascript">Vue.config.productionTip = false; // 阻止vue在启动是生成生产提示      new Vue({el:'#root', data:{ name:"菜逼"},methods: {showDiv(e){console.log("你好 Div")console.log("div的event.target->",e.target)},showButton(e){console.log("你好 Button")}},});</script>
</html>
  • 效果

只输出 你好 Button div的点击事件没有触发(变向的阻止事件冒泡)

在这里插入图片描述

passive (事件行为立即执行,无需等待回调执行完成)

  • 代码

鼠标滚轮事件 @wheel

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>事件修饰符</title><!--  引入Vue  --><script type="text/javascript" src="../js/vue.js"></script><style>* {margin-top: 20px;}.list {height: 200px;width: 200px;background-color: gray;overflow: auto;}li {height: 100px;}</style></head><body><div id="root"><h1>事件修饰符</h1><h2>passive 默认事件行为立即执行,无需等待回调执行完成</h2><ul class="list" @wheel="load"><li>a</li><li>b</li><li>c</li><li>d</li></ul></div></body><script type="text/javascript">Vue.config.productionTip = false; // 阻止vue在启动是生成生产提示new Vue({el:'#root',data:{name:"菜逼"},methods: {load(e){for(let i = 0; i<10000; i++){setTimeout(1000);console.log("睡了"+(i+1)+ "秒")}console.log("执行完了");}}});</script>
</html>
  • 效果

发现必须等到最终输出 执行完了 滚动条才下移

在这里插入图片描述

  • 想让滚动条直接下移

@wheel="load" => @wheel.passive="load"

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>事件修饰符</title><!--  引入Vue  --><script type="text/javascript" src="../js/vue.js"></script><style>* {margin-top: 20px;}.list {height: 200px;width: 200px;background-color: gray;overflow: auto;}li {height: 100px;}</style></head><body><div id="root"><h1>事件修饰符</h1><h2>passive 默认事件行为立即执行,无需等待回调执行完成</h2><ul class="list" @wheel.passive="load"><li>a</li><li>b</li><li>c</li><li>d</li></ul></div></body><script type="text/javascript">Vue.config.productionTip = false; // 阻止vue在启动是生成生产提示new Vue({el:'#root',data:{name:"菜逼"},methods: {load(e){for(let i = 0; i<10000; i++){setTimeout(1000);console.log("睡了"+(i+1)+ "秒")}console.log("执行完了");}}});</script>
</html>

在这里插入图片描述

  • 使用 @scroll 则没有这个问题

@wheel.passive="load" => @scroll="load"

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><title>事件修饰符</title><!--  引入Vue  --><script type="text/javascript" src="../js/vue.js"></script><style>* {margin-top: 20px;}.list {height: 200px;width: 200px;background-color: gray;overflow: auto;}li {height: 100px;}</style></head><body><div id="root"><h1>事件修饰符</h1><h2>passive 默认事件行为立即执行,无需等待回调执行完成</h2><ul class="list" @scroll="load"><li>a</li><li>b</li><li>c</li><li>d</li></ul></div></body><script type="text/javascript">Vue.config.productionTip = false; // 阻止vue在启动是生成生产提示new Vue({el:'#root',data:{name:"菜逼"},methods: {load(e){for(let i = 0; i<10000; i++){setTimeout(1000);console.log("睡了"+(i+1)+ "秒")}console.log("执行完了");}}});</script>
</html>

在这里插入图片描述

  • 特殊说明

passive 常用于 APP 或者 平板之类的应用优化使用
并不是所有的事件均使用,需具体事件具体分析

相关文章:

  • 怎么用Origin画出MATLAB效果的3D时频图
  • 哈希表(2):
  • 劳特巴赫trace32烧录方法
  • Compose笔记(二十三)--多点触控
  • JWT令牌验证
  • STM32入门笔记(06):STM32Cube 生态系统 (STM32CubeMX图形工具STM32CubeIDE 集成开发环境)(HAL库)
  • C语言 自定义类型---结构体(1)
  • Redis键(Key)操作完全指南:从基础到高级应用
  • MySQL高可用架构
  • 基于Llama3的开发应用(二):大语言模型的工业部署
  • 基于STM32单片机的高度集成温室环境监测系统设计与实现
  • opencv4.11生成ArUco标记 ArUco Marker
  • 养生精要:五大维度打造健康生活
  • 蓝桥杯-不完整的算式
  • 中间网络工程师知识点5
  • Java零基础学习Day15——面向对象进阶
  • 【RabbitMQ】整合 SpringBoot,实现工作队列、发布/订阅、路由和通配符模式
  • JS手写代码篇---手写 new 操作符
  • 数学复习笔记 18
  • MySQL——4、表的约束
  • 商务部:对原产于美国、欧盟、台湾地区和日本的进口共聚聚甲醛征收反倾销税
  • 在美国,为什么夏季出生的孩子更容易得流感?
  • 技术派|威胁F-35、击落“死神”,胡塞武装防空战力如何?
  • 沃尔玛上财季净利下滑12%:关税带来成本压力,新财季价格涨幅将高于去年
  • 清雪车司机未拉手刹下车导致溜车被撞亡,事故调查报告发布
  • 农行再回应客户办理业务期间离世:亲属连续三次输错密码,理解亲属悲痛,将协助做好善后