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 相关文章推荐
picChange 图片切换特效的函数代码
May 06 Javascript
js创建数据共享接口——简化框架之间相互传值
Oct 23 Javascript
js捕获鼠标右键菜单中的粘帖事件实现代码
Apr 01 Javascript
JavaScript导航脚本判断当前导航
Jul 12 Javascript
Javascript中判断一个值是否为undefined的方法详解
Sep 28 Javascript
不使用script导入js文件的几种方法
Oct 27 Javascript
jQuery设置Easyui校验规则(推荐)
Nov 21 Javascript
总结几道关于Node.js的面试问题
Jan 11 Javascript
详解vue axios二次封装
Jul 22 Javascript
JS实现计算小于非负数n的素数的数量算法示例
Feb 26 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
May 30 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
Nov 15 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
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
php新浪微博登录接口用法实例
2014/12/23 PHP
PHP7.0版本备注
2015/07/23 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
document.all与WEB标准
2020/05/13 Javascript
深入认识JavaScript中的函数
2007/01/22 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
textarea 控制输入字符字节数(示例代码)
2013/12/27 Javascript
Nodejs进程管理模块forever详解
2014/06/01 NodeJs
javascript获取flash版本号的方法
2014/11/20 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
Nodejs实现批量下载妹纸图
2015/05/28 NodeJs
jQuery插件bgStretcher.js实现全屏背景特效
2015/06/05 Javascript
JavaScript实现向右伸出的多级网页菜单效果
2015/08/25 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
微信小程序删除处理详解
2017/08/16 Javascript
VUE 解决mode为history页面为空白的问题
2019/11/01 Javascript
从零学Python之hello world
2014/05/21 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
python 实现波浪滤镜特效
2020/12/02 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
2014年社会实践活动总结范文
2014/04/29 职场文书
购房委托书范本
2014/09/18 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
酒店销售经理岗位职责
2015/04/02 职场文书
通知的写法
2015/04/23 职场文书
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers
提高系统的吞吐量解决数据库重复写入问题
2022/04/23 MySQL
redis protocol通信协议及使用详解
2022/07/15 Redis