浅谈Vue.js中的v-on(事件处理)


Posted in Javascript onSeptember 05, 2017

Vue.js的事件处理

监听事件

我们可以用 v-on 指令监听 DOM 事件来触发一些 JavaScript 代码。

<div class="box">
  {{msg}}
  <input type="button" value="按钮" v-on:click="msg+=1"/>
</div>
var vm = new Vue({
  el:".box",
  data:{
    msg:1
  },
})

结果

浅谈Vue.js中的v-on(事件处理)

方法事件处理器

许多事件处理的逻辑都很复杂,所以直接把 JavaScript 代码写在 v-on 指令中是不可行的。因此 v-on 可以接收一个定义的方法来调用。

<div class="box">
  {{msg}}
  <input type="button" value="按钮" v-on:click="jia"/>
</div>
var vm = new Vue({
  el:".box",
  data:{
    msg:1
  },
  // 在 `methods` 对象中定义方法
  methods:{
    jia:function(event){
      console.log(event)
    }
  }
})

结果

MouseEvent {isTrusted: true, screenX: 18, screenY: 107, clientX: 18, clientY: 17, …}

内联处理器方法

<div class="box">
  {{msg}}
  <input type="button" value="按钮" v-on:click="jia('my day')"/>
</div>
var vm = new Vue({
  el:".box",
  data:{
    msg:1
  },
  methods:{
    jia:function(x){
      console.log(x)
    }
  }
})

结果

my day

事件修饰符

在事件处理程序中调用 event.preventDefault() 或 event.stopPropagation() 是非常常见的需求。尽管我们可以在 methods 中轻松实现这点,但更好的方式是:methods 只有纯粹的数据逻辑,而不是去处理 DOM 事件细节。

为了解决这个问题, Vue.js 为 v-on 提供了 事件修饰符。通过由点(.)表示的指令后缀来调用修饰符。

  • .stop
  • .prevent
  • .capture
  • .self
  • .once
<!-- 阻止单击事件冒泡 -->
<a v-on:click.stop="doThis"></a>
<!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修饰符可以串联 -->
<a v-on:click.stop.prevent="doThat"></a>
<!-- 只有修饰符 -->
<form v-on:submit.prevent></form>
<!-- 添加事件侦听器时使用事件捕获模式 -->
<div v-on:click.capture="doThis">...</div>
<!-- 只当事件在该元素本身(比如不是子元素)触发时触发回调 -->
<div v-on:click.self="doThat">...</div>

使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 @click.prevent.self 会阻止所有的点击,而 @click.self.prevent 只会阻止元素上的点击。

<!-- 点击事件将只会触发一次 -->
<a v-on:click.once="doThis"></a>

不像其它只能对原生的 DOM 事件起作用的修饰符,.once 修饰符还能被用到自定义的组件事件上. 如果你还没有阅读关于组件的文档,现在大可不必担心。

键值修饰符

在监听键盘事件时,我们经常需要监测常见的键值。 Vue 允许为 v-on 在监听键盘事件时添加关键修饰符:

<div id="ar5">
  <input type="button" value="a" v-on:keydown="a">
</div>
var vm = new Vue({
  el:"#ar5",
  data:{
    msg:1
  },
  methods:{
    a:function(e){
      console.log(e.keyCode)
    }
  }
})

我们可以得到不同键的键值

结果

浅谈Vue.js中的v-on(事件处理)

记住所有的 keyCode 比较困难,所以 Vue 为最常用的按键提供了别名:

  • .enter
  • .tab
  • .delete (捕获 “删除” 和 “退格” 键)
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right

当然,如果你需要其他的键,vue.js也为你提供了可以通过全局 config.keyCodes 对象自定义键值修饰符别名:

// 可以使用 v-on:keyup.f1
Vue.config.keyCodes.f1 = 112

修饰键

可以用如下修饰符开启鼠标或键盘事件监听,使在按键按下时发生响应。

  • .ctrl
  • .alt
  • .shift
  • .meta

注意:在Mac系统键盘上,meta对应命令键 (⌘)。在Windows系统键盘meta对应windows徽标键(⊞)。在Sun操作系统键盘上,meta对应实心宝石键 (◆)。在其他特定键盘上,尤其在MIT和Lisp键盘及其后续,比如Knight键盘,space-cadet键盘,meta被标记为“META”。在Symbolics键盘上,meta被标记为“META” 或者 “Meta”。

例如:

