vue 实现click同时传入事件对象和自定义参数


Posted in Vue.js onJanuary 29, 2021

仅仅传入自定义参数

HTML

<div id="app">
 <button @click="tm(123)">ddddd</button>
</div>

JS代码

new Vue({
  el:'#app',
 methods:{
   tm:function(e){
    console.log(e);
  }
 }
})

仅仅传入事件对象

HTML

<div id="app">
 <button @click="tm">ddddd</button>
</div>

JS代码

new Vue({
  el:'#app',
 methods:{
   tm:function(e){
    console.log(e);
  }
 }
})

同时传入事件对象和自定义参数

HTML

<div id="app">
 <button @click="tm($event,123)">ddddd</button>
</div>

JS代码

new Vue({
  el:'#app',
 methods:{
   tm:function(e,value){
    console.log(e);
    console.log(value);
  }
 }
})

补充:vue常用事件之v-on:click 以及事件对象,事件冒泡,事件默认行为

其实v-on后面跟的不止是click事件也可以是其他的事件,用法均相似。比如:v-on:click/mouseout/mouseover/mousedown.......

以下click为例

注意:所有的v-on都可以简写为@,比如说v-click可以简写为@click

1.监听事件

可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码。通常来讲就是监听dom触发一些操作,这些操作(比如点击)触发后执行的动作(js)可有直接写在后面

v-on:click="item+=1"

eg:

<template>
 <div >
  <input type="button" value="clickme" v-on:click="item+=1"/>
  <div>{{item}}</div>
 </div>
</template>
 
<script>
export default {
 name: 'HelloWorld',
 data () {
  return {
  item:1
  }
 }
}
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
 
</style>

结果:

vue 实现click同时传入事件对象和自定义参数

可以看见每点击一次绑定的值就增加1.也就是说可以吧js的操作放在事件触发的后面。但是有时候逻辑太复杂的时候写在里面就会造成混乱,视图和逻辑混淆。所以click后面可以接一个方法,把所有处理逻辑的方法封装在一个函数里面click的时候调用

2.事件处理方法

v-on:click="greet"

eg:

<template>
 <div >
  <input type="button" value="clickme" v-on:click="greet"/>
  <div>{{res}}</div>
 </div>
</template>
 
<script>
export default {
 name: 'HelloWorld',
 data () {
  return {
   name : 1,
   res:""
  }
 },
 methods:{
  greet: function () {
   // `this` 在方法里指向当前 Vue 实例
   this.res='Hello ' + this.name + '!';
  }
 }
}
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
 
</style>

效果:

vue 实现click同时传入事件对象和自定义参数

可以看见点击之后执行了greet方法里面js逻辑

3.带参数的时间绑定方法:

同上,唯一区别是携带了参数

v-on:click="greet(name)"
<template>
 <div >
  <input type="button" value="clickme" v-on:click="greet(name)"/>
  <div>{{res}}</div>
 </div>
</template>
 
<script>
export default {
 name: 'HelloWorld',
 data () {
  return {
   name : 1,
   res:""
  }
 },
 methods:{
  greet: function (reccept) {
   // `this` 在方法里指向当前 Vue 实例
   this.res='Hello ' + reccept+1 + '!';
  }
 }
}
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
 
</style>

效果一致。对方法的调用同样可以一个方法多处多次的调用

4.内联处理器中的方法

也就是说在方法里面调用其他的方法,这里的其他方法可以是js原生的方法比如阻止冒泡呀等等,也可以是自定义的方法

v-on:click="greet(name,$event)"

eg:

<template>
 <div >
  <input type="button" value="clickme" v-on:click="greet(name,$event)"/>
  <div>{{res}}</div>
 </div>
</template>
 
<script>
export default {
 name: 'HelloWorld',
 data () {
  return {
   name : 1,
   res:""
  }
 },
 methods:{
  greet: function (reccept,event) {
   if (reccept===1) this.say()
  },
  say:function () {
   this.res="我调用了"
  }
 }
}
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
 
</style>

效果:

vue 实现click同时传入事件对象和自定义参数

