事件绑定
可以用 v-on 指令监听DOM 事件,并在触发时运行一些 JavaScript 代码。v-on 还可以接收一个需要调用的方法名称。
<button v-on:click="greet">Greet</button>
methods: {
greet: function (event) {
if (event) { alert(event.target.tagName) } // `event` 是原生 DOM 事件
}
}
除了直接绑定到一个方法,也可以在内联 JavaScript 语句中调用方法,通过$event传递原生事件对象:
<button v-on:click="say('hi',$event)">Say hi</button>
methods: { say: function (message,event) { alert(message) } }
由于事件绑定在vue中使用概率较大,所以这里提供了简写形式
<button @click="say('hi',$event)">Say hi</button>
事件修饰符
在事件处理程序中调用 event.preventDefault() 或 event.stopPropagation() 是非常常见的需求。Vue提供了更好的方式:事件处理函数只有纯粹的数据逻辑,而不是去处理 DOM 事件细节,通过事件修饰符来完成这些细节。
<form v-on:submit.prevent="onSubmit"></form>
常见修饰符如下
.stop 停止事件冒泡
.prevent 阻止事件默认行为
.capture 在事件捕获阶段执行事件处理函数
.self 只当在 event.target 是当前元素自身时触发处理函数
.once 事件处理函数执行一次后解绑
.passive 滚动事件的默认行为 (即滚动行为) 将会立即触发 ,一般与scroll连用,能够提升移动端的性能
按键修饰符
一般与keyup事件类型配合使用
.enter、.tab、.delete、.esc、.space、.up、.down、.left、.right
.ctrl、.alt、.shift、.meta
鼠标修饰符
.left、.right、.middle
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../js/vue.js"></script>
</head>
<body>
<div id="app">
<button @click="delHandler('1',$event)">删除</button>
<button @click="">修改</button>
</div>
<script>
let vm = new Vue({
el: "#app",
data: {
},
methods: {
delHandler(id, e) {
console.log(e.target);
}
},
created() {
}
})
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../js/vue.js"></script>
<style>
.outer {
width: 400px;
height: 400px;
background-color: paleturquoise;
overflow: scroll;
}
.inner {
width: 200px;
height: 600px;
margin: 100px;
background-color: palevioletred;
}
</style>
</head>
<body>
<div id="app">
<a href="https://www.baidu.com" @click.prevent="aClickHandler">百度一下</a>
<div class="outer" @scroll.passive="scrollHandler" @click.self="outerClickHandler">
outer
<div class="inner" @click.once="innerClickHandler">
inner
</div>
</div>
<input v-model="inputVal" type="text" @keyup.enter="keyUpHandler">
</div>
<script>
let vm = new Vue({
el: "#app",
data: {
inputVal: ''
},
methods: {
outerClickHandler(e) {
console.log('outer', e.target, e.currentTarget);
},
innerClickHandler(e) {
console.log('inner', e.target, e.currentTarget);
},
aClickHandler() {
console.log('点击a标签')
alert('123')
},
scrollHandler() {
let total = 0;
for (let i = 1; i < 1000; i++) {
total += i
}
console.log(total);
},
keyUpHandler() {
console.log(this.inputVal);
}
},
created() {
}
})
</script>
</body>
</html>