Vue源碼之 $emit


$emit(methodName, params)和v-on是緊密聯系的,調用$emit的是子組件的vm實例,結果是調用了父組件對應的方法,那么這個是怎么做到的呢?

在父組件的創新周期中生成父組件的虛擬節點的過程的時候,會遞歸生成子組件的虛擬節點。而生成子組件的虛擬節點的時候會把父組件中

寫在子組件節點上的 v-on 數據(key是上面$emit中的methodName,value是父組件vm中的對應的方法引用method)傳遞給子組件,

放在VNode的parentListener屬性中,在子組件的創建的時候,initEvents方法中,調用updateComponentListeners方法,放到

子組件Vue實例vm._events數組中,而$emit方法也就是去vm._events數組中找到method然后調用。

而之所以method的調用者一直都是父組件vm的實例,是因為在父組件生成虛擬節點之前,已經調用了initMethod方法,

里面調用了method.bind(父vm實例)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM