Vue 事件处理操作实例详解


Posted in Javascript onMarch 05, 2019

本文实例讲述了Vue 事件处理操作。分享给大家供大家参考,具体如下:

1 监听事件

可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码。

html:

<div id="app1">
  <button v-on:click="counter +=1">递增</button>
  <p>按钮已被点击 {{ counter }} 次。</p>
</div>

js:

var app1 = new Vue({
  el: "#app1",
  data: {
    counter: 0
  }
});

效果:

Vue 事件处理操作实例详解

2 事件处理方法

然而许多事件处理逻辑会更为复杂,所以直接把 JavaScript 代码写在 v-on 指令中是不可行的。因此v-on还可以接收一个需要调用的方法名称。

html:

<div id="app2">
  <button v-on:click="greet">问候</button>
</div>

js:

var app2 = new Vue({
  el: "#app2",
  data: {
    name: 'Deniro'
  },
  methods: {
    greet: function (event) {
      //这里的 this 指向的是当前 Vue 实例
      console.log('你好 ' + this.name + '!');
      if (event) {
        console.log(event.target.tagName);
      }
    }
  }
});

效果:

Vue 事件处理操作实例详解

也可以直接调用 Vue 实例定义的函数:

Vue 事件处理操作实例详解

3 内联处理器中的方法

除了直接绑定到一个方法,也可以在内联 JavaScript 语句中调用方法:

html:

<div id="app3">
  <button v-on:click="greet('你好')">问候</button>
</div>

js:

var app3 = new Vue({
  el: "#app3",
  methods: {
    greet: function (message) {
      console.log(message);
    }
  }
});

有时也需要在内联语句处理器中访问原始的 DOM 事件。可以用特殊变量 $event 把它传入方法:

html:

<button v-on:click="warn('表单已被禁用',$event)">提交</button>

js:

methods: {
  ...
  warn: function (message,event) {
    //访问原生对象
    if(event){
      event.preventDefault();
    }
    console.log(message);
  }
}

4 事件修饰符

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

为了解决这个问题,Vue.js 为 v-on 提供了事件修饰符。之前提过,修饰符是由点开头的指令后缀来表示的。

  • .stop
  • .prevent
  • .capture
  • .self
  • .once
  • .passive
<!--阻止单击事件继续传播-->
<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>
<!--在 event.target 为当前元素自身时触发处理函数-->
<!--即事件不是从内部元素触发的-->
<div v-on:click.self="doThat">...</div>

使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。
2.1.4 新增

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

不像其它只能对原生的 DOM 事件起作用的修饰符,.once 修饰符还能被用到自定义的组件事件上。

2.3.0 新增

Vue 还对应 addEventListener 中的 passive 选项提供了 .passive 修饰符。

<!--滚动事件的默认行为将会被立即触发(不会等待 onScroll 事件完成)-->
<!--包含 event.preventDefault() 的情况-->
<div v-on:scroll.passive="onScroll">...</div>

这个 .passive 修饰符尤其能够提升移动端的性能。

不要把 .passive 和 .prevent 一起使用,因为 .prevent 将会被忽略,同时浏览器可能会向你展示一个警告。请记住,.passive 会告诉浏览器你不想阻止事件的默认行为。

5 按键修饰符

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

<!--keyCode 为 13 时调用 vm.submit()-->
<input v-on:keyup.13="submit">

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

<!--使用按键别名-->
<input v-on:keyup.enter="submit">
<!--使用缩写语法-->
<input @keyup.enter="submit">

全部的按键别名:

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

可以通过全局 config.keyCodes 对象自定义按键修饰符别名:

//自定义按键的修饰符别名
Vue.config.keyCodes.f1 = 112;

自动匹配按键修饰符

2.5.0 新增

你也可直接将 KeyboardEvent.key 暴露的任意有效按键名转换为 kebab-case 来作为修饰符:

<input @keyup.page-down="onPageDown">

在上面的例子中,处理函数仅在 $event.key === 'PageDown' 时被调用。

有一些按键 (.esc 以及所有的方向键) 在 IE9 中有不同的 key 值, 如果你想支持 IE9,它们的内置别名应该是首选。

6 系统修饰键

2.1.0 新增

可以用如下修饰符来实现仅在按下相应按键时才触发鼠标或键盘事件的监听器。

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

注意:在 Mac 系统键盘上,meta 对应 command 键 (⌘)。在 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 事件一起用时,事件触发时修饰键必须处于按下状态。换句话说,只有在按住 ctrl 的情况下释放其它按键,才能触发keyup.ctrl。而单单释放 ctrl 也不会触发事件。如果你想要这样的行为,请为 ctrl 换用 keyCode:keyup.17

