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 模拟气泡屏保效果代码
Jul 10 Javascript
线路分流自动智能跳转代码,自动选择最快镜像网站(js)
Oct 31 Javascript
将两个div左右并列显示并实现点击标题切换内容
Oct 22 Javascript
纯JavaScript实现的分页插件实例
Jul 14 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
Dec 04 Javascript
使用jQuery给input标签设置默认值
Jun 20 Javascript
js制作网站首页图片轮播特效代码
Aug 30 Javascript
Vue数据驱动模拟实现5
Jan 13 Javascript
小程序分享模块超级详解(推荐)
Apr 10 Javascript
深入学习JavaScript中的bom
May 27 Javascript
简单了解Vue + ElementUI后台管理模板
Apr 07 Javascript
vue过滤器实现日期格式化的案例分析
Jul 02 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教程 预定义变量
2009/10/23 PHP
laravel5表单唯一验证的实例代码
2019/09/30 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
2019/09/30 PHP
跨域请求之jQuery的ajax jsonp的使用解惑
2011/10/09 Javascript
chrome浏览器不支持onmouseleave事件的解决技巧
2013/05/31 Javascript
jQuery+ajax中getJSON() 用法实例
2014/12/22 Javascript
javascript实现checkBox的全选,反选与赋值
2015/03/12 Javascript
JavaScript学习笔记之数组求和方法
2016/03/23 Javascript
简单分析javascript中的函数
2016/09/10 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
详解vue配置后台接口方式
2019/03/29 Javascript
基于JavaScript实现随机点名器
2021/02/25 Javascript
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
2016/08/30 Python
Python实现好友全头像的拼接实例(推荐)
2017/06/24 Python
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
tf.truncated_normal与tf.random_normal的详细用法
2018/03/05 Python
对python自动生成接口测试的示例讲解
2018/11/30 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
2020/03/16 Python
python 实现的IP 存活扫描脚本
2020/12/10 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
css3 自定义字体font-face使用介绍
2014/05/14 HTML / CSS
利用CSS3实现的文字定时向上滚动
2016/08/29 HTML / CSS
六一儿童节主持词
2014/03/21 职场文书
个人考核材料
2014/05/15 职场文书
保护野生动物倡议书
2014/05/16 职场文书
企业党员个人自我评价
2014/09/20 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
学生检讨书范文
2015/01/27 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
2015元旦感言
2015/12/09 职场文书
导游词之河北邯郸
2019/09/12 职场文书
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang