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中汉字显示乱码问题(已解决)
Dec 27 Javascript
浅析JQuery中的html(),text(),val()区别
Sep 01 Javascript
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
Dec 15 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
Jun 14 Javascript
bootstrap使用validate实现简单校验功能
Dec 02 Javascript
javascript简单链式调用案例分析
May 10 Javascript
vue+axios实现登录拦截的实例代码
May 22 Javascript
微信小程序使用form表单获取输入框数据的实例代码
May 17 Javascript
详解node字体压缩插件font-spider的用法
Sep 28 Javascript
Vuex 模块化使用详解
Jul 31 Javascript
vue 自定义组件的写法与用法详解
Mar 04 Javascript
vue渲染方式render和template的区别
Jun 05 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一个找二层目录的小东东
2012/08/02 PHP
解析ajax事件的调用顺序
2013/06/17 PHP
php ImageMagick windows下安装教程
2015/01/26 PHP
PHP中Session可能会引起并发问题
2015/06/26 PHP
PHP 实现文件压缩解压操作的方法
2019/06/14 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
[HTML/CSS/Javascript]WWTJS
2007/09/25 Javascript
javascript不同页面传值的改进版
2008/09/30 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
2014/01/02 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
jquery删除table当前行的实例代码
2016/10/07 Javascript
javascript过滤数组重复元素的实现方法
2017/05/03 Javascript
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
2018/09/27 Javascript
小程序实现背景音乐播放和暂停
2020/06/19 Javascript
简介Django框架中可使用的各类缓存
2015/07/23 Python
Django框架下在URLconf中指定视图缓存的方法
2015/07/23 Python
python生成词云的实现方法(推荐)
2017/06/13 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
Django+python服务器部署与环境部署教程详解
2020/03/30 Python
Python基于Tkinter编写crc校验工具
2020/05/06 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
使用pyplot.matshow()函数添加绘图标题
2020/06/16 Python
Python常用模块函数代码汇总解析
2020/08/31 Python
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
创业计划书怎样才能打动风投
2014/01/01 职场文书
六一儿童节活动策划方案
2014/01/27 职场文书
公司司机岗位职责
2014/02/07 职场文书
《桃林那间小木屋》教学反思
2014/05/01 职场文书
ktv好的活动方案
2014/08/17 职场文书
2014年社区教育工作总结
2014/12/02 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
礼仪培训心得体会
2016/01/22 职场文书
排查并解决Oracle sysaux表空间异常增长
2022/04/20 Oracle