Vue.JS入门教程之事件监听


Posted in Javascript onDecember 01, 2016

你可以使用 v-on 指令来绑定并监听 DOM 事件。绑定的内容可以是一个当前实例上的方法 (后面无需跟括号) 或一个内联表达式。如果提供的是一个方法,则原生的 DOM event 会被作为第一个参数传入,同时这个 event 会带有 targetVM 属性,指向触发该事件的相应的 ViewModel:

<div id="demo">
 <a v-on="click: onClick">触发一个方法函数</a>
 <a v-on="click: n++">触发一个表达式</a>
</div>
new Vue({
 el: '#demo',
 data: {
  n: 0
 },
 methods: {
  onClick: function (e) {
  console.log(e.targetVM.n);
  console.log(e.target.tagName);// "A"
  console.log(e.targetVM === this);// true
  }
 }
 });

执行表达式

当在 v-repeat 里使用 v-on 时,targetVM 显得很有用,因为 v-repeat 会创建大量子 ViewModel。但是,通过执行表达式的方式,把代表当前 ViewModel 数据对象的别名传进去,会更方便直观一些:

<ul id="list">
 <li v-repeat="item in items" v-on="click: toggle(item)">
 {{item.text}}
 </li>
 <button v-on="click: submit('hello!', $event)">Submit</button>
</ul>
new Vue({
 el: '#list',
 data: {
  items: [
  { text: 'one', done: true },
  { text: 'two', done: false }
  ]
 },
 methods: {
  toggle: function (item) {
  console.info(item.done);
  item.done = !item.done;
  console.info(item.done);
  },
  submit: function (msg, e) {
  e.stopPropagation();
  console.info(msg + ' submit is called!');
  }
 }
 })

当你想要在表达式中访问原来的 DOM event,你可以传递一个 $event 参数进去。

key过滤器
当监听键盘事件时,我们常常需要判断常用的 key code。Vue.js 提供了一个特殊的只能用在 v-on 指令的过滤器:key。它接收一个表示 key code 的参数并完成判断:

<!-- 只有当 keyCode 等于 13 时才调用方法 -->
 <input v-on="keyup:mySubmit | key 13">

系统有很多预设值可以使用,例如:

<!-- 效果同上 -->
<input v-on="keyup:submit | key 'enter'">

预设值为:enter tab delete esc up down left right space

为什么在HTML中使用监听器
你可能会注意到整个事件监听的方式违背了 “separation of concern” 的传统理念。不必担心,因为所有的 Vue.js 事件处理方法和表达式都严格绑定在当前视图的 ViewModel 上,它不会导致任何维护困难。实际上,使用 v-on 还有更多好处:

它便于在 HTML 模板中轻松定位 JS 代码里的对应方法实现。
因为你无须在 JS 里手动绑定事件,你的 ViewModel 代码可以是非常纯粹的逻辑,和 DOM 完全解耦。这会更易于测试。
当一个 ViewModel 被销毁时,所有的事件监听都会被自动移除。你无须担心如何自行清理它们。

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

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

Javascript 相关文章推荐
建立良好体验度的Web注册系统ajax
Jul 09 Javascript
用JavaScript对JSON进行模式匹配 (Part 2 - 实现)
Jul 17 Javascript
jQuery 对Select的操作备忘记录
Jul 04 Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
Feb 03 Javascript
javascript中的正则表达式使用指南
Mar 01 Javascript
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
Jan 20 Javascript
深入浅析js原型链和vue构造函数
Oct 25 Javascript
详解Vue中组件传值的多重实现方式
Aug 16 Javascript
js中的this的指向问题详解
Aug 29 Javascript
Vue根据条件添加click事件的方式
Nov 09 Javascript
uni-app使用微信小程序云函数的步骤示例
May 22 Javascript
JavaScript使用canvas绘制坐标和线
Apr 28 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
Dec 01 #Javascript
BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法
Dec 01 #Javascript
jsTree使用记录实例
Dec 01 #Javascript
Vue.JS入门教程之列表渲染
Dec 01 #Javascript
Vue.JS入门教程之处理表单
Dec 01 #Javascript
利用js获取下拉框中所选的值
Dec 01 #Javascript
js微信扫描二维码登录网站技术原理
Dec 01 #Javascript
You might like
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
2013/06/18 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
2014/08/06 PHP
php中的ini配置原理详解
2014/10/14 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
用js来解决ajax读取页面乱码
2010/11/28 Javascript
细说javascript函数从函数的构成开始
2013/08/29 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
理解javascript中的回调函数(callback)
2014/09/02 Javascript
探寻Javascript执行效率问题
2014/11/12 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
vue分类筛选filter方法简单实例
2017/03/30 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
ajax请求data遇到的问题分析
2018/01/18 Javascript
微信网页登录逻辑与实现方法
2019/04/29 Javascript
[01:08:17]2018DOTA2亚洲邀请赛3月29日 小组赛B组 EG VS VGJ.T
2018/03/30 DOTA
跟老齐学Python之使用Python查询更新数据库
2014/11/25 Python
Python 使用 docopt 解析json参数文件过程讲解
2019/08/13 Python
Python socket服务常用操作代码实例
2020/06/22 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
Python绘制组合图的示例
2020/09/18 Python
Smashbox官网:美国知名彩妆品牌
2017/01/05 全球购物
Nike瑞典官方网站:Nike.com (SE)
2018/11/26 全球购物
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
大学生自我鉴定范文模板
2014/01/21 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
护理专业学生职业生涯规划范文
2014/03/11 职场文书
献爱心倡议书
2014/04/14 职场文书
热门专业求职信
2014/05/24 职场文书
销售业务员岗位职责
2015/02/13 职场文书
刑事附带民事代理词
2015/05/25 职场文书
元旦联欢晚会主持词
2015/07/01 职场文书
python实现简易名片管理系统
2021/04/11 Python
css 边框添加四个角的实现代码
2021/10/16 HTML / CSS