v-on 指令可以监听 DOM 事件,并在触发时运行一些 JavaScript 代码
简单的逻辑运算
事件类型由参数指定
<div id="app">
<button v-on:click="counter += 1">点击加 1</button>
<!--简写为 -->
<button @click="counter += 1">点击加 1</button>
<p>按钮被点击了 {{ counter }} 次</p>
</div>
const vm = new Vue({
el: 'app',
data: {
counter: 0
}
})
调用方法
但是很多事件处理逻辑是非常复杂的,所以直接把 JavaScript 代码写在 v-on 指令中是不可行的。所以 v-on 还可以接收一个需要调用的方法名称。
- 事件触发调用的方法内的this指向Vue的实例
- 事件对象指向触发事件的元素
<div id="app">
<!-- `addCounter` 是在下面定义的方法名 -->
<button v-on:click="addCounter">点击加 1</button>
<p>按钮被点击了 {{ counter }} 次</p>
</div>
const vm = new Vue({
el: '#app',
data: {
counter: 0
},
// 在 methods 对象中定义方法
methods: {
addCounter: function (e) {
// this 在方法里指向当前 Vue 实例
this.counter += 1;
// e 是原生 DOM 事件
cosnole.log(e.target);
}
}
})
传参
除了直接绑定到一个方法,也可以在内联JavaScript 语句中调用方法:
在内联语句中使用事件对象时,可以利用特殊变量 $event:
<div id="app">
<button v-on:click="addCounter(5, $event)">点击加 5</button>
<p>按钮被点击了 {{ counter }} 次</p>
</div>
new Vue({
el: '#app',
methods: {
addCounter: function (num, e) {
this.counter += 5;
cosnole.log(e.target);
}
}
})
methods中的函数,也会直接代理给Vue实例对象,所以可以直接运行:
vm.addCounter();
可以绑定动态事件,Vue版本需要2.6.0+
<div v-on:[event]="handleClick">点击,弹出1</div>
```javascript const vm = new Vue({ el: ‘#app’, data: { event: ‘click’ }, methods: { handleClick () {
alert(1);
} } })
- 可以不带参数绑定一个对象,Vue版本需要2.4.0+。
- { 事件名:事件执行函数 }
- 使用此种方法不支持函数传参&修饰符
```html
<div v-on="{ mousedown: doThis, mouseup: doThat }"></div>