<!-- Alt + C -->
<input @keyup.alt.67="clear">
<!-- Ctrl + Click -->
<div @click.ctrl="doSomething">Do something</div>

修饰键比正常的按键不同;修饰键和 keyup 事件一起用时,事件引发时必须按下正常的按键。换一种说法:如果要引发 keyup.ctrl,必须按下 ctrl 时释放其他的按键;单单释放 ctrl 不会引发事件。

鼠标按键修饰符

这些修饰符会限制处理程序监听特定的滑鼠按键

  • .left
  • .right
  • .middle

为什么在HTML中监听事件

你可能注意到这种事件监听的方式违背了关注点分离(separation of concern)传统理念。不必担心,因为所有的 Vue.js 事件处理方法和表达式都严格绑定在当前视图的 ViewModel 上,它不会导致任何维护上的困难。实际上,使用 v-on 有几个好处:

  • 扫一眼 HTML 模板便能轻松定位在 JavaScript 代码里对应的方法。
  • 因为你无须在 JavaScript 里手动绑定事件,你的 ViewModel 代码可以是非常纯粹的逻辑,和 DOM 完全解耦,更易于测试。
  • 当一个 ViewModel 被销毁时,所有的事件处理器都会自动被删除。你无须担心如何自己清理它们。

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

Javascript 相关文章推荐
jQuery 1.0.4 - New Wave Javascript(js源文件)
Jan 15 Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
Jun 28 Javascript
网页收藏夹显示ICO图标(代码少)
Aug 04 Javascript
js使用cookie记录用户名的方法
Nov 26 Javascript
JS输出空格的简单实现方法
Sep 08 Javascript
网页瀑布流布局jQuery实现代码
Oct 21 Javascript
jquery对象与DOM对象转化
Feb 08 Javascript
validationEngine 表单验证插件使用实例代码
Jun 15 Javascript
探究react-native 源码的图片缓存问题
Aug 24 Javascript
JavaScript 异步调用
Oct 25 Javascript
浅谈AngularJS中$http服务的简单用法
May 15 Javascript
jQuery实现手风琴效果(蒙版)
Jan 11 jQuery
Angular实现下载安装包的功能代码分享
Sep 05 #Javascript
简单谈谈关于Angular Cli打包的事
Sep 05 #Javascript
Vue学习笔记之表单输入控件绑定
Sep 05 #Javascript
zTree异步加载展开第一级节点的实现方法
Sep 05 #Javascript
纯js实现画一棵树的示例
Sep 05 #Javascript
javascript基础进阶_深入剖析执行环境及作用域链
Sep 05 #Javascript
基于ES6 Array.of的用法(实例讲解)
Sep 05 #Javascript
You might like
解析如何用php screw加密php源代码
2013/06/20 PHP
PHP页面中文乱码分析
2013/10/29 PHP
php防止恶意刷新与刷票的方法
2014/11/21 PHP
PHP函数func_num_args用法实例分析
2015/12/07 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
2018/09/16 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
JavaScript对象之间的转换 jQuery对象和原声DOM
2011/03/07 Javascript
Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
2013/04/26 Javascript
简单的Jquery全选功能
2013/11/07 Javascript
基于jquery animate操作css样式属性小结
2015/11/27 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
vue中的 $slot 获取插槽的节点实例
2019/11/12 Javascript
JS实现点餐自动选择框(案例分析)
2019/12/10 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
vue实现商品列表的添加删除实例讲解
2020/05/14 Javascript
vue实现购物车案例
2020/05/30 Javascript
js实现滑动滑块验证登录
2020/07/24 Javascript
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
Python实现检测服务器是否可以ping通的2种方法
2015/01/01 Python
python+opencv实现动态物体识别
2018/01/09 Python
Django ModelForm组件使用方法详解
2019/07/23 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
HTML5新特性 多线程(Worker SharedWorker)
2017/04/24 HTML / CSS
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
大学新生军训自我鉴定范文
2014/09/13 职场文书
房屋出租协议书范本(标准版)
2014/09/24 职场文书
大学生自荐信范文
2015/03/05 职场文书
2015年双拥工作总结
2015/04/08 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
mybatis调用sqlserver存储过程返回结果集的方法
2021/05/08 SQL Server
Python基本数据类型之字符串str
2021/07/21 Python
maven依赖的version声明控制方式
2022/01/18 Java/Android
Go语言入门exec的基本使用
2022/05/20 Golang