Vue框架Element的事件傳遞broadcast和dispatch方法分析

發表於2017-02-11

前言

最近在學習餓了麼的Vue前端框架Element,發現其原始碼中大量使用了$broadcast$dispatch方法,而Element使用的是Vue2.0版本,眾所周知在Vue 1.0升級到2.0中去除了$broadcast$dispatch方法。
所以在Element框架原始碼中將這兩個函式重寫實現了一遍,並採用的是minix的方式植入每個元件的程式碼中。
但是Element的這兩個函式雖然與官方同名,但功能卻有所差異,遂有本文,簡單分析一下區別於用途。

Element的broadcast功能分析

功能簡述

  1. 在Element中broadcast(事件廣播)方法需要3個引數,componentName元件名稱, eventName事件名,和params資料。
  2. broadcast是尋找所有子孫元件中,元件名為componentName的元件,若找到在其元件上觸發($emit)eventName的事件方法,資料為params
  3. 假設若有3個子元件或孫子元件的元件名為指定的componentName的話,這三個元件上都會觸發其指定的事件方法。

原始碼對比

vue 1.0的官方$broadcast的實現原始碼:

Element的broadcast的實現原始碼:

官方的$broadcast用途的解釋為:

廣播事件,通知給當前例項的全部後代。因為後代有多個枝杈,事件將沿著各“路徑”通知。每條路徑上的通知在觸發一個監聽器後停止,除非它返回 true。

Element的broadcast與Vue1.0官方的區別對比:

  1. 官方的$broadcast的引數只有兩個,event事件名和args事件資料。Element為三個,多一個元件名。
  2. 官方的$broadcast觸發方式是預設只觸發子代元件,不觸發孫子代元件,如果子代建立了監聽且返回了true,才會向孫子代元件傳遞事件。而Element是直接向所有子孫後代元件傳遞,也沒有返回值判定。
  3. 最重要的區別在於用途。Element的broadcast雖然與官方的同名,但是通過分析原始碼可以看出Element的用途應該是 遠端呼叫 或應取名叫childEmit,用途是呼叫/觸發指定子孫元件的事件。而非廣義上的“廣播”的概念。

最後,在Element的原始碼中如果找到了指定名稱的元件,並在其身上觸發了事件後,不會繼續在其身上查詢他的子元件,從用途上來講應該是找到所有符合名稱的子孫元件並觸發,所以為何會這樣原因不明。也許在Element的元件系統設計裡面,沒有自身套自身的情況?或是並不想在繼續觸發下級?需要再仔細分析才可了。

Element的dispatch功能分析

功能簡述

通過前面分析的$broadcast可以大致推匯出Element中的dispatch的主要功能。
依然是以尋找所有父級,直到找到要找的父元件,並在其身上觸發指定事件。
整體功能更類似jQuery的closest方法。

原始碼對比

vue 1.0的官方$dispatch的實現原始碼:

Element的dispatch的實現:

最後

通過學習Element原始碼中的broadcastdispatch的實現功能,從能力角度而言,Element是將官方的 事件廣播/事件派發 的功能弱化了,屬於是“閹割版”的。但是從實際開發過程中的易用性角度而言,Element的做法更貼合我們日常開發過程中的需求,如父元件呼叫元件的方法(如全選核取方塊等),子元件向父元件通知變更(如表單校驗等)。

Element是很優秀的Vue框架,值得深入學習來了解更深的Vue使用以及元件化思路。

相關文章