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

关于vue,记录一次修饰符.stop和.once的使用,以及猜想。

内置指令 | Vue.js

在vue的api里,关于v-on有stop和once两个事件标签。

  • .stop - 调用 event.stopPropagation()
  • .once - 最多触发一次处理函数。 

原有主要代码和页面效果 (无stop和once):

    ...<div class="div" @click="divClick()"><p class="p" @click="pClick()"></p></div>...<script>...divClick(){console.log('div点击了');},pClick(){console.log('p点击了');}...</script>

 

.stop

stop用于在页面表单中,只触发子元素,不触发父元素的操作。例如:

        <div class="div" @click="divClick()"><p class="p" @click.stop="pClick()"></p></div>

效果如下。p元素(绿区)绑定了pClick的指令,p元素是div元素(背景红区)的子元素,div也绑定了一个事件。点击p元素,div所绑定的事件没有被触发。

 

 .once

once用于在页面表单中,只触发子元素,不触发父元素的操作。例如:

<div class="div" @click="divClick()"><p class="p" @click.once="pClick()"></p></div>

效果如下。p元素(绿区)绑定了pClick的指令,p元素是div元素(背景红区)的子元素,div也绑定了一个事件。点击p元素两次,p所绑定的事件只触发了一次,div所绑定的事件两次被触发。 

.stop.once或者.once.stop:

代码如下:

        <div class="div" @click="divClick()"><p class="p" @click.stop.once="pClick()"></p></div>

效果如下:

第一次点击绿区p,只触发了绿区p的事件,没有触发红区div的事件。 

第二次点击绿区p,没有触发了绿区p的事件,但是触发了红区div的事件。 

点击绿区p第三次,同样只触发红区div的事件,不触发绿区p的事件。 

 将.stop.once改成.once.stop得到的也是一样的结果。

        ...<div class="div" @click="divClick()"><p class="p" @click.once.stop="pClick()"></p></div>......pClick(){console.log('p点击了 .once.stop');},...

 猜想:

        stop的作用是不触发当前处理函数所在元素的父级元素处理函数,once的作用是最多触发一次处理函数。当.stop.once混用的时候,第一次点击stop和once都对当前元素的函数,其作用范围只在当前元素上。但是第二次点击的时候,stop不再起作用了,父级元素可以被多次触发。

        因此我猜测,once这个修饰符,在第一次点击执行后,对当前元素做了去除操作(不知道是逻辑去除还是物理去除,个人偏向物理)。这个操作不仅会去除该元素绑定的处理函数,还会去除该元素上带有的其他修饰符。

完整代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>事件</title><script src="../../public/script/vue_2.2.2.min.js"></script><style>.div{width: 200px;height: 200px;background-color: red;margin-top: 20px;}.div2{width: 200px;height: 200px;background-color: yellow;margin-top: 20px;}.p{width: 100px;height: 100px;background-color: green;}</style>
</head>
<body><div id="app"><button @click="add('horse',$event)">加一马</button><input type="text" :value="age" /><button @click="sub()">减一马</button><div class="div" @click="divClick()"><p class="p" @click.once.stop="pClick()"></p></div><div class="div2" @click="divClick()"><p @click.stop.once="aClick()" target="_blank">Baidu一下</p></div></div><script>const vm = new Vue({el: "#app",data: {name: 'Calven',age: 24,wechat: 'CalvenZeng'},methods: {add(msg, event){this.age++;console.log(msg);console.log(event);},sub(){this.age--;},divClick(){console.log('div点击了');},pClick(){console.log('p点击了 .once.stop');},aClick(){console.log('a点击了');window.open("https://www.baidu.com", "baidu");}}});</script>
</body>
</html>

http://www.lryc.cn/news/129810.html

相关文章:

  • 解决git reset --soft HEAD^撤销commit时报错
  • 【BASH】回顾与知识点梳理(三十四)
  • Python可视化在量化交易中的应用(11)_Seaborn折线图
  • 无涯教程-TensorFlow - TensorBoard可视化
  • [uni-app] uview封装Popup组件,处理props及v-model的传值问题
  • 【C++】int a;和int *p=new int;有什么区别?
  • redis事务管理
  • TPS_C++版本及功能支持备注
  • 同步jenkinsfile流水线(sync-job)
  • STM32单片机WIFI-APP智能温室大棚系统CO2土壤湿度空气温湿度补光
  • SpringBoot复习:(52)不再需要使用@EnableTransactionManagement的原因
  • HackNos 3靶场
  • 【办公自动化】使用Python批量生成PPT版荣誉证书
  • 【C++深入浅出】初识C++中篇(引用、内联函数)
  • 前端:VUE2中的父子传值
  • 【100天精通python】Day40:GUI界面编程_PyQt 从入门到实战(完)_网络编程与打包发布
  • Redis——set类型详解
  • redis---》高级用法之慢查询/pipline与事务/发布订阅/bitmap位图/HyperLogLog/GEO地理位置信息/持久化
  • Find My资讯|苹果Vision Pro开发者需将设备配对 AirTag
  • Go 语言中排序的 3 种方法
  • 12----Emoji表情
  • C++四种强制类型转换
  • git仓库新建上传记录
  • flutter调用so
  • c#依赖注入
  • Django框架使用定时器-APScheduler实现定时任务:django实现简单的定时任务
  • Go学习笔记之数据类型
  • Spring Cloud 微服务
  • SpringBoot属性配置
  • 算法通关村第十关 | 归并排序