(本文提及**詳見reactelement.js,這裡就不為了好看而貼圖了)
首先需要申明在react經常會提到的一些型別:reactcompositecomponent是自定義元件(復合元件),reactdomcomponent指的是瀏覽器自帶標籤,reactdomtextcomponent是針對文字節點的。三者面向的型別不同,但它們的掛載方法都叫做mountcomponent(react做了很多的抽象封裝,使各個函式功能能夠處理各種結點等而不需要處處修改)。此外,我們通常所說的virtual dom 是reactelement,並通過reactdom的render方法渲染到真實dom上。
那麼為了實現渲染,究竟需要那些核心功能呢?
首先一定需要乙個component類,用來表示元件在渲染、更新、刪除時應該做些什麼事情;然後需要乙個component工廠方法,用來返回乙個component例項(這樣就可以使返回例項可以遮蔽底層對具體型別的判斷和處理);另外需要mountcomponent方法,用來在component渲染時生成dom結構;最後還需要render方法作為渲染的入口方法,內部通過事務來觸發掛載,將內容寫入對應的container中去。
那麼具體來說,初次渲染是怎麼乙個流程呢?又是怎麼利用這些核心功能的呢?
我們知道react的虛擬dom的概念,事實上,react.createelement就會建立乙個這樣的虛擬dom。在react.createelement方法中,會首先檢測config引數,而它包含著我們在使用react元件時可能會傳入的ref、key(優化效率)、onclick等,此時reactelement會將其儲存為內部屬性留與後用,然後,將其中的屬性傳入props儲存,並且子元素children也會被儲存到props。之後會呼叫reactelement來返回虛擬dom,而reactelement貌似是個建構函式,實際上就是個工廠函式了,並且通過 $$typeof: react_element_type 來將其標記為reactelement。當然,如果打debugger除錯的話,也會並不意外的發現這些方法會recursive的呼叫,下面將要提到的instantiatereactcomponent 也是一樣,沒辦法,dom樹就這樣嘛。(本段提及**詳見reactelement.js)
最後,既然上面已經出現了componentwillmount,可知,在我們終於要完成初次渲染的旅程時,一定會有componentdidmount,至於具體在哪,就不具體指出了。總之,現在想想過去面試常被問的生命週期,真不是什麼上檔次的問題…
後續會對更完整的更新機制進一步做**。
React原始碼解析
距離第一篇 react原始碼解析 一 已經過去將近4個月的時間,由於是我第一次進行原始碼解析相關的寫作,思路和文筆還不夠成熟。一百多天以來,我基於讀者反饋反思這幾篇文章中的不足,同時也在不斷學習借鑑其他優秀作者的寫作方法和寫作思路。最終總結出對於自己的原始碼寫作來說,需要改進的幾點 1.示例 太多 ...
react 原始碼defaultProps實現
首先我們回顧一下 defaultprops 的用法import react from react render name hello react 這樣我們就可以得到乙個渲染出hello react的介面啦。此時的關鍵,在於需要理解 reactdom.render 實際執行了什麼方法。經過斷點除錯,我...
react原始碼探索
react核心部分為 1 虛擬dom物件 reactdom.render args,element 這個方法第乙個引數接收三種形式的內容的 第一種 字串 第二種 由createclass建立的物件,使用createelement處理 第三種 直接有createelement建立的物件 這些還未呼叫r...