【Vue原理】Event - 白話版

寫文章不容易,點個讚唄兄弟
專注 Vue 源碼分享,文章分爲白話版和 源碼版,白話版助於理解工作原理,源碼版助於瞭解內部詳情,讓我們一起學習吧
研究基於 Vue版本 【2.5.17】

如果你覺得排版難看,請點擊 下面鏈接 或者 拉到 下面關注公衆號也可以吧

【Vue原理】Event - 白話版

Vue 事件是我最感興趣的東西之一,一直想研究玩玩

特別是組件自定義事件,很想知道,給子組件綁定自定義事件,子組件是怎麼觸發的 巴拉巴拉的

開始正文了

在 Vue 中,事件大概分爲 4 種

1、自定義事件

2、DOM 事件

3、組件DOM 事件

4、組件自定義事件

然後再細分,就只有兩種

1、自定義事件

2、DOM 事件

下面就來粗略說一下事件


自定義事件

自定義事件 是使用觀察者模式建立起來的一種事件機制

分爲 個人使用 和 組件使用

自定義事件主要由下面兩部分構成

1、有事件存儲器

2、綁定事件,觸發事件,解綁事件三個函數

在 Vue 中,每個實例都會添加一個屬性_events,用來存放本實例上註冊的自定義事件

公衆號

_events 就是 事件存儲器,是一個對象

屬性名是 事件名,屬性值是事件回調

個人調用自定義事件

我也經常在項目中使用到 自定義事件,像下面這樣

公衆號

沒錯,$on 就是註冊事件,$emit 是 觸發事件,$off 就是 解綁事件

在哪個實例上註冊的事件,事件就屬於哪個實例,正常情況下,你是不可能能觸發別的實例上的事件的

而給組件綁定自定義事件 是怎麼樣的呢?

公衆號

結果也是一樣的,前面的解析處理可以不管,最後同樣是使用內置的 $on 方法去註冊事件

而這個事件依然是屬於子組件的,存放在 子組件的 _events 中

公衆號

所以你可以在子組件中,使用 this.$emit 觸發這個事件

DOM 事件

DOM 事件,最後就是直接給 DOM 綁定事件

使用 addEventListeners 綁定事件,沒有做任何兼容處理,灰常簡單

綁定事件,是在DOM 創建之後,插入頁面之前

1、普通標籤綁定事件

公衆號

很簡單,普通 addEventListener 綁定DOM事件就完事了

事件會被保存在這個節點解析成的 vnode 中,就是 vm._vnode

公衆號

2、組件綁定DOM 事件

如果要給組件綁定原生DOM 事件,需要加上 native 這個修飾器

公衆號

組件綁定的DOM 事件,在父實例解析完畢開始掛載時,遇到子元素是組件,然後去解析組件內部並生成DOM之後才 addEventListener 綁定

綁定的原生事件,會被存放在組件的外殼節點上 vm.$vnode

公衆號

還有,你可能會想,如果這樣綁定DOM事件會怎麼樣?

公衆號

問得好,這樣並不會綁定DOM事件,而是給組件綁定自定義事件,最後是會存在 子組件的 _events 中的,並不會綁定DOM事件

公衆號

然後可以在子組件中用 this.$emit("click") 去觸發這個父組件綁定的這個click

公衆號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章