Vue.js每天必学之方法与事件处理器


Posted in Javascript onSeptember 06, 2016

方法处理器

可以用 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 被销毁时,所有的事件处理器都会自动被删除。你无须担心如何自己清理它们。

本文已被整理到了《Vue.js前端组件学习教程》,欢迎大家学习阅读。

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

Javascript 相关文章推荐
到处都是jQuery选择器的年代 不了解它们的性能,行吗
Jun 18 Javascript
JavaScript DOM操作表格及样式
Apr 13 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
Feb 23 Javascript
js闭包引起的事件注册问题介绍
Mar 29 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
May 10 Javascript
Bootstrap开发实战之第一次接触Bootstrap
Jun 02 Javascript
修改Jquery Dialog 位置的实现方法
Aug 26 Javascript
JS实现“隐藏与显示”功能(多种方法)
Nov 24 Javascript
jQuery实现的点击按钮改变样式功能示例
Jul 21 jQuery
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
Mar 27 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
Apr 19 Javascript
js回到页面指定位置的三种方式
Dec 17 Javascript
基于JavaScript实现购物网站商品放大镜效果
Sep 06 #Javascript
AngularGauge 属性解析详解
Sep 06 #Javascript
AngularJS 面试题集锦
Sep 06 #Javascript
BootStrap glyphicon图标无法显示的解决方法
Sep 06 #Javascript
JS原型链 详解及示例代码
Sep 06 #Javascript
JavaScript中push(),join() 函数 实例详解
Sep 06 #Javascript
jquery实现全选、不选、反选的两种方法
Sep 06 #Javascript
You might like
咖啡与水的关系
2021/03/03 冲泡冲煮
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
中高级PHP程序员应该掌握哪些技术?
2016/09/23 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
2019/02/15 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
2019/04/09 PHP
Js+XML 操作
2006/09/20 Javascript
脚本吧 - 幻宇工作室用到js,超强推荐share.js
2006/12/23 Javascript
不要在cookie中使用特殊字符的原因分析
2010/07/13 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
js判断undefined变量类型使用typeof
2013/06/03 Javascript
js获取GridView中行数据的两种方法 分享
2013/07/13 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
jsp网页搜索结果中实现选中一行使其高亮
2014/02/17 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
2017/03/30 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
微信小程序日历弹窗选择器代码实例
2019/05/09 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
解决vue项目获取dom元素宽高总是不准确问题
2020/07/29 Javascript
python中的五种异常处理机制介绍
2014/09/02 Python
Python自动化运维之IP地址处理模块详解
2017/12/10 Python
Python使用pickle模块储存对象操作示例
2018/08/15 Python
Python跳出多重循环的方法示例
2019/07/03 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
房屋出租协议书
2014/04/10 职场文书
幼儿园中班评语大全
2014/04/17 职场文书
投标承诺书怎么写
2014/05/24 职场文书
2014年教师节活动总结
2014/08/29 职场文书
教师个人发展总结
2015/02/11 职场文书
异地恋情人节寄语
2015/02/28 职场文书
初中化学教学反思
2016/02/22 职场文书
同学会演讲稿
2019/04/02 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书