6.1 .exact 修饰符

2.5.0 新增

.exact 修饰符允许你控制由精确的系统修饰符组合触发的事件。

<!--Ctrl 或 Alt 或 Shift 被一同按下时会触发-->
<button @click.ctrl="onClick">A</button>
<!--有且只有 Ctrl 被按下时才会触发-->
<button @click.ctrl.exact="onCtrlClick">A</button>
<!--没有任何系统修饰符被按下时才会触发-->
<button @click.exact="onClick">A</button>

6.2 鼠标按钮修饰符

2.2.0 新增

  • .left
  • .right
  • .middle

这些修饰符会限制处理函数仅响应特定的鼠标按钮。

7 为什么在 HTML 中监听事件?

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

扫一眼 HTML 模板便能轻松定位在 JavaScript 代码里对应的方法。

因为你无须在 JavaScript 里手动绑定事件,你的 ViewModel 代码可以是非常纯粹的逻辑,和 DOM 完全解耦,更易于测试。

当一个 ViewModel 被销毁时,所有的事件处理器都会自动被删除。你无须担心如何自己清理它们。

希望本文所述对大家vue.js程序设计有所帮助。

Javascript 相关文章推荐
Jquery AJAX 框架的使用方法
Nov 03 Javascript
判断目标是否是window,document,和拥有tagName的Element的代码
May 31 Javascript
Javascript 自适应高度的Tab选项卡
Apr 05 Javascript
extjs 04_grid 单击事件新发现
Nov 27 Javascript
JavaScript中使用Object.create()创建对象介绍
Dec 30 Javascript
JS数组的常见用法实例
Feb 10 Javascript
纯javascript移动优先的幻灯片效果
Nov 02 Javascript
简单的分页代码js实现
May 17 Javascript
JavaScript实现格式化字符串函数String.format
Dec 16 Javascript
微信小程序 页面跳转及数据传递详解
Mar 14 Javascript
AngularJS路由删除#符号解决的办法
Sep 28 Javascript
js事件on动态绑定数据,绑定多个事件的方法
Sep 15 Javascript
Vue插槽原理与用法详解
Mar 05 #Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
Mar 05 #Javascript
JavaScript函数定义方法实例详解
Mar 05 #Javascript
C#程序员入门学习微信小程序的笔记
Mar 05 #Javascript
JavaScript函数的4种调用方法实例分析
Mar 05 #Javascript
微信小程序保存多张图片的实现方法
Mar 05 #Javascript
JS添加或删除HTML dom元素的方法实例分析
Mar 05 #Javascript
You might like
SONY SRF-40W电路分析
2021/03/02 无线电
PHP脚本的10个技巧(8)
2006/10/09 PHP
php 验证码实例代码
2010/06/01 PHP
PHP中header和session_start前不能有输出原因分析
2013/01/11 PHP
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
2016/06/21 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
设定php简写功能的方法
2019/11/28 PHP
js判断客户端是iOS还是Android等移动终端的方法
2013/12/11 Javascript
jQuery DOM操作实例
2014/03/05 Javascript
用js读、写、删除Cookie代码分享及详细注释说明
2014/06/05 Javascript
js类定义函数时用prototype与不用的区别示例介绍
2014/06/10 Javascript
JS与jQuery遍历Table所有单元格内容的方法
2015/12/07 Javascript
详解Bootstrap按钮
2016/01/04 Javascript
jQuery提示插件qTip2用法分析(支持ajax及多种样式)
2016/06/08 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
2017/03/02 Javascript
基于 Vue 实现一个酷炫的 menu插件
2017/11/14 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
深入理解Puppeteer的入门教程和实践
2019/03/05 Javascript
JS实现关闭小广告特效
2021/01/29 Javascript
[07:49]2014DOTA2国际邀请赛 Newbee夺冠后采访xiao8坦言奖金会上交
2014/07/23 DOTA
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
利用pyecharts实现地图可视化的例子
2019/08/12 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
阿迪达斯西班牙官方网站:adidas西班牙
2016/07/21 全球购物
寒假思想汇报
2014/01/10 职场文书
买房子个人收入证明
2014/01/16 职场文书
《鞋匠的儿子》教学反思
2014/03/02 职场文书
企业贷款委托书格式
2014/09/12 职场文书
六一儿童节致辞
2015/07/31 职场文书
使用Docker容器部署rocketmq单机的全过程
2022/04/03 Servers