9_Vue事件修飾符

概述

首先需要理解下什麼是事件修飾符

常用事件修飾符

案例1_阻止默認行為發生

  • 我這裡有一個a標籤
  • 這個標籤呢我會給它配置一個點擊事件
  • 點擊事件輸出一句話,那麼效果是這樣的

程式碼

<body>
    <!-- 定義一個容器 -->
    <div class="app">
        <!-- 默認事件發生(常用) -->
        <a href="//www.baidu.com" @click="toBaidu"></a>
    </div>
</body>
<script>
    var vm = new Vue({
      el: '.app',
      data: {
        name: 'wavesbright'
      },
      methods: {
        // 默認事件行為
        toBaidu(){
            alert("即將前往百度.......");
        }
      },
    });
</script>

測試

toBaidu

分析/需求

  • 分析
    • 在案例當中我們看到,頁面是先出現了 提示框
    • 然後跳轉到了 百度 的頁面
    • 跳轉到百度頁面,這是a標籤的默認行為,也就是 默認觸發的事件
  • 需求
    • 我只想讓他出現提示框,但是不跳轉
    • 需求很簡單,我換個標籤不就行了,誒,我偏不,我就要讓a標籤來完成這個事情
    • 那怎麼辦?
    • 解決也很簡單,讓a標籤不跳轉就行了,怎麼個不跳轉法?
      • 使用 herf =「javascript:iod(0)」這種 偽協議
      • 使用#代替
      • 在onclick當中返回false
    • 我們要做的,就是 阻止這個默認行為的發生
    • 那麼就需要使用到事件修飾符

解決方法

在原生JS中,利用事件源對象的 prevenDefault();來阻止

image-20221023161849111

我們來測試下

10-23-1

在vue當中我們可以使用如下的語法來代表 阻斷默認事件發生

事件修飾符 == .prevent

image-20221023162351016

測試效果

10-23-1

我使用了 .prevent來修飾這個事件,那麼造成的結果就是,這個事件的默認行為被我阻斷

案例2_阻止冒泡

準備工作

簡單設計一個 div 加一個 button按鈕,為這倆設置與案例1相同的點擊事件

image-20221023163808946

<!-- 2、事件冒泡 -->
<div class="box" @click="toBaidu">
    <button @click="toBaidu">事件冒泡</button>
</div>

簡單樣式設計

image-20221023163821733

<style>
  .app{
    height: 100vh;
    width: 100%;
  }
  /* 給這個盒子設置一個寬高 */
  .box{
    margin-top: 20px;
    height: 100px;
    border: 1px solid black;
    display: flex;
    align-items: center;
  }
</style>

冒泡測試

10-23-2

  • 可以看到,我們在點擊這個按鈕的時候,div的事件也被調用
  • 這就是一個典型的事件冒泡,那麼我們應該如何解決?

需求分析

點擊button按鈕的時候不要觸發div的點擊事件

解決方式

通過事件源對象的.stopPropagation()可以阻止

image-20221023164721908

測試結果

10-23-3

注意:如果子元素和父元素使用的是不同的事件,那麼在子元素的事件當中添加即可

事件修飾符 == .stop

image-20221023165109807

測試結果

10-23-3

案例3_只觸發一次的事件

準備工作

image-20221023165418965

這有個按鈕,簡單設計下樣式,事件還是剛剛的點擊事件

測試結果

10-23-4

需求

我只想讓他觸發一次,點了以後可以繼續點,但是事件不會繼續觸發了

事件修飾符 == .once

image-20221023165614244

測試結果

10-23-5

不常用的事件修飾符

案例4_使用事件的捕獲模式

補充知識

在使用捕獲模式之前我們需要先簡單的了解下

關於js事件流事件處理的 捕獲階段和 事件 冒泡階段

參考博文

準備工作

我這裡有個嵌套的div盒子,二者都設計了一個點擊事件,並且都傳遞了參數

<!-- 4、使用事件捕獲階段 -->
<div class="box1" @click="toMsg(1)">
    box1
    <div class="box2" @click="toMsg(2)">box2</div>
</div>

事件設計

image-20221023172608610

簡單設計下樣式

.box1{
    height: 100px;
    background-color: #ff6700;
    padding: 5px;
  }
  .box2{
    height: 50px;
    background-color: #fff;
  }

測試階段

10-23-6

需求

  • 根據 js事件流,我們可以必然的退出,當前這個情況就和案例2一樣
  • 先 觸發 box2的事件,然後冒泡到box1的事件
  • 需求很簡單,先讓box1觸發,然後box2再觸發

事件修飾符 == .capture

注意:該修飾符的作用是,讓事件所處的DOM元素,在事件捕獲階段觸發

也就是:誰要在事件捕獲階段觸發,那麼就安在誰身上

image-20221023173135398

測試

10-23-7

案例5_event.target是當前元素才能觸發

準備工作

準備一個div盒子和按鈕,二者共用一個點擊事件

image-20221023173647164

該點擊事件描述 當前觸發 事件 的DOM元素是誰

image-20221023173739598

測試

10-23-8

需求

  • 雖然事件是冒泡上去的,但是觸發了外層盒子事件的DOM元素是button
  • 我們這裡就不說那麼多,說這個修飾符的作用是什麼

事件修飾符 == .self

  • 這個修飾符的作用是 :只有event.target,指向的DOM元素是該元素本身,那麼才會觸發這個事件
  • 怎麼說?
    • image-20221023174148301
    • 對box的click事件進行修飾
    • 只有event.target 的 值 為 這個box的div時
    • box的click事件才會被觸發
  • 說白了也可以阻止事件冒泡

測試

10-23-9

案例6_passive

事件的默認行為立即執行,無需等待 事件的回調執行完畢

  • 這個好理解,用案例一舉例子
  • 先跳到網頁去,再出現提示框,應該是這個意思
  • 我測試了一下,好像不行,不是我理解那樣
  • 先當下鴿子,後面在處理