详解Vue 方法与事件处理器


Posted in Javascript onJune 20, 2017

方法与事件处理器

方法处理器

可以用 v-on 指令监听 DOM 事件:

<div id="example">
 <button v-on:click="greet">Greet</button>
</div>

我们绑定了一个单击事件处理器到一个方法 greet。下面在 Vue 实例中定义这个方法:

var vm = new Vue({
 el: '#example',
 data: {
  name: 'Vue.js'
 },
 // 在 `methods` 对象中定义方法
 methods: {
  greet: function (event) {
   // 方法内 `this` 指向 vm
   alert('Hello ' + this.name + '!')
   // `event` 是原生 DOM 事件
   alert(event.target.tagName)
  }
 }
})

// 也可以在 JavaScript 代码中调用方法
vm.greet() // -> 'Hello Vue.js!'

内联语句处理器

除了直接绑定到一个方法,也可以用内联 JavaScript 语句:

<div id="example-2">
 <button v-on:click="say('hi')">Say Hi</button>
 <button v-on:click="say('what')">Say What</button>
</div>

new Vue({
 el: '#example-2',
 methods: {
  say: function (msg) {
   alert(msg)
  }
 }
})

类似于内联表达式,事件处理器限制为一个语句。

有时也需要在内联语句处理器中访问原生 DOM 事件。可以用特殊变量 $event 把它传入方法:

<button v-on:click="say('hello!', $event)">Submit</button>
// ...
methods: {
 say: function (msg, event) {
  // 现在我们可以访问原生事件对象
  event.preventDefault()
 }
}

事件修饰符

在事件处理器中经常需要调用 event.preventDefault() 或 event.stopPropagation()。尽管我们在方法内可以轻松做到,不过让方法是纯粹的数据逻辑而不处理 DOM 事件细节会更好。

为了解决这个问题,Vue.js 为 v-on 提供两个 事件修饰符:.prevent 与 .stop。你是否还记得修饰符是点号打头的指令后缀?

<!-- 阻止单击事件冒泡 -->
<a v-on:click.stop="doThis"></a>

<!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form>

<!-- 修饰符可以串联 -->
<a v-on:click.stop.prevent="doThat">

<!-- 只有修饰符 -->
<form v-on:submit.prevent></form>

1.0.16 添加了两个额外的修饰符:

<!-- 添加事件侦听器时使用 capture 模式 -->
<div v-on:click.capture="doThis">...</div>

<!-- 只当事件在该元素本身(而不是子元素)触发时触发回调 -->
<div v-on:click.self="doThat">...</div>

按键修饰符

在监听键盘事件时,我们经常需要检测 keyCode。Vue.js 允许为 v-on 添加按键修饰符:

<!-- 只有在 keyCode 是 13 时调用 vm.submit() -->
<input v-on:keyup.13="submit">

记住所有的 keyCode 比较困难,Vue.js 为最常用的按键提供别名:

<!-- 同上 -->
<input v-on:keyup.enter="submit">

<!-- 缩写语法 -->
<input @keyup.enter="submit">

全部的按键别名: 

enter
tab
delete
esc
space
up
down
left
right

1.0.8+: 支持单字母按键别名。

1.0.17+: 可以自定义按键别名:

// 可以使用 @keyup.f1
Vue.directive('on').keyCodes.f1 = 112

为什么在 HTML 中监听事件?

你可能注意到这种事件监听的方式违背了传统理念 “separation of concern”。不必担心,因为所有的 Vue.js 事件处理方法和表达式都严格绑定在当前视图的 ViewModel 上,它不会导致任何维护困难。实际上,使用 v-on 有几个好处:

1.扫一眼 HTML 模板便能轻松定位在 JavaScript 代码里对应的方法。

2.因为你无须在 JavaScript 里手动绑定事件,你的 ViewModel 代码可以是非常纯粹的逻辑,和 DOM 完全解耦,更易于测试。

3.当一个 ViewModel 被销毁时,所有的事件处理器都会自动被删除。你无须担心如何自己清理它们。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
简单实例处理url特殊符号&amp;处理(2种方法)
Apr 02 Javascript
jquery配合css简单实现返回顶部效果
Sep 30 Javascript
jquery submit ie6下失效的原因分析及解决方法
Nov 15 Javascript
node.js中的fs.mkdirSync方法使用说明
Dec 17 Javascript
JQuery自动触发事件的方法
Jun 13 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
Jul 23 Javascript
Three.js利用性能插件stats实现性能监听的方法
Sep 25 Javascript
利用Javascript获取选择文本所在的句子详解
Dec 03 Javascript
C#实现将一个字符转换为整数
Dec 12 Javascript
element ui里dialog关闭后清除验证条件方法
Feb 26 Javascript
vue print.js打印支持Echarts图表操作
Nov 13 Javascript
深入理解javascript中的this
Feb 08 Javascript
Vue Ajax跨域请求实例详解
Jun 20 #Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
Jun 20 #Javascript
详解Angular的8个主要构造块
Jun 20 #Javascript
vue之数据交互实例代码
Jun 20 #Javascript
jquery加载单文件vue组件的方法
Jun 20 #jQuery
Angular.JS中select下拉框设置value的方法
Jun 20 #Javascript
原生js二级联动效果
Jun 20 #Javascript
You might like
php获取当前网址url并替换参数或网址的方法
2010/06/06 PHP
解析PHP处理换行符的问题 \r\n
2013/06/13 PHP
基于php和mysql的简单的dao类实现crud操作功能
2014/01/27 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
php实现的日历程序
2015/06/18 PHP
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
2015/08/27 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
jQuery EasyUI中DataGird动态生成列的方法
2016/04/05 Javascript
JavaScript中object和Object的区别(详解)
2017/02/27 Javascript
从零开始学习Node.js系列教程之基于connect和express框架的多页面实现数学运算示例
2017/04/13 Javascript
vue + webpack如何绕过QQ音乐接口对host的验证详解
2018/07/01 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
python实现将pvr格式转换成pvr.ccz的方法
2015/04/28 Python
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
linux环境下的python安装过程图解(含setuptools)
2017/11/22 Python
python抽取指定url页面的title方法
2018/05/11 Python
浅谈Python中os模块及shutil模块的常规操作
2020/04/03 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
2021/01/28 Python
在html页面中取得session中的值的方法
2020/08/11 HTML / CSS
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
如何减少垃圾回收让内存更加有效使用
2013/10/18 面试题
小学综治宣传月活动总结
2014/07/02 职场文书
学前教育专业求职信
2014/09/02 职场文书
介绍信范文
2015/01/31 职场文书
检讨书格式
2015/05/07 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
苹果的回收机器人可以通过拆解iPhone获取大量的金和铜并外公布了环境保护最新进展
2022/04/21 数码科技
html5+实现plus.io进行拍照和图片等获取
2022/06/01 HTML / CSS