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 相关文章推荐
JS 参数传递的实际应用代码分析
Sep 13 Javascript
javascript在IE下trim函数无法使用的解决方法
Sep 12 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
Feb 02 Javascript
易操作的jQuery表单提示插件
Dec 01 Javascript
JS实现的添加弹出层并完成锁屏操作示例
Apr 07 Javascript
Vuex之理解state的用法实例
Apr 19 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
May 07 Javascript
微信小程序页面滚动到指定位置代码实例
Sep 07 Javascript
layer提示框添加多个按钮选择的实例
Sep 12 Javascript
Javascript 关于基本类型和引用类型的个人理解
Nov 01 Javascript
vue多个元素的样式选择器问题
Nov 29 Javascript
vue 移动端记录页面浏览位置的方法
Mar 11 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
php中关于普通表单多文件上传的处理方法
2011/03/25 PHP
如何用javascript判断录入的日期是否合法
2007/01/08 Javascript
一个用js实现的页内搜索代码
2007/05/23 Javascript
jquery 年会抽奖程序
2011/12/22 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
Javascript中使用A标签获取当前目录的绝对路径方法
2015/03/02 Javascript
充分发挥Node.js程序性能的一些方法介绍
2015/06/23 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
jquery自定义右键菜单、全选、不连续选择
2016/03/01 Javascript
JS深度拷贝Object Array实例分析
2016/03/31 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
原生js实现弹出层登录拖拽功能
2016/12/05 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
2016/12/17 Javascript
angular十大常见问题
2017/03/07 Javascript
jQuery插件之validation插件
2017/03/29 jQuery
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
Bootstrap table使用方法汇总
2017/11/17 Javascript
nodejs操作mongodb的填删改查模块的制作及引入实例
2018/01/02 NodeJs
详解Node.js中path模块的resolve()和join()方法的区别
2018/10/29 Javascript
VUE注册全局组件和局部组件过程解析
2019/10/10 Javascript
js实现左右轮播图
2020/01/09 Javascript
给Python中的MySQLdb模块添加超时功能的教程
2015/05/05 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
Python如何读取、写入JSON数据
2020/07/28 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
伦敦一家西班牙童装精品店:La Coqueta
2018/02/02 全球购物
abstract是什么意思
2012/02/12 面试题
Java中会存在内存泄漏吗,请简单描述
2016/12/22 面试题
水污染治理专业毕业生推荐信
2013/11/14 职场文书
学校领导班子群众路线整改措施
2014/09/16 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书