摘要:所以為了簡化流程,這些的代碼都先暫時(shí)忽略了。也就是說,每個(gè)平臺都有獨(dú)立的實(shí)現(xiàn)。我們將調(diào)試兩個(gè)過程,和分別對應(yīng)掛載和更新兩個(gè)階段。
概述:
先看看React的架構(gòu)圖:
https://bogdan-lyashenko.gith...
好好看一下上圖,初看看起來好像很復(fù)雜,但是事實(shí)上,它只描述了兩個(gè)過程:掛載和更新。由于卸載在某種程度上就是“反掛載”,上圖中我們移除了卸載的過程,以使得流程圖看起來更簡單些。 當(dāng)然,上圖不是100%匹配源碼,但是已經(jīng)能夠用來描述react架構(gòu)的主要流程了。簡而言之,上圖覆蓋了60%的代碼,但是剩下的40%基本上沒有什么特別大的價(jià)值。所以為了簡化流程,這些40%的代碼都先暫時(shí)忽略了。
我們先在圖中看下模塊之間的依賴關(guān)系。
正如你所知,React是支持多個(gè)環(huán)境的:
1 手機(jī)端(RaectNative)
2 游覽器端(ReactDOM)
3 服務(wù)端渲染
4 ReactART(使用React繪制矢量圖)
5 其他
正是為了支持多平臺,上圖中很多文件的代碼量是比圖里展現(xiàn)的要多的多。 以下是包含多平臺支持的流程圖。
正如你所見,一些內(nèi)容被重復(fù)了兩次。也就是說,每個(gè)平臺都有獨(dú)立的實(shí)現(xiàn)。比如說,ReactEventListener。很顯然,這個(gè)方法的實(shí)現(xiàn)在不同的平臺是不同的。技術(shù)上來說,這些平臺獨(dú)立模塊應(yīng)該會以某種方法注入或者連接到當(dāng)前的邏輯過程中,其實(shí),這些模塊中有很多像這樣的injectors。因?yàn)樗鼈兊恼Z法是標(biāo)準(zhǔn)合成模式的一部分,為了簡化,它們也被暫時(shí)忽略了。
我們先學(xué)習(xí)下React DOM在游覽器中的邏輯流程。 這是用的最多的平臺,同時(shí)這個(gè)函數(shù)基本上也覆蓋了React架構(gòu)的所有思想。
代碼示列:
學(xué)習(xí)一個(gè)框架或者庫的最后的辦法是什么呢?閱讀和調(diào)試代碼。我們將調(diào)試兩個(gè)過程,React.render和component.setState,分別對應(yīng)掛載和更新兩個(gè)階段。我們的實(shí)例代碼包含幾個(gè)帶有render方法的小組件,這樣會更有利于我們調(diào)試。
class ChildCmp extends React.Component { render() { return{this.props.childMessage}} } class ExampleApplication extends React.Component { constructor(props) { super(props); this.state = {message: "no message"}; } componentWillMount() { //... } componentDidMount() { /* setTimeout(()=> { this.setState({ message: "timeout state message" }); }, 1000); */ } shouldComponentUpdate(nextProps, nextState, nextContext) { return true; } componentDidUpdate(prevProps, prevState, prevContext) { //... } componentWillReceiveProps(nextProps) { //... } componentWillUnmount() { //... } onClickHandler() { /* this.setState({ message: "click state message" }); */ } render() { return} } ReactDOM.render(And some text as well! , document.getElementById("container"), function() {} );
(未完待續(xù))
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/95680.html
摘要:在學(xué)習(xí)源碼的過程中,給我?guī)椭畲蟮木褪沁@個(gè)系列文章,于是決定基于這個(gè)系列文章談一下自己的理解。到此為止,首次渲染就完成啦總結(jié)從啟動到元素渲染到頁面,并不像看起來這么簡單,中間經(jīng)歷了復(fù)雜的層級調(diào)用。 前言 React 是一個(gè)十分龐大的庫,由于要同時(shí)考慮 ReactDom 和 ReactNative ,還有服務(wù)器渲染等,導(dǎo)致其代碼抽象化程度很高,嵌套層級非常深,閱讀其源碼是一個(gè)非常艱辛的過...
摘要:本篇開始介紹自定義組件是如何渲染的。組件將自定義組件命名為,結(jié)構(gòu)如下經(jīng)過編譯后,生成如下代碼構(gòu)建頂層包裝組件跟普通元素渲染一樣,第一步先會執(zhí)行創(chuàng)建為的。調(diào)用順序已在代碼中注釋。先看圖,這部分內(nèi)容將在下回分解 前言 React 是一個(gè)十分龐大的庫,由于要同時(shí)考慮 ReactDom 和 ReactNative ,還有服務(wù)器渲染等,導(dǎo)致其代碼抽象化程度很高,嵌套層級非常深,閱讀其源碼是一個(gè)非...
摘要:依賴注入和控制反轉(zhuǎn),這兩個(gè)詞經(jīng)常一起出現(xiàn)。一句話表述他們之間的關(guān)系依賴注入是控制反轉(zhuǎn)的一種實(shí)現(xiàn)方式。而兩者有大量的代碼都是可以共享的,這就是依賴注入的使用場景了。下一步就是創(chuàng)建具體的依賴內(nèi)容,然后注入到需要的地方這里的等于這個(gè)對象。 前言 React 是一個(gè)十分龐大的庫,由于要同時(shí)考慮 ReactDom 和 ReactNative ,還有服務(wù)器渲染等,導(dǎo)致其代碼抽象化程度很高,嵌套層級...
摘要:調(diào)用棧是這樣的這里生成的我們將其命名為,它將作為參數(shù)傳入到。整個(gè)的調(diào)用棧是這樣的組件間的層級結(jié)構(gòu)是這樣的到此為止,頂層對象已經(jīng)構(gòu)造完畢,下一步就是調(diào)用來自的方法,進(jìn)行頁面的渲染了。通過表達(dá)的結(jié)構(gòu)最終會轉(zhuǎn)化為一個(gè)純對象,用于下一步的渲染。 歡迎關(guān)注我的公眾號睿Talk,獲取我最新的文章:showImg(https://segmentfault.com/img/bVbmYjo); 一、前言...
摘要:前言是一個(gè)十分龐大的庫,由于要同時(shí)考慮和,還有服務(wù)器渲染等,導(dǎo)致其代碼抽象化程度很高,嵌套層級非常深,閱讀其源碼是一個(gè)非常艱辛的過程。在學(xué)習(xí)源碼的過程中,給我?guī)椭畲蟮木褪沁@個(gè)系列文章,于是決定基于這個(gè)系列文章談一下自己的理解。 前言 React 是一個(gè)十分龐大的庫,由于要同時(shí)考慮 ReactDom 和 ReactNative ,還有服務(wù)器渲染等,導(dǎo)致其代碼抽象化程度很高,嵌套層級非常...
閱讀 4747·2021-11-15 11:39
閱讀 2696·2021-11-11 16:55
閱讀 2203·2021-10-25 09:44
閱讀 3508·2021-09-22 16:02
閱讀 2437·2019-08-30 15:55
閱讀 3127·2019-08-30 13:46
閱讀 2664·2019-08-30 13:15
閱讀 1955·2019-08-30 11:12