在上一章vue学习笔记(三)class和style绑定的内容中,咱们学习了如何在vue中绑定class和style,介绍了经常使用的绑定方法,class的数组绑定和对象绑定以及style的数组绑定和对象绑定,本篇博客将会讲解关于vue中事件的使用。javascript
其实关于事件咱们都不陌生,在学习JavaScript的时候就有接触过,例如点击事件,鼠标事件,键盘事件以及移动端的触摸事件等等。在学习vue的事件处理以前咱们先回顾一下在Javascript中是如何绑定事件的吧!html
<!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>
<!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>
区别:vue
vue中绑定事件的方法其实和JavaScript中绑定事件都差很少,不信,咱们来看看实例就一目了然了。java
<!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>
结果:app
区别:在于事件对象参数 event 的处理。不加括号时,函数第一个参数为 event,加了括号后,须要手动传入 $event 才能得到事件对象。函数
在事件处理程序中调用 event.preventDefault()
或 event.stopPropagation()
是很是常见的需求。尽管咱们能够在方法中轻松实现这点,但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理 DOM 事件细节。post
为了解决这个问题,vue.js 为 v-on
提供了事件修饰符。以前提过,修饰符是由点开头的指令后缀来表示的,好比下面的这些。学习
.stop
.prevent
.capture
.self
.once
.passive
<!-- 阻止单击事件继续传播 --> <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
修饰符容许你控制由精确的系统修饰符组合触发的事件。
<!-- 即便 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
这些修饰符会限制处理函数仅响应特定的鼠标按钮。