Vue.js v-on

🌙
手机阅读
本文目录结构

v-on

  • 缩写@

  • 预期Function | Inline Statement | Object

  • 参数event

修饰符

事件修饰符 示例说明
.stop 调用 event.stopPropagation(), 阻止单击事件冒泡。
.prevent 调用 event.preventDefault(), 阻止默认事件。
.capture 添加事件侦听器时使用 capture 模式(事件捕获模式)。
.self 只当事件是从侦听器绑定的元素本身触发时才触发回调。
`.{keyCode keyAlias}`
.native 监听组件根元素的原生事件。
.once 只触发一次回调。
.left 只当点击鼠标左键时触发。(2.2.0)
.right 只当点击鼠标右键时触发。(2.2.0)
.middle 只当点击鼠标中键时触发。(2.2.0)
.passive { passive: true } 模式添加侦听器。(2.3.0)

用法

绑定事件监听器。事件类型由参数指定。表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略。

用在普通元素上时,只能监听原生 DOM 事件。用在自定义元素组件上时,也可以监听子组件触发的自定义事件

在监听原生 DOM 事件时,方法以事件为唯一的参数。如果使用内联语句,语句可以访问一个 $event 属性:v-on:click="handle('ok', $event)"

2.4.0 开始,v-on 同样支持不带参数绑定一个事件 / 监听器键值对的对象。注意当使用对象语法时,是不支持任何修饰器的。

示例

<!-- 方法处理器 -->
<button v-on:click="doThis"></button>

<!-- 动态事件 (2.6.0+) -->
<button v-on:[event]="doThis"></button>

<!-- 内联语句 -->
<button v-on:click="doThat('hello', $event)"></button>

<!-- 缩写 -->
<button @click="doThis"></button>

<!-- 动态事件缩写 (2.6.0+) -->
<button @[event]="doThis"></button>

<!-- 停止冒泡 -->
<button @click.stop="doThis"></button>

<!-- 阻止默认行为 -->
<button @click.prevent="doThis"></button>

<!-- 阻止默认行为,没有表达式 -->
<form @submit.prevent></form>

<!--  串联修饰符 -->
<button @click.stop.prevent="doThis"></button>

<!-- 键修饰符,键别名 -->
<input @keyup.enter="onEnter">

<!-- 键修饰符,键代码 -->
<input @keyup.13="onEnter">

<!-- 点击回调只会触发一次 -->
<button v-on:click.once="doThis"></button>

<!-- 对象语法 (2.4.0+) -->
<button v-on="{ mousedown: doThis, mouseup: doThat }"></button>

在子组件上监听自定义事件 (当子组件触发“my-event”时将调用事件处理器):

<my-component @my-event="handleThis"></my-component>

<!-- 内联语句 -->
<my-component @my-event="handleThis(123, $event)"></my-component>

<!-- 组件中的原生事件 -->
<my-component @click.native="onClick"></my-component>

按键别名

  • .enter
  • .tab
  • .delete
  • .esc
  • .space
  • .up
  • .down
  • .left
  • .right

还有一些按键修饰符可以组合使用,或者和鼠标一起使用:

  • .ctrl
  • .alt
  • .shift
  • .meta:Mac 下为 Command 键,Windows 下为窗口键。

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

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

参考 Vue.js keyCodes

用法

基础用法

<div id="app">
    <h3>已点击 {{count}} 次</h3>
    <button @click="count++">点我</button>
    <button @click="quickAdd(3)">快速增长</button>
</div>

注意: @clickv-on:click 的简写形式, @ 即表示 v-on:

@click 表达式即可以直接使用 js 语句,也可以是一个定义在 vue 实例中 methods 内的函数名。

注意: @click 调用的方法名如果不需要参数,那么可以不写括号。

<script>
    var app = new Vue({
        el: '#app',
        data: {
            count:0
        },
        methods: {
          quickAdd: function (i) {
            i = i || 1;//为避免参数为 null 或 undefined 值,这里设定了默认值 1
            this.count += i;
          }
        }
    });
</script>

使用 Vue.js 的一个好处是:当销毁 ViewModel 时,会自动销毁所有绑定在其上的事件处理器。

$event 传参

Vue.js 还提供了一个 $event 变量,使用它可以访问原生 DOM 事件。$event 变量可以通过方法传入。

<div id="app2">
    <a href="www.163.com" @click="openUrl('被禁用咯',$event)">被禁用咯</a>
</div>
var app2 = new Vue({
	el: '#app2',
	data: {
		count: 0
	},
	methods: {
		openUrl: function (param, event) {
			event.preventDefault();
			console.log("param:" + param);
		}
	}
});

输出结果:

param: 被禁用咯

这个示例利用传入的 event 参数,禁用了原有的链接跳转逻辑。

为什么在 HTML 中监听事件

你可能注意到这种事件监听的方式违背了关注点分离(separation of concern)传统理念。

传统的 WEB 是尽量使用外链式使用 JS,不要把 JS 代码写到 HTML 上;

不必担心,因为所有的 Vue.js 事件处理方法和表达式都严格绑定在当前视图的 ViewModel 上,它不会导致任何维护上的困难。实际上,使用 v-on 有几个好处:

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

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

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

参考

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了