详解Vue 方法与事件处理器


Posted in Javascript onJune 20, 2017

方法与事件处理器

方法处理器

可以用 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 被销毁时,所有的事件处理器都会自动被删除。你无须担心如何自己清理它们。

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

Javascript 相关文章推荐
判断客户端浏览器是否安装了Flash插件的多种方法
Aug 11 Javascript
基于jquery的关于动态创建DOM元素的问题
Dec 24 Javascript
获得Javascript对象属性个数的示例代码
Nov 21 Javascript
js 弹出新页面避免被浏览器、ad拦截的一种新方法
Apr 30 Javascript
canvas时钟效果
Feb 16 Javascript
js实现4个方向滚动的球
Mar 06 Javascript
基于JQuery和原生JavaScript实现网页定位导航特效
Apr 03 jQuery
xmlplus组件设计系列之分隔框(DividedBox)(8)
May 02 Javascript
Node.js实现发送邮件功能
Nov 06 Javascript
Element-UI中Upload上传文件前端缓存处理示例
Feb 21 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
Jun 21 Javascript
vuex state中的数组变化监听实例
Nov 06 Javascript
Vue Ajax跨域请求实例详解
Jun 20 #Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
Jun 20 #Javascript
详解Angular的8个主要构造块
Jun 20 #Javascript
vue之数据交互实例代码
Jun 20 #Javascript
jquery加载单文件vue组件的方法
Jun 20 #jQuery
Angular.JS中select下拉框设置value的方法
Jun 20 #Javascript
原生js二级联动效果
Jun 20 #Javascript
You might like
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
2014/06/25 PHP
PHP基于数组实现的分页函数实例
2014/08/20 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
将HTML自动转为JS代码
2006/06/26 Javascript
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
jQuery的:parent选择器定义和用法
2014/07/01 Javascript
JS来动态的修改url实现对url的增删查改
2014/09/05 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
BootStrap的table表头固定tbody滚动的实例代码
2016/08/24 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
详解JavaScript中this的指向问题
2017/01/20 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
用Vue编写抽象组件的方法
2019/05/06 Javascript
微信小程序和H5页面间相互跳转代码实例
2019/09/19 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
详解 javascript对象创建模式
2020/10/30 Javascript
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
Python2.7 实现引入自己写的类方法
2018/04/29 Python
Django集成celery发送异步邮件实例
2019/12/17 Python
Python3基本输入与输出操作实例分析
2020/02/14 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
介绍下WebSphere的安全性
2013/01/31 面试题
计算机开发个人求职信范文
2013/09/26 职场文书
公司寄语大全
2014/04/10 职场文书
公路绿化方案
2014/05/12 职场文书
公务员年度个人总结
2015/02/12 职场文书
销售区域经理岗位职责
2015/04/10 职场文书
2016年小学中秋节活动总结
2016/04/05 职场文书
解决Python字典查找报Keyerror的问题
2021/05/26 Python
输入框跟随文字内容适配宽实现示例
2022/08/14 Javascript