前言
在上一章vue学习笔记(三)class和style绑定的内容中,我们学习了如何在vue中绑定class和style,介绍了常用的绑定方法,class的数组绑定和对象绑定以及style的数组绑定和对象绑定,本篇博客将会讲解关于vue中事件的使用。
其实关于事件我们都不陌生,在学习JavaScript的时候就有接触过,例如点击事件,鼠标事件,键盘事件以及移动端的触摸事件等等。在学习vue的事件处理之前我们先回顾一下在Javascript中是如何绑定事件的吧!
Javascript绑定事件
方法一:直接在标签上绑定
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <button onclick="add()">你好</button> <script type="text/javascript"> function add(){ alert('你好') } </script> </body> </html>
方法二:通过获取节点动态绑定
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <button id="btn">问候</button> <script type="text/javascript"> document.getElementById('btn').onclick=function(){ alert('你好') } </script> </body> </html>
方法三:使用addEventListener监听事件
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <button id="btn">问候</button> <script type="text/javascript"> document.getElementById('btn').addEventListener('click',function(){ alert('你好') },false) </script> </body> </html>
区别:
- 用 “addeventlistener" 可以多次绑定同一个事件,且都会执行。
- 在DOM结构如果绑定两个 "onclick" 事件,只会执行第一个。
- 在脚本通过匿名函数的方式绑定的只会执行最后一个事件。
vue中绑定事件
vue中绑定事件的方法其实和JavaScript中绑定事件都差不多,不信,我们来看看实例就一目了然了。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <button @click="greet('你好')">问候</button> </div> <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> const vm=new Vue({ el:'#app', data:{ }, computed:{ }, methods:{ greet(msg){ alert(msg); } } }) </script> </body> </html>
现在感觉是不是差不多呀!vue中的事件(方法)统一由methods管理,任何处理的方法都必须写在这里面。
接下来我讲解一下vue事件处理带括号和没有带括号的区别。
示例:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <button @click="greet('你好',$event)">问候</button> <button @click="say">打招呼</button> </div> <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> const vm=new Vue({ el:'#app', data:{ }, computed:{ }, methods:{ greet(msg,event){ alert(msg); console.log(event); }, say(event){ console.log(event); } } }) </script> </body> </html>
结果:
区别:在于事件对象参数 event 的处理。不加括号时,函数第一个参数为 event,加了括号后,需要手动传入 $event 才能获得事件对象。
事件修饰符
在事件处理程序中调用 event.preventDefault()
或 event.stopPropagation()
是非常常见的需求。尽管我们可以在方法中轻松实现这点,但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理 DOM 事件细节。
为了解决这个问题,vue.js 为 v-on
提供了事件修饰符。之前提过,修饰符是由点开头的指令后缀来表示的,比如下面的这些。
.stop
.prevent
.capture
.self
.once
.passive
- .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> <!-- 点击事件将只会触发一次 --> <a v-on:click.once="doThis"></a>
示例:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <button v-on:click.once="greet()">问候</button> </div> <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> const vm=new Vue({ el:'#app', data:{ }, computed:{ }, methods:{ greet:function(){ alert('你好') } } }) </script> </body> </html>
示例中我们点击事件只能调用一次,当点击第二次的时候它不会有任何的反应。
注意:
使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 v-on:click.prevent.self
会阻止所有的点击,而 v-on:click.self.prevent
只会阻止对元素自身的点击。
按键修饰符
在监听键盘事件时,我们经常需要检查详细的按键。vue 允许为 v-on
在监听键盘事件时添加按键修饰符。
<!-- 只有在 `key` 是 `Enter` 时调用 `submit()方法` --> <input v-on:keyup.enter="submit">
示例:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <div id="app"> <button v-on:keyup.enter="greet()">问候</button> </div> <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript"> const vm=new Vue({ el:'#app', data:{ }, computed:{ }, methods:{ greet:function(){ alert('你好') } } }) </script> </body> </html>
按键码
为了在必要的情况下支持旧浏览器,Vue 提供了绝大多数常用的按键码的别名:
.enter .tab .delete (捕获“删除”和“退格”键) .esc .space .up .down .left .right
系统修饰符
可以用如下修饰符来实现仅在按下相应按键时才触发鼠标或键盘事件的监听器。
.ctrl
.alt
.shift
.meta
.exact修饰符
.exact
修饰符允许你控制由精确的系统修饰符组合触发的事件。
<!-- 即使 Alt 或 Shift 被一同按下时也会触发 --> <button @click.ctrl="onClick">A</button> <!-- 有且只有 Ctrl 被按下的时候才触发 --> <button @click.ctrl.exact="onCtrlClick">A</button> <!-- 没有任何系统修饰符被按下的时候才触发 --> <button @click.exact="onClick">A</button>
鼠标按钮修饰符
.left
.right
.middle
这些修饰符会限制处理函数仅响应特定的鼠标按钮。