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代码的实现一个图片向上滚动切换
Sep 02 Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
Jan 15 Javascript
JavaScript字符串String和Array操作的有趣方法
Dec 18 Javascript
jquery 插件开发 extjs中的extend用法小结
Jan 04 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
Jun 08 Javascript
Three.js实现简单3D房间布局
Dec 30 Javascript
jQuery实现的简单歌词滚动功能示例
Jan 07 jQuery
node.js的http.createServer过程深入解析
Jun 06 Javascript
javascript移动端 电子书 翻页效果实现代码
Sep 07 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
Feb 11 Javascript
javascript实现移动端触屏拖拽功能
Jul 29 Javascript
解读Vue组件注册方式
May 15 Vue.js
基于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实现文件安全下载
2006/10/09 PHP
php 常用类汇总 推荐收藏
2010/05/13 PHP
php二维数组排序详解
2013/11/06 PHP
php格式化时间戳显示友好的时间实现思路及代码
2014/10/23 PHP
php制作文本式留言板
2015/03/18 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
2018/04/26 PHP
Laravel事件监听器用法实例分析
2019/03/12 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
javascript 避免闭包引发的问题
2009/03/17 Javascript
jquery delay()介绍及使用指南
2014/09/02 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
JavaScript函数参数使用带参数名的方式赋值传入的方法
2015/03/19 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
jquery实现全屏滚动
2015/12/28 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
网页中右键功能的实现方法之contextMenu的使用
2017/02/20 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
微信小程序实现日历功能
2018/11/27 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
在vue中给后台接口传的值为数组的格式代码
2020/11/12 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
树莓派使用USB摄像头和motion实现监控
2019/06/22 Python
python集合的新增元素方法整理
2020/12/07 Python
如何利用Python matplotlib绘制雷达图
2020/12/21 Python
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
linux下进程间通信的方式
2013/01/23 面试题
Unix控制后台进程都有哪些进程
2016/09/22 面试题
小学教师的个人自我鉴定
2013/10/26 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
关于成绩下滑的自我检讨书
2014/09/20 职场文书
居住证明范文
2015/06/17 职场文书
公司致全体员工的感谢信
2019/06/24 职场文书
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python