详解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 相关文章推荐
Javascript事件热键兼容ie|firefox
Dec 30 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
Sep 19 Javascript
js使用递归解析xml
Dec 12 Javascript
原生js实现类似弹窗抖动效果
Apr 02 Javascript
javascript中类的定义方式详解(四种方式)
Dec 22 Javascript
javascript的列表切换【实现代码】
May 03 Javascript
JavaScript对象封装的简单实现方法(3种方法)
Jan 03 Javascript
微信小程序实现左滑修改、删除功能
Oct 19 Javascript
详解vue引入子组件方法
Feb 12 Javascript
Vue路由之JWT身份认证的实现方法
Aug 26 Javascript
关于layui的动态图标不显示的解决方法
Sep 04 Javascript
js判断两个数组相等的5种方法
May 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
PHP4实际应用经验篇(9)
2006/10/09 PHP
PHP的加密方式及原理
2012/06/14 PHP
简单的php缓存类分享     php缓存机制
2014/01/22 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
详解PHP的Yii框架中扩展的安装与使用
2016/04/01 PHP
关于Blog顶部的滚动导航条代码
2006/09/25 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
轻松学习jQuery插件EasyUI EasyUI创建CRUD应用
2015/11/30 Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
2016/01/05 Javascript
js 打开新页面在屏幕中间的实现方法
2016/11/02 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
ES6基础之展开语法(Spread syntax)
2019/02/21 Javascript
微信小程序webSocket的使用方法
2020/02/20 Javascript
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
Python学生成绩管理系统简洁版
2020/04/05 Python
python之从文件读取数据到list的实例讲解
2018/04/19 Python
python面向对象法实现图书管理系统
2019/04/19 Python
python numpy数组复制使用实例解析
2020/01/10 Python
13个Pandas实用技巧,助你提高开发效率
2020/08/19 Python
Python实现EM算法实例代码
2020/10/04 Python
函数指针的定义是什么
2016/08/14 面试题
英语教师求职信
2014/06/16 职场文书
真诚的求职信
2014/07/04 职场文书
2014大学生学生会工作总结
2014/12/19 职场文书
琅琊山导游词
2015/02/05 职场文书
幼师小班个人总结
2015/02/12 职场文书
费城故事观后感
2015/06/10 职场文书
2016情人节宣传语
2015/07/14 职场文书
2016党员党课心得体会
2016/01/07 职场文书
2019年最新版见习人员管理制度!
2019/07/08 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
python 模拟在天空中放风筝的示例代码
2021/04/21 Python
MySQL中存储时间的最佳实践指南
2021/07/01 MySQL
Redis高并发缓存架构性能优化
2022/05/15 Redis
教你win10系统中APPCRASH事件问题解决方法
2022/07/15 数码科技