提示
本文主要讲解 Vue 中的事件处理。@ermo
# 事件处理
# 监听事件
事件处理语法为 v-on:click。
<!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="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
</head>
<body>
    <div id="app">
        <p>点击次数:{{ counter }}</p>
        <button v-on:click="counter += 1">点击</button>
    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                counter: 0
            }
        });
    </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="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
</head>
<body>
    <div id="app">
        <button v-on:click="click">点击</button>
    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
                name: 'ermo'
            },
            methods: {
                click: function(event) {
                    alert('Hi ' + this.name);
                    // event 是原生 DOM 事件
                    if (event) {
                        alert(event.target.tagName);
                    }
                }
            }
        });
        // 方法可以直接调用
        vm.click();
    </script>
</body>
</html>
# 内联处理器中的方法
事件方法同样可以在内联 JavaScript 中使用。
<!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="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
</head>
<body>
    <div id="app">
        <button v-on:click="say('hi')">sayHi</button>
        <button v-on:click="say('what?')">sayWhat</button>
    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            data: {
            },
            methods: {
                say: function(msg) {
                    alert(msg);
                }
            }
        });
    </script>
</body>
</html>
内联事件方法中可以传入原生的 DOM 事件,使用关键字 $event。
<!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="https://cdn.jsdelivr.net/npm/vue@2.7.14"></script>
</head>
<body>
    <div id="app">
        <button v-on:click="warn('表单无法提交', $event)">点击</button>
    </div>
    <script>
        var vm = new Vue({
            el: '#app',
            methods: {
                warn: function(msg, event) {
                    if (event) {
                        console.log('event.preventDefault()');
                        event.preventDefault();
                    }
                    alert(msg);
                }
            }
        });
    </script>
</body>
</html>
# 事件修饰符
Vue.js 为 v-on 提供了事件修饰符去处理 DOM 事件细节。修饰符的语法是以点号 . 开始的后缀。比如 v-on:click.prevent 就等同于 event.preventDefault()。
常用的事件修饰符有:
| 修饰符 | 作用 | 
|---|---|
.stop |  阻止冒泡 | 
.prevent |  阻止默认事件 | 
.capture |  阻止捕获 | 
.self |  监听当前触发元素 | 
.once |  只触发一次 | 
.left |  左键事件 | 
.right |  右键 | 
.middle |  中间滚动事件 | 
<!-- 阻止单机事件冒泡 -->
<a v-on:click.stop="doThis"></a>
<!-- 提交事件不再重新加载 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修饰符可以串联 -->
<form v-on:click.stop.prevent="doThat"></form>
<!-- 只有修饰符 -->
<form v-on:submit.prevent></form>
<!-- 添加事件监听器时使用事件捕获模式 -->
<!-- 即内部元素触发的事件先在此处理,然后才交由内部元素进行处理 -->
<div v-on:click.capture="doThis">...</div>
<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat"></div>
<!-- 点击事件只会触发一次 -->
<div v-on:click.once="doThis"></div>
# 按键修饰符
Vue 允许为 v-on 在监听键盘事件时添加按键修饰符:
<!-- 只有在 key 是 enter 的时候调用 vm.submit -->
<input v-on:keyup.enter="submit" >
<!-- 只有在 keyCode 是13的时候调用 vm.submit  -->
<input v-on:keyup.13="submit" >
其他的按键码别名:
| 别名 | 作用 | 
|---|---|
.enter |  enter | 
.tab |  tab | 
.delete |  捕获删除键和退格键 | 
.esc |  esc | 
.space |  空格 | 
.up |  up | 
.down |  down | 
.left |  left | 
.right |  right | 
.ctrl |  ctrl | 
.alt |  alt | 
.shift |  shift | 
.meta |  meta | 
← class与style绑定 表单输入绑定 →