详解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的jqDnR拖拽溢出的修改
Feb 12 Javascript
jquery()函数的三种语法介绍
Oct 09 Javascript
jQuery 获取、设置HTML或TEXT内容的两种方法
May 23 Javascript
超简单的Vue.js环境搭建教程
Mar 17 Javascript
js实现一个简单的数字时钟效果
Mar 29 Javascript
javascript简单链式调用案例分析
May 10 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
Feb 24 jQuery
详解Vue.js项目API、Router配置拆分实践
Mar 16 Javascript
node.js监听文件变化的实现方法
Apr 17 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
Jun 04 Javascript
JavaScript this指向相关原理及实例解析
Jul 10 Javascript
vue组件的路由高亮问题解决方法
May 11 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
Windows下PHP5和Apache的安装与配置
2006/09/05 PHP
php计算2个日期的差值函数分享
2015/02/02 PHP
PHP获取一年有几周以及每周开始日期和结束日期
2015/08/06 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
2019/03/22 PHP
jQuery实现倒计时按钮功能代码分享
2014/09/03 Javascript
JavaScript生成福利彩票双色球号码
2015/05/15 Javascript
AngularJs基本特性解析(一)
2016/07/21 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
2017/02/12 Javascript
vue.js的安装方法
2017/05/12 Javascript
JavaScript实现提交模式窗口后刷新父窗口数据的方法
2017/06/16 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
JavaScript根据json生成html表格的示例代码
2018/10/24 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
2019/11/04 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
JS async 函数的含义和用法实例总结
2020/04/08 Javascript
Taro UI框架开发小程序实现左滑喜欢右滑不喜欢效果的示例代码
2020/05/18 Javascript
python 生成目录树及显示文件大小的代码
2009/07/23 Python
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
Python实现将目录中TXT合并成一个大TXT文件的方法
2015/07/15 Python
Python使用迭代器捕获Generator返回值的方法
2017/04/05 Python
python 读写excel文件操作示例【附源码下载】
2019/06/19 Python
解决Django后台ManyToManyField显示成Object的问题
2019/08/09 Python
Django 批量插入数据的实现方法
2020/01/12 Python
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
物业管理大学生个人的自我评价
2013/10/10 职场文书
岗位聘任书范文
2014/03/29 职场文书
美食节策划方案
2014/05/26 职场文书
我的未来不是梦演讲稿
2014/09/02 职场文书
依法行政工作汇报材料
2014/10/28 职场文书
2014年教务处工作总结
2014/12/03 职场文书
公务员考察材料范文
2014/12/23 职场文书
数学教师求职信范文
2015/03/20 职场文书
高中英语教学反思范文
2016/03/02 职场文书
七个Python必备的GUI库
2021/04/27 Python
Python if else条件语句形式详解
2022/03/24 Python