2019独角兽企业重金招聘Python工程师标准>>>

事件处理

监听事件

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

直接把处理复杂逻辑的JavaScript代码写在v-on指令中是不可行的,因此v-on可以接收一个需要调用的方法名称。

内联处理器中的方法

<div id="example-3"><button v-on:click="say('hi')">Say hi</button>
</div>

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

<button v-on:click="warn('Form cannot be submitted yet.', $event)">Submit
</button>

事件修饰符

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

Vue为 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版本新增:不像其它只能对原生的DOM事件起作用的修饰符,.once修饰符还能被用到自定义的组件事件上。

2.3.0版本新增:Vue还对应addEventListener中的passive选项提供了.passive修饰符。

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

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

【注意】

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

按键修饰符

Vue允许为v-on在监听键盘事件时添加按键修饰符:

<!-- 只有在 `keyCode` 是 13 时调用 `vm.submit()` -->
<input v-on:keyup.13="submit">
<!-- 同上 -->
<input v-on:keyup.enter="submit"><!-- 缩写语法 -->
<input @keyup.enter="submit">

全部的按键别名:

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

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

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

# 自动匹配按键修饰符

2.5.0版本新增:可以直接将KeyboardEvent.key暴露的任意有效按键名转换为kebab-case来作为修饰符:

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

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

【注意】

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

系统修饰键

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 换用 keyCodekeyup.17

# .exact修饰符

2.5.0版本新增:.exact 修饰符允许你控制由精确的系统修饰符组合触发的事件。

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

# 鼠标按钮修饰符

2.2.0版本新增

.left、.right、.middle

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

为什么在HTML中监听事件?

虽然这种事件监听的方式违背了 关注点分离 这个优良传统。但所有的Vue.js事件处理方法和表达式都严格绑定在当前视图的ViewModel上。而且,使用 v-on 有几个好处:

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

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

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

转载于:https://my.oschina.net/happyran/blog/1982473

Vue.js学习笔记四相关推荐

  1. Vue.js 学习笔记 四 用一,二,三的知识做个跑马灯

    做个简单的跑马灯效果 页面定义2个按钮,绑定2个方法. <div id="divApp"><input type="button" value ...

  2. Vue.js 学习笔记 五 常用的事件修饰符

    介绍几个常用的事件修饰符 直接上代码 <div id="divApp"><div class="divColor" v-on:click=&q ...

  3. Vue.js 学习笔记三,一些基础指令,v-bind,v-on

    在笔记二的基础上继续写 v-bind指令,为属性绑定数据 <!--v-bind指令可以绑定属性--><div v-html="msg2" v-bind:title ...

  4. Vue.js 学习笔记 八 v-for

    v-for指令,是用来循环的,常用的情况有以下4种 <div id="divApp"><!--迭代数字--><p v-for="n in 5 ...

  5. 遇见 vue.js --------阿文的vue.js学习笔记(8 —1)------- 列表渲染

    ** 新学习新征程,我们一起踏上学习 vue.js的新长征 遇见 vue.js --------阿文的vue.js学习笔记(1)-----初识vue.js 遇见 vue.js --------阿文的v ...

  6. Vue.js 学习笔记 十二 Vue发起Ajax请求

    首先需要导入vue-resource.js,可以自己下载引入,也可以通过Nuget下载,它依赖于Vue.js. 全局使用方式: Vue.http.get(url,[options]).then(suc ...

  7. Vue.js 学习笔记 十一 自定义指令

    之前看到过v-bind,v-on等指令,Vue还可以自定义指<div id="divApp"        <div v-focus></div> & ...

  8. Vue.js 学习笔记 十 自定义按键事件

    <div id="divApp"><!--任何键盘动作都会触发--><input type="text" v-on:keyup=& ...

  9. Vue.js 学习笔记 九 v-if和v-show

    <p v-if="flag">v-if</p><p v-show="flag">v-show</p> flag是 ...

最新文章

  1. [转]关于MyEclipse下的项目无法使用BASE64Encoder问题的解决办法
  2. linq replace with single call to FirstOrDefault 解决使用resharper产生的警告
  3. ABP官方文档翻译 0.0 ABP官方文档翻译目录
  4. Django 之多对多关系
  5. Java Socket编程----通信是这样炼成的
  6. tensorboard运行
  7. 图解算法学习笔记(五):散列表
  8. MongoDB Cursor Methods
  9. Codeforces Round #413(Div. 1 + Div. 2, combined)——ABCD
  10. 常见英文缩写 (持续更新……)
  11. SQL注射技术总结文档
  12. [技术讨论][DDS] AD9833原理介绍及chiliDDS驱动分享(上)
  13. 2018-06-27 关于小米电力猫小猫一直黄灯闪烁不匹配的问题
  14. 【智能驾驶】最全、最强的无人驾驶技术学习路线
  15. 五行塔怎么吃第五个_卸甲枭雄最新章节_章节目录 第1541章 真正的五行塔_小说下载/手机阅读_领域文学...
  16. 使用连接管理器出现“安装程序无法复制文件”错误的解决方法
  17. 局域网服务器怎么更改账号,怎么修改访问局域网共享用户名和密码
  18. 【重磅整理】提前看287篇ICLR-2021 深度强化学习领域论文得分汇总列表
  19. vue中使用rem适配方案
  20. Nancy朋友的时间线

热门文章

  1. Gradle project xxx refresh failed Error:Unable to tunnel through proxy. Proxy returns HTTP/...
  2. Android 通过腾讯WebService API获取 地址经纬度
  3. JS域:加载(它的页面的)域 -(所在页面的域)--------- 资源域
  4. MAC Android Studio SDK 无法更新问题
  5. kotlin集合操作符——过滤操作符
  6. 小程序动画Animation,高度增加动画形式,图标旋转动画形式
  7. Java面试题集(二)list与Map相关知识(1.2)
  8. js事件之event.preventDefault()与event.stopPropagation()用法区别
  9. ImageUploadAssist--DATA
  10. HighCharts点击柱形或饼块等加URL或Click事件