详解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的map与get方法详解
Nov 04 Javascript
动态的创建一个元素createElement及删除一个元素
Jan 24 Javascript
Node.js异步I/O学习笔记
Nov 04 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
Apr 14 Javascript
JQuery实现鼠标滚轮滑动到页面节点
Jul 28 Javascript
JS中静态页面实现微信分享功能
Feb 06 Javascript
jquery仿京东侧边栏导航效果
Mar 02 Javascript
jsonp跨域请求实现示例
Mar 13 Javascript
jquery 禁止鼠标右键并监听右键事件
Apr 27 jQuery
使用Fullpage插件快速开发整屏翻页的页面
Sep 13 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
Apr 28 Javascript
JavaScript定时器设置、使用与倒计时案例详解
Jul 08 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
PHP n个不重复的随机数生成代码
2009/06/23 PHP
ThinkPHP自动验证失败的解决方法
2011/06/09 PHP
php中使用Imagick实现图像直方图的实现代码
2011/08/30 PHP
php文件上传简单实现方法
2015/01/24 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
2017/10/19 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
很多人都是用下面的js刷新站IP和PV
2008/09/05 Javascript
JavaScript window.setTimeout() 的详细用法
2009/11/04 Javascript
理解Javascript_05_原型继承原理
2010/10/13 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP详解
2015/03/05 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
jQuery实现可展开合拢的手风琴面板菜单
2015/09/15 Javascript
jquery中ajax处理跨域的三大方式
2016/01/05 Javascript
jQuery Masonry瀑布流插件使用方法详解
2017/01/18 Javascript
JavaScript变量类型以及变量作用域详解
2017/08/14 Javascript
Angular2 http jsonp的实例详解
2017/08/31 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
react redux入门示例
2018/04/19 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
python 正则式 概述及常用字符
2009/05/07 Python
Python调用C语言开发的共享库方法实例
2015/03/18 Python
python中正则的使用指南
2016/12/04 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
Python爬虫之UserAgent的使用实例
2019/02/21 Python
python 反编译exe文件为py文件的实例代码
2019/06/27 Python
python中count函数简单用法
2020/01/05 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
2020/12/07 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
精彩的广告词
2014/03/19 职场文书
主要领导对照检查材料
2014/08/26 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang