美文网首页
VUE.JS的事件修饰符介绍

VUE.JS的事件修饰符介绍

作者: ticktockk2016 | 来源:发表于2019-03-02 16:32 被阅读0次

    事件修饰符:

    • .stop 阻止冒泡

    • .prevent 阻止默认事件

    • .capture 添加事件侦听器时使用事件捕获模式

    • .self 只当事件在该元素本身(比如不是子元素)触发时触发回调

    • .once 事件只触发一次


    .stop 阻止冒泡

        <!-- 使用  .stop  阻止冒泡 -->
        <div class="inner" @click="div1Handler">
          <input type="button" value="戳他" @click.stop="btnHandler">
        </div> 
    

    这样子的话,点击button按钮,只会触发它的点击事件,因为加上了.stop事件修饰符,所以这时候div不会触发事件,也就是成功阻止了冒泡。

    .prevent 阻止默认事件

        <!-- 使用 .prevent 阻止默认行为 -->
        <a href="http://www.baidu.com" @click.prevent="linkClick">有问题,先去百度</a>
    

    因为a标签的默认行为是跳转到对应的URL,如果没有使用 .prevent 阻止默认行为,则点击以上那个a标签,会自动跳转到百度,效果如下:


    image.png

    加上了 .prevent 阻止默认行为,则不会进行跳转,效果如下:


    image.png

    .capture 添加事件侦听器时使用事件捕获模式

        <!-- 使用  .capture 实现捕获触发事件的机制 -->
        <div class="inner" @click.capture="div1Handler">
          <input type="button" value="戳他" @click="btnHandler">
        </div>
    

    如果不使用capture,正确的触发顺序应该是先input后div
    加上capture之后,因为冒泡被上层先捕获了,所以触发顺序变为先div后input
    验证如下:


    image.png

    .self 只当事件在该元素本身(比如不是子元素)触发时触发回调

        <!-- 使用 .self 实现只有点击当前元素时候,才会触发事件处理函数 -->
        <div class="inner" @click.self="div1Handler">
          <input type="button" value="戳他" @click="btnHandler">
        </div>
    

    点击input时候,因为加上了self修饰符,div不接受其冒泡


    image.png

    只有当用户鼠标点击div时候,才会触发div的事件

    .once 事件只触发一次

        <!-- 使用 .once 只触发一次事件处理函数 -->
        <a href="http://www.baidu.com" @click.prevent.once="linkClick">有问题,先去百度</a>
    

    加上了once事件修饰符,prevent只能触发一次,因此当第一次点击链接,不会进行默认的跳转到百度,但是当再次点击,则会进行跳转


    image.png

    注意:这里prevent和once顺序没有联系,即先prevent后once和 先once后prevent 效果都是一样的


    .stop 和 .self 的区别

        <!-- 演示: .stop 和 .self 的区别 -->
        <div class="outer" @click="div2Handler">
          <div class="inner" @click="div1Handler">
            <input type="button" value="戳他" @click.stop="btnHandler">
          </div>
        </div>
        <!-- .self 只会阻止自己身上冒泡行为的触发,并不会真正阻止 冒泡的行为 -->
        <div class="outer" @click="div2Handler">
          <div class="inner" @click.self="div1Handler">
            <input type="button" value="戳他" @click="btnHandler">
          </div>
        </div>
    

    .self 只会阻止自己身上冒泡行为的触发,并不会真正阻止冒泡的行为,如果传到该层时又.self修饰,那么该层继续将冒泡上传的上一层,继续触发


    完整代码如下:

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
      <script src="./lib/vue.js"></script>
      <style>
        .inner {
          height: 150px;
          background-color: darkcyan;
        }
    
        .outer {
          padding: 40px;
          background-color: red;
        }
      </style>
    </head>
    
    <body>
      <div id="app">
    
        <!-- 使用  .stop  阻止冒泡 -->
        <!-- <div class="inner" @click="div1Handler">
          <input type="button" value="戳他" @click.stop="btnHandler">
        </div> -->
    
        <!-- 使用 .prevent 阻止默认行为 -->
        <!-- <a href="http://www.baidu.com" @click.prevent="linkClick">有问题,先去百度</a> -->
    
        <!-- 使用  .capture 实现捕获触发事件的机制 -->
        <!-- <div class="inner" @click.capture="div1Handler">
          <input type="button" value="戳他" @click="btnHandler">
        </div> -->
    
        <!-- 使用 .self 实现只有点击当前元素时候,才会触发事件处理函数 -->
        <!-- <div class="inner" @click.self="div1Handler">
          <input type="button" value="戳他" @click="btnHandler">
        </div> -->
    
        <!-- 使用 .once 只触发一次事件处理函数 -->
        <!-- <a href="http://www.baidu.com" @click.prevent.once="linkClick">有问题,先去百度</a> -->
    
    
        <!-- 演示: .stop 和 .self 的区别 -->
        <!-- <div class="outer" @click="div2Handler">
          <div class="inner" @click="div1Handler">
            <input type="button" value="戳他" @click.stop="btnHandler">
          </div>
        </div> -->
    
        <!-- .self 只会阻止自己身上冒泡行为的触发,并不会真正阻止 冒泡的行为 -->
        <!-- <div class="outer" @click="div2Handler">
          <div class="inner" @click.self="div1Handler">
            <input type="button" value="戳他" @click="btnHandler">
          </div>
        </div> -->
    
      </div>
    
      <script>
        // 创建 Vue 实例,得到 ViewModel
        var vm = new Vue({
          el: '#app',
          data: {},
          methods: {
            div1Handler() {
              console.log('这是触发了 inner div 的点击事件')
            },
            btnHandler() {
              console.log('这是触发了 btn 按钮 的点击事件')
            },
            linkClick() {
              console.log('触发了连接的点击事件')
            },
            div2Handler() {
              console.log('这是触发了 outer div 的点击事件')
            }
          }
        });
      </script>
    </body>
    
    </html>
    

    相关文章

      网友评论

          本文标题:VUE.JS的事件修饰符介绍

          本文链接:https://www.haomeiwen.com/subject/lyzeuqtx.html