5.事件对象

$event 拿到当前点击事件的事件对象,比如click就是拿到当前点击的dom事件对象信息

v-on:click="greet($event)"

eg:

<template>
 <div >
  <input type="button" value="clickme" v-on:click="greet($event)"/>
 </div>
</template>
 
<script>
export default {
 name: 'HelloWorld',
 data () {
  return {
   hide : true
  }
 },
 methods:{
  greet: function (ev) {
  alert(ev.clientX)
  }
 }
}
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
 
</style>

效果:

vue 实现click同时传入事件对象和自定义参数

6.事件冒泡

当不阻止事件冒泡的时候会弹两次

eg

<template>
 <div >
  <div @click="show1($event)">
   <div @click="show2($event)">点击我呀</div>
  </div>
 </div>
</template>
 
<script>
export default {
 name: 'HelloWorld',
 data () {
  return {
   hide : true
  }
 },
 methods:{
  show1: function (ev) {
   alert(1)
  },
  show2: function (ev1) {
   alert(2)
  }
 }
}
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
 
</style>

那么但阻止冒泡后就只会弹一次

eg:原生js阻止冒泡

ev1.cancelBubble=true
<template>
 <div >
  <div @click="show1($event)">
   <div @click="show2($event)">点击我呀</div>
  </div>
 </div>
</template>
 
<script>
export default {
 name: 'HelloWorld',
 data () {
  return {
   hide : true
  }
 },
 methods:{
  show1: function (ev) {
   alert(1)
  },
  show2: function (ev1) {
    ev1.cancelBubble=true
   alert(2)
 
  }
 }
}
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
 
</style>

那么vue自己封装的阻止冒泡方法呢?

@click.stop="show2()"

eg:

<template>
 <div >
  <div @click="show1()">
   <div @click.stop="show2()">点击我呀</div>
  </div>
 </div>
</template>
 
<script>
export default {
 name: 'HelloWorld',
 data () {
  return {
   hide : true
  }
 },
 methods:{
  show1: function () {
   alert(1)
  },
  show2: function (ev1) {
   alert(2)
  }
 }
}
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
 
</style>

7.阻止默认行为:

比如:如下右键之后会将默认的菜单带出来

<template>
 <div >
  <div>
   <div @contextmenu="show2()">右键点击我呀</div>
  </div>
 </div>
</template>
 
<script>
export default {
 name: 'HelloWorld',
 data () {
  return {
   hide : true
  }
 },
 methods:{
  show2: function (ev1) {
   alert(2)
 
  }
 }
}
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
 
</style>

效果:

vue 实现click同时传入事件对象和自定义参数

那么就有了阻止默认行为

ev1.preventDefault();

eg:

<template>
 <div >
  <div>
   <div @contextmenu="show2($event)">右键点击我呀</div>
  </div>
 </div>
</template>
 
<script>
export default {
 name: 'HelloWorld',
 data () {
  return {
   hide : true
  }
 },
 methods:{
  show2: function (ev1) {
   alert(2);
   ev1.preventDefault();
  }
 }
}
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
 
</style>

点击后默认菜单将不会显示(PS早360浏览器右键无效)

vue里面的封装的阻止默认行为的方法:

@contextmenu.prevent="show2()"

eg:

<template>
 <div >
  <div>
   <div @contextmenu.prevent="show2()">右键点击我呀</div>
  </div>
 </div>
</template>
 
<script>
export default {
 name: 'HelloWorld',
 data () {
  return {
   hide : true
  }
 },
 methods:{
  show2: function (ev1) {
   alert(2);
  }
 }
}
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
 
</style>

8.其他事件修饰符

用法都一样就不再赘述

.capture

.self

.once

<!-- 阻止单击事件继续传播 -->
<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>

使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 @click.prevent.self 会阻止 所有的点击 ,而 @click.self.prevent 只会阻止对元素自身的点击。

2.1.4 新增

<!-- 点击事件将只会触发一次 -->
<a v-on:click.once="doThis"></a>

