Vue中的事件修饰符:

  • prevent:阻止默认事件
  • stop:阻止事件冒泡
  • once:事件只触发一次
  • capture:使用事件捕获模式
  • self:只有event.target是当前元素时触发
  • passive:事件的默认行为立即执行,不需要等待回调函数执行完成
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>modifier</title>
        <script type="text/javascript" src="../js/vue.js"></script>
        <style type="text/css">
            * {
                margin: 10px;
            }
        </style>
    </head>
    <body>
        <div class="root">
            <span>prevent修饰符:</span>
            <div style="background-color: skyblue">
                <h1>姓名:{{name}}</h1>
                <a href="https:www.baidu.com" @click="showMsg">不使用prevent修饰符,页面跳转至百度</a><br>
                <!--使用 prevent 修饰符,相当于原生js中的event.preventDefault();-->
                <a href="https:www.baidu.com" @click.prevent="showMsg">使用prevent修饰符,页面不跳转</a>
            </div>

            <span>stop修饰符:</span>
            <div @click="showMsg2" style="background-color: skyblue">
                最外层
                <div @click.stop="showMsg2" style="background-color: yellow">
                    中间层
                    <!--使用 stop 修饰符,相当于相当于原生js中的event.stopPropagation();-->
                    <button @click.stop="showMsg2">内层按钮</button>
                </div>
            </div>

            <span>once 修饰符:</span>
            <div style="background-color: yellowgreen">
                <button @click.once="showMsg3">点击弹窗</button>
            </div>

            <span>capture 修饰符:</span>
            <span>不加 capture</span>
            <div @click="showMsg4('外层div')" style="background-color: skyblue">
                最外层
                <div @click="showMsg4('内层div')" style="background-color: yellow">
                    中间层
                    <button @click="showMsg4('按钮')">内层按钮</button>
                </div>
            </div>
            <span>中间层div添加capture</span>
            <div @click="showMsg4('最外层div')" style="background-color: skyblue">
                最外层
                <div @click.capture="showMsg4('中间层div')" style="background-color: yellow">
                    中间层
                    <button @click="showMsg4('按钮')">内层按钮</button>
                </div>
            </div>

            <span>self 修饰符:</span>
            <span>中间层div添加self,点击按钮时,不触发中间层div的点击事件</span>
            <div @click="showMsg5($event,'最外层div')" style="background-color: skyblue">
                最外层
                <div @click.self="showMsg5($event,'中间层div')" style="background-color: yellow">
                    中间层
                    <button @click="showMsg5($event,'按钮')">内层按钮</button>
                </div>
            </div>
        </div>

        <script type="text/javascript">
            Vue.config.productionTip = false;//关闭生产提示
            let person = {
                name: "张三",
                age: 18,
            };

            const vm = new Vue({
                el: ".root",
                data: person,
                methods: {
                    showMsg(event) {
                        // event.preventDefault();
                        alert("你好," + this.name);
                    },
                    showMsg2(event) {
                        // event.stopPropagation();
                        alert("默认会弹多次,使用stop只弹一次");
                    },
                    showMsg3() {
                        alert("默认点击就弹窗,使用once只在第一次点击弹窗");
                    },
                    showMsg4(sign) {
                        alert(sign + "绑定的事件触发");
                    },
                    showMsg5(event,sign) {
                        alert(event.target);
                        alert(sign + "绑定的事件触发");
                    }
                }
            });

        </script>
    </body>
</html>