详解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 相关文章推荐
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
Sep 03 Javascript
提取字符串中年月日的函数代码
Nov 05 Javascript
js实现的二分查找算法实例
Jan 21 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
Feb 10 Javascript
jQuery 添加样式属性的优先级别方法(推荐)
Jun 08 jQuery
深入研究React中setState源码
Nov 17 Javascript
使用mint-ui实现省市区三级联动效果的示例代码
Feb 09 Javascript
Vue-cli3项目配置Vue.config.js实战记录
Jul 29 Javascript
在Chrome DevTools中调试JavaScript的实现
Apr 07 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
Oct 24 Javascript
vue created钩子函数与mounted钩子函数的用法区别
Nov 05 Javascript
vue-element-admin项目导入和导出的实现
May 21 Vue.js
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
excellent!――ASCII Art(由目标图象生成ascii)
2007/02/20 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
2014/07/30 PHP
php实现的CSS更新类实例
2014/09/22 PHP
Mac环境下php操作mysql数据库的方法分享
2015/05/11 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
PHP模板引擎Smarty中的保留变量用法分析
2016/04/11 PHP
PHP 5.6.11中CURL模块问题的解决方法
2016/08/08 PHP
PHP命名空间namespace及use的简单用法分析
2018/08/03 PHP
javascript parseInt 大改造
2009/09/27 Javascript
jquery插件珍藏(图片局部放大/信息提示框)
2013/01/08 Javascript
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
vue-router单页面路由
2017/06/17 Javascript
ES6新增数据结构WeakSet的用法详解
2017/08/07 Javascript
解决vue v-for 遍历循环时key值报错的问题
2018/09/06 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
bootstrap table实现iview固定列的效果实例代码详解
2019/09/30 Javascript
JS Thunk 函数的含义和用法实例总结
2020/04/08 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
基于ID3决策树算法的实现(Python版)
2017/05/31 Python
对python pandas 画移动平均线的方法详解
2018/11/28 Python
python实现数据清洗(缺失值与异常值处理)
2019/12/02 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
乌克兰鞋类购物网站:Eobuv.com.ua
2020/11/28 全球购物
2014年党员教师自我剖析材料
2014/09/30 职场文书
办公室文员岗位职责
2015/02/04 职场文书
医学生自荐信范文
2015/03/05 职场文书
委托收款证明
2015/06/23 职场文书
大学运动会加油稿
2015/07/22 职场文书
详解如何修改nginx的默认端口
2021/03/31 Servers
关于SpringBoot 使用 Redis 分布式锁解决并发问题
2021/11/17 Redis