不像其它只能对原生的 DOM 事件起作用的修饰符,.once 修饰符还能被用到自定义的组件事件上。如果你还没有阅读关于组件的文档,现在大可不必担心。

<!-- the scroll event will not cancel the default scroll behavior -->
<div v-on:scroll.passive="onScroll">...</div>

Vue 为这些修饰符额外提供了 .passive 修饰符来提升移动端的性能。

举个例子,在滚动的时候,浏览器会在整个事件处理完毕之后再触发滚动,因为浏览器并不知道这个事件是否在其处理函数中被调用了 event.preventDefault()。.passive 修饰符用来进一步告诉浏览器这个事件的默认行为不会被取消。

不要把 .passive 和 .prevent 一起使用。被动处理函数无法阻止默认的事件行为。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Vue.js 相关文章推荐
vue使用vant中的checkbox实现全选功能
Nov 17 Vue.js
详解vue实现坐标拾取器功能示例
Nov 18 Vue.js
一篇超完整的Vue新手入门指导教程
Nov 18 Vue.js
ESLint 是如何检查 .vue 文件的
Nov 30 Vue.js
vue 在单页面应用里使用二级套嵌路由
Dec 19 Vue.js
基于vue+echarts数据可视化大屏展示的实现
Dec 25 Vue.js
Vue项目中使用mock.js的完整步骤
Jan 12 Vue.js
Vue看了就会的8个小技巧
Jan 21 Vue.js
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 Vue.js
使用Vue.js和MJML创建响应式电子邮件
Mar 23 Vue.js
Vue提供的三种调试方式你知道吗
Jan 18 Vue.js
教你部署vue项目到docker
Apr 05 Vue.js
聊聊vue 中的v-on参数问题
Jan 29 #Vue.js
vue集成一个支持图片缩放拖拽的富文本编辑器
Jan 29 #Vue.js
Vue 事件的$event参数=事件的值案例
Jan 29 #Vue.js
Vue 3自定义指令开发的相关总结
Jan 29 #Vue.js
vue 中this.$set 动态绑定数据的案例讲解
Jan 29 #Vue.js
vue穿梭框实现上下移动
Jan 29 #Vue.js
vue使用transition组件动画效果的实例代码
Jan 28 #Vue.js
You might like
PHP - Html Transfer Code
2006/10/09 PHP
thinkPHP2.1自定义标签库的导入方法详解
2016/07/20 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
js静态方法与实例方法分析
2011/07/04 Javascript
Javascript表格翻页效果的具体实现
2013/10/05 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
2016年最热门的15 款代码语法高亮工具,美化你的代码
2016/01/06 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
理解JavaScript原型链
2016/10/25 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
webpack的CSS加载器的使用
2018/09/11 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
2018/09/13 Javascript
一步步教你利用Docker设置Node.js
2018/11/20 Javascript
使用Typescript和ES模块发布Node模块的方法
2020/05/25 Javascript
原生JavaScript写出Tabs标签页的实例代码
2020/07/20 Javascript
JavaScript基于SVG的图片切换效果实例代码
2020/12/15 Javascript
python中的__slots__使用示例
2015/02/26 Python
Python isinstance函数介绍
2015/04/14 Python
Python中字典映射类型的学习教程
2015/08/20 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
3分钟学会一个Python小技巧
2018/11/23 Python
浅谈Python反射 &amp; 单例模式
2019/03/21 Python
在pycharm中配置Anaconda以及pip源配置详解
2019/09/09 Python
django在保存图像的同时压缩图像示例代码详解
2020/02/11 Python
Python可以用来做什么
2020/11/23 Python
德国旅行、体验和活动的预订平台:Watado
2019/12/04 全球购物
建筑行业的大学生自我评价
2013/12/08 职场文书
优秀护士演讲稿
2014/04/30 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
2016十一国庆节慰问信
2015/12/01 职场文书
《失物招领》教学反思
2016/02/20 职场文书
2019广播稿怎么写
2019/04/17 职场文书
浅谈sql_@SelectProvider及使用注意说明
2021/08/04 Java/Android
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
2022/04/13 Java/Android
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers