Vue.js-03:第三章 - 事件修飾符的使用

来源:https://www.cnblogs.com/danvic712/archive/2018/10/31/9846097.html
-Advertisement-
Play Games

一、前言 熟悉了 Vue 的指令系統後,在實際開發中,不可避免的會使用到對於事件的操作,如何處理 DOM 事件流,成為我們必須要掌握的技能。不同於傳統的前端開發,在 Vue 中給我們提供了事件修飾符這一利器,使我們可以便捷的處理 DOM 事件,本章,一起來學習如何使用事件修飾符來實現對於 DOM 事 ...


 一、前言

  熟悉了 Vue 的指令系統後,在實際開發中,不可避免的會使用到對於事件的操作,如何處理 DOM 事件流,成為我們必須要掌握的技能。不同於傳統的前端開發,在 Vue 中給我們提供了事件修飾符這一利器,使我們可以便捷的處理 DOM 事件,本章,一起來學習如何使用事件修飾符來實現對於 DOM 事件流的操作。

  學習系列目錄地址:https://www.cnblogs.com/danvic712/p/9549100.html

  倉儲地址:https://github.com/Lanesra712/VueTrial/tree/master/Chapter01-Rookie/directives

 二、乾貨合集

  1、 DOM 事件流

  有時,當我們需要完成頁面中的某些功能時,我們要在需要實現功能的頁面元素上使用 v-on 指令去監聽 DOM 事件,在 html4 時代瀏覽器如何確定頁面的哪一部分會擁有特定的事件時,IE 和 Netscape 的開發團隊提出了兩個截然相反的概念。這一差異,也使我們在寫代碼中需要考慮如何去處理 DOM 的事件細節。為瞭解決這一問題,vue 給我們提供了事件修飾符這一利器,它使我們的方法只有純粹的數據邏輯,而不是去處理 DOM 事件細節。

  一些涉及到概念:

  a)事件:用戶設定或者是瀏覽器自身執行的某種動作。例如click(點擊)、load(載入)、mouseover(滑鼠懸停)、change(改變)等等

  b)事件處理程式:為了實現某個事件的功能而構建的函數方法,也可稱為事件監聽器

  c)DOM 事件流:描述的是從頁面中接收事件的順序,也可理解為事件在頁面中傳播的順序

  在 DOM 事件流中存在著三個階段:事件捕獲階段、處於目標階段、事件冒泡階段。

  a)事件捕獲(event capture):當滑鼠點擊或者觸發 DOM 事件時,瀏覽器會從根節點開始由外到內進行事件傳播,即點擊了子元素,如果父元素通過事件捕獲方式註冊了對應的事件的話,會先觸發父元素綁定的事件

  b)事件冒泡(event bubbing):當滑鼠點擊或者觸發 DOM 事件時,瀏覽器會從根節點開始由內到外進行事件傳播,即點擊了子元素,則先觸發子元素綁定的事件,逐步擴散到父元素綁定的事件

  之前我們提到的 IE 和 Netscape 的開發團隊提出了兩個截然相反的事件流概念,IE 採取的是事件冒泡流,而標準的瀏覽器的事件流則是事件捕獲流。所以,為了相容 IE 我們需要改變某些的寫法。

  2、 事件修飾符

  a).stop:阻止事件冒泡
  在下麵的示例中,我們分別創建了一個 button 的點擊事件和外側的 div 的點擊事件,根據事件的冒泡機制我們可以得知,當我們點擊了按鈕之後,會擴散到父元素,從而觸發父元素的點擊事件,具體的結果也如下圖所示:

 1 <div id="app" class="divDefault">
 2     <div id="div1" @click="divHandlerClick">
 3         <input type="button" value="點擊" @click="btnHandlerClick" />
 4     </div>
 5 </div>
 6 
 7 <script>
 8     var vm = new Vue({
 9         el: '#app',
10         data: {},
11         methods: {
12             divHandlerClick() {
13                 alert('我是div的點擊事件!')
14             },
15             btnHandlerClick() {
16                 alert('我是button的點擊事件')
17             }
18         }
19     });
20 </script>

 

  這時候,如果我們不希望出現事件冒泡,則可以使用 Vue 內置的修飾符便捷的阻止事件冒泡的產生。因為我們是點擊 button 後產生的事件冒泡,我們只需要在 button 的點擊事件上加上 stop 修飾符即可,示例代碼如下。

<input type="button" value="點擊" @click.stop="btnHandlerClick" />

  b).prevent:阻止預設事件

  阻止預設事件這個也很好理解,有些標簽本身會存在事件,例如,a 標簽的跳轉,form 表單中 submit 按鈕的提交事件等等,在某些時候我們只想執行我們自己設置的事件,這時,就需要阻止標簽的預設事件的執行,原生的 js 我們可以使用 preventDefault 方法來實現,而在 Vue 中,我們只需要使用 prevent 關鍵字就可以了。

  在下麵的示例中,我們為 a 標簽添加了一個點擊事件,由於 a 標簽本身具有預設的跳轉事件,此時,當我們點擊後,最終還是會執行 a 標簽的預設事件。

 1 <a href="http://www.baidu.com" @click="aHandlerClick">鏈接跳轉</a>
 2 
 3 <script>
 4     var vm = new Vue({
 5         el: '#app',
 6         data: {},
 7         methods: {
 8             aHandlerClick() {
 9                 alert('我是a標簽的點擊事件')
10             }
11         }
12     });
13 </script>

  在 Vue 中,當我們想要阻止元素的預設事件,只需要在綁定的事件後使用 prevent 修飾符即可,示例代碼如下。

<a href="http://www.baidu.com" @click.prevent="aHandlerClick">鏈接跳轉</a>

  c).capture:添加事件監聽器時使用事件捕獲模式
  在上面的學習中我們瞭解到,事件捕獲模式與事件冒泡模式是一對相反的事件處理流程,當我們想要將頁面元素的事件流改為事件捕獲模式時,只需要在父級元素的事件上使用 capture 修飾符即可,還是上面的例子的代碼,當我們在 div 綁定的點擊事件上使用 capture 修飾符後,我們點擊按鈕首先觸發的就是最外側的 div 的事件。

1 <div id="app" class="divDefault">
2     <div id="div1" @click.capure="divHandlerClick">
3         <input type="button" value="點擊" @click="btnHandlerClick" />
4     </div>
5 </div>

  

  d).self:只當在 event.target 是當前元素自身時觸發處理函數(比如不是子元素冒泡引起的事件觸發)
  在上面的例子中,我們為 div 綁定了一個點擊事件,而我們的本意可能是只有當我們點擊 div 後觸發這個事件,而實際情況是事件冒泡還是事件捕獲都會觸發這個事件,這與我們的本意是不符的。在 Vue 中,我們就可以使用 self 修飾符去修飾事件,讓這個事件只在我們想要觸發時觸發。

<div id="app" class="divDefault">
    <div id="div1" @click.self="divHandlerClick">
        <input type="button" value="點擊" @click="btnHandlerClick" />
    </div>
</div>

  e).once:事件只觸發一次
  當我們僅僅想對綁定的事件只在第一次的時候觸發,這時我們就可以使用 once 修飾符去修飾綁定的事件。例如在下麵的代碼中,只有第一次點擊時才會觸發綁定的事件,之後點擊都不會觸發。

<input type="button" value="點擊" @click.once="btnHandlerClick" />

  f).passive:滾動事件的預設行為 (即滾動行為) 將會立即觸發
  在頁面滾動的時候,瀏覽器會在整個事件處理完畢之後再觸發滾動,因為瀏覽器並不知道這個事件是否在其處理函數中被調用了 event.preventDefault(),而 passive 修飾符用來進一步告訴瀏覽器這個事件的預設行為不會被取消,即 使用 passive 修飾符後表示綁定的事件永遠不會調用 event.preventDefault()。

 三、總結

  1、事件修飾符的使用順序很重要

  使用修飾符時,順序很重要;相應的代碼會以同樣的順序產生。因此,用 v-on:click.prevent.self 會阻止所有的點擊,而 v-on:click.self.prevent 只會阻止對元素自身的點擊。

  2、.passive 和 .prevent不能一起使用

  不要把 .passive 和 .prevent 一起使用,因為 .prevent 將會被忽略,同時瀏覽器可能會向你展示一個警告。請記住,.passive 會告訴瀏覽器你不想阻止事件的預設行為。

 四、參考

  1、JavaScript事件流

  2、JavaScript:深入理解事件流

  3、理解DOM事件流的三個階段

  4、JavaScript 詳說事件機制之冒泡、捕獲、傳播、委托

  5、vue從入門到進階:指令與事件(二)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這篇文章主要給大家講解一下GCD的平時不太常用的API,以及文末會貼出GCD定時器的一個小例子。 需要學習的朋友可以通過網盤免費下載pdf版 (先點擊普通下載 再選擇普通用戶就能免費下載了)http://putpan.com/fs/cy1i1beebn7s0h4u9/ 1.GCD的API 1.1 D ...
  • 目錄 一、應用開發技術及平臺介紹 ①開發技術: 本系統是採用面向對象的軟體開發方法,基於Android studio開發平臺,以Android作為本系統的開發語言實現音樂播放器預定的需求功能。 ②平臺介紹 硬體平臺 CPU奔騰雙核 (主頻2.0GHz) 記憶體1G以上 64或32位PC機 500G硬碟 ...
  • 又到了公司一年當中最忙的時刻了,為了趕項目,現在居然開啟了996模式,這是我從業多年來第一次遇見的。 一轉眼,一個月又過了,回頭一看,這個月一篇文章都沒有發,上個月忙著一個人做項目,項目忙完了還不忘發篇文章吐槽一下。從明天開始就要去java項目組了,可能做前端,也可能做後端,也可能前後端都要做。Ja ...
  • 系統全面地講解微信小程式的開發技術。開篇創建一個小程式項目並解析體驗,介紹如何由零開始創建一個小程式,全面體驗小程式的開發工具、界面、開發框架、實現過程及其主要代碼框架,瞭解小程式的應用場景及開發要求。接著介紹小程式開發基礎,包括小程式開發的語言與語法、函數方法、模塊、事件交互等。然後詳細介紹了組件 ...
  • export default class HttpUtils { static get(url){ return new Promise((resolve,reject)=>{ fetch(url) .then(response=>response.json()) .then(resu... ...
  • 1.函數都有返回值 而方法的本質也是函數,所以也有返回值。 Document。getElementByLd()返回的是獲取的標簽 getElementsByClassName()和getElemantsByTagName()返回的是一個數組 Document。getElementsByClassNa ...
  • 1. 寫一個函數,實現對數字數組的排序。 function get_order(array){ for(var i = 0; i <array.length-1; i++){ for(var j = 0; j < array.length - 1 -i; j++){ if(array[j] < ar ...
  • 聲明 本系列文章內容全部梳理自以下四個來源: 《HTML5權威指南》 《JavaScript權威指南》 "MDN web docs" "Github:smyhvae/web" 作為一個前端小白,入門跟著這四個來源學習,感謝作者的分享,在其基礎上,通過自己的理解,梳理出的知識點,或許有遺漏,或許有些理 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...