Vue中render函數(shù)調(diào)用時機與執(zhí)行細節(jié)源碼分析
背景
摸魚的時候看到有網(wǎng)友說面試問到了render函數(shù)和beforeMount鉤子哪個先觸發(fā)的問題,我印象中是先觸發(fā)beforeMount鉤子,不過本著嚴謹?shù)木?,拒絕印象流,還是去翻了一下Vue2源碼。
想知道結論可以直接跳到文章末尾。
解析
從$mount方法開始
$mount方法,也就是Vue掛載的起點。

這里可以看到,$mount方法其實就是調(diào)用mountCompenent并返回執(zhí)行結果
mountCompenent發(fā)生了什么?
這里截取關鍵部分

在這里已經(jīng)有結論了,beforeMount是在render函數(shù)調(diào)用之前觸發(fā)的,不過出于好奇,還是去第七行的_render函數(shù)里面看看細節(jié)
render函數(shù)的調(diào)用細節(jié)
轉到_render中

可以看到_render就是調(diào)用render函數(shù)并返回 vnode。不過在第10行可以發(fā)現(xiàn),調(diào)用render函數(shù)的方式并不是直接調(diào)用,而是通過call方法,第一個參數(shù)是 render函數(shù)的this環(huán)境,第二個參數(shù)就是在render函數(shù)中的參數(shù)h。
第一個參數(shù):vm._renderProxy
從上一部分得知,vm._renderProxy就是render函數(shù)的this環(huán)境,轉到相應源碼看看。

可以看到,vm._renderProxy要么是vm本身,要么是vm的一個Proxy,據(jù)Proxy API的支持情況而定。如果是后者,情況就復雜一些:如果 options.render._withStripped為真,則Proxy的handler為getHandler_1,否則是hasHandler_1??墒沁@個options.render._withStripped并沒有在Vue源碼中出現(xiàn),最后在負責編譯sfc的 compiler-sfc.js中找到了。
// compiler-sfc.js // mark with stripped (this enables Vue to use correct runtime proxy // detection) code += `render._withStripped = true`;
變量code就是sfc編譯后的js代碼,也就是說如果是sfc就是getHandler_1,否則就是hasHandler_1,以上這兩個handler的代碼就不貼了,不然又是一個新坑=.=
總而言之,這個vm._renderProxy就是vm,只不過通過Proxy做了一些特殊處理。
第二個參數(shù):vm.$createElement
讀過snabbdom的應該都認識這個函數(shù),畢竟vue借鑒了snabbdom。源碼太長就不貼了,只要知道它最終調(diào)用_createElement返回vnode就行。
結論
render函數(shù)的調(diào)用時機是在beforeMount之后和mounted之前。- 通過call將
render函數(shù)的this綁定到了vm,并且會根據(jù)Proxy的支持情況和是否是SFC來做一些不同的處理。 render函數(shù)的參數(shù)h的作用是創(chuàng)建vnode
以上就是Vue中render函數(shù)調(diào)用時機與執(zhí)行細節(jié)源碼分析的詳細內(nèi)容,更多關于Vue render函數(shù)調(diào)用執(zhí)行的資料請關注腳本之家其它相關文章!
- vue3通過render函數(shù)實現(xiàn)菜單下拉框的示例
- vue中的render函數(shù)、h()函數(shù)、函數(shù)式組件詳解
- Vue render函數(shù)使用詳細講解
- 簡單談一談Vue中render函數(shù)
- vue中使用render封裝一個select組件
- Vue 2閱讀理解之initRender與callHook組件詳解
- vue語法之render函數(shù)和jsx的基本使用
- vue3中的render函數(shù)里定義插槽和使用插槽
- VUE3中h()函數(shù)和createVNode()函數(shù)的使用解讀
- Vue.js3.2的vnode部分優(yōu)化升級使用示例詳解
- Vue.js之VNode的使用
- vue中?render?函數(shù)功能與原理分析
相關文章
vue vue-Router默認hash模式修改為history需要做的修改詳解
今天小編就為大家分享一篇vue vue-Router默認hash模式修改為history需要做的修改詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09
詳解vue開發(fā)中調(diào)用微信jssdk的問題
這篇文章主要介紹了vue開發(fā)中調(diào)用微信jssdk的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04
vuejs使用axios異步訪問時用get和post的實例講解
今天小編就為大家分享一篇vuejs使用axios異步訪問時用get和post的實例講解,具有很好的參考價值。希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
vue,angular,avalon這三種MVVM框架優(yōu)缺點
本文給大家具體分析了下vue,angular,avalon這三種MVVM框架優(yōu)缺點,十分的細致全面,有需要的小伙伴可以參考下2016-04-04
vue項目優(yōu)雅實現(xiàn)自動引入組件的方法詳解
在我們寫vue項目的時候,都會引入一些組件庫,有時候有可能還不止一個組件庫,那么如何優(yōu)雅的實現(xiàn)自動引入組件呢,下面小編就來和大家詳細講講吧2023-09-09

