摘要:下面是源碼里的注釋發(fā)現(xiàn)屬性差異后進(jìn)行合并,并且在需要時(shí)進(jìn)行更新。在這里會(huì)進(jìn)行兩次循環(huán)。注意,在整個(gè)應(yīng)用的運(yùn)行過(guò)程中,所有的事件都是通過(guò)名為合成事件的東西進(jìn)行傳遞的。它包含了一個(gè)名為的對(duì)象進(jìn)行監(jiān)聽(tīng)器的緩存和光臨。
接上文,
React流程圖:
https://bogdan-lyashenko.gith...
在更新DOM屬性這一步,主要的目標(biāo)就是將之前的props和當(dāng)前props的差異高效的更新到DOM上。下面是源碼里的注釋:
發(fā)現(xiàn)屬性差異后進(jìn)行合并,并且在需要時(shí)進(jìn)行DOM更新。這個(gè)方法很可能是性能優(yōu)化的路徑上的最關(guān)鍵的單一方法。(“Reconciles the properties by detecting differences in property values and updating the DOM as necessary. This function is probably the single most critical path for performance optimization.”)
在這里會(huì)進(jìn)行兩次循環(huán)。第一次,遍歷上一次的props,然后再遍歷下一次的props。
在我們的案例中,掛載時(shí),lastProps(上一次的屬性)是空值(因?yàn)檫@是我們第一次進(jìn)行賦值),不過(guò),我們還是可以看看里面發(fā)生了什么
在這個(gè)循環(huán)的第一步中,我們會(huì)檢查nextProps是否包含相同的屬性值。如果有的話,對(duì)于這些屬性值我們會(huì)先跳過(guò),因?yàn)樗鼈儠?huì)在之后的nextprops循環(huán)中被處理掉。然后,我們會(huì)重置樣式,刪除事件監(jiān)聽(tīng)器(如果之前有設(shè)置的話),移除DOM屬性和DOM屬性值。對(duì)于屬性的處理,我們需要確保它們不是RESERVED_PROPS中的保留關(guān)鍵字,那些是真正的組件屬性,如children,dangerouslySetInnerHTML。
循環(huán)后props在這個(gè)循環(huán)的第一步中,首先需要檢查prop是否改變了,也就是檢查屬性的下一個(gè)值是否和之前的不同。如果是相同的話,則什么都不需要做。對(duì)于樣式(你應(yīng)該發(fā)現(xiàn)對(duì)于樣式的處理有些特殊),如果根lastProp相比有變化的,React會(huì)更新其值。然后,添加會(huì)事件監(jiān)聽(tīng)器(就像onClick等等)。下面,我們進(jìn)一步的進(jìn)行分析。
注意,在整個(gè)React應(yīng)用的運(yùn)行過(guò)程中,所有的事件都是通過(guò)名為合成事件(synthetic events)的東西進(jìn)行傳遞的。所謂的合成事件,就是為了更高效的使React工作而組裝的一些包裝器。而管理事件的中介模塊就是就是EventPuginHub(srcrendererssharedstackeventEventPluginHub.js)。它包含了一個(gè)名為listenerBank的map對(duì)象進(jìn)行監(jiān)聽(tīng)器的緩存和光臨。我們需要把我們的事件監(jiān)聽(tīng)器加入其中,不過(guò)不是現(xiàn)在,而是在組件和DOM元素已經(jīng)準(zhǔn)備好處理事件的時(shí)候。在這里,看起來(lái)好像我們延遲了事件的執(zhí)行,你可以會(huì)問(wèn),我們?nèi)绾潍@知事件發(fā)生的那一刻呢?不知道你是否還記得我們會(huì)在所有的方法調(diào)用里傳遞transaction這個(gè)事務(wù)對(duì)象,之所以這樣做,就是為了讓我們能夠更方便的處理這種上面疑問(wèn)的場(chǎng)景,看下代碼:
//src enderersdomsharedReactDOMComponent.js#222 transaction.getReactMountReady().enqueue(putListener, { inst: inst, registrationName: registrationName, listener: listener, });
在處理完事件監(jiān)聽(tīng)器后,我們需要設(shè)置DOM屬性和屬性值。就像上面說(shuō)的那樣,我們需要確保這些屬性不是RESEVED_PROPS的保留關(guān)鍵字,那些是真正的組件屬性,如children和djangerouslySetInnerHTML。
在處理屬性的前后差異過(guò)程中,我們會(huì)計(jì)算出styleUpdates的配置,然后把它傳遞給CSSPropertyOperations模塊。
現(xiàn)在,我們已經(jīng)完成對(duì)屬性更新的過(guò)程的分析,我們可以繼續(xù)下一步了。
(未完待續(xù))
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/95808.html
摘要:源碼里有個(gè)獨(dú)立的模塊管理組件的所有子元素。第一個(gè),實(shí)例化子元素使用并掛載它們。至于具體掛載流程,基于子元素類型的不同而有不同的掛載過(guò)程。掛載的過(guò)程基本完成了。 接上文, React流程圖:https://bogdan-lyashenko.gith... 創(chuàng)建初始子組件 在之前的步驟里,組件本身的構(gòu)建已經(jīng)完成,接下去,我們分析它們的子元素。總共分為兩步:掛載子元素(this.mountC...
摘要:技術(shù)上來(lái)說(shuō),當(dāng)方法被調(diào)用后或者發(fā)生改變后,方法都會(huì)被調(diào)用。下一步,會(huì)設(shè)置為。之后,檢測(cè)當(dāng)前更新是否由更新引起的。這是因?yàn)椋褂檬菍?dǎo)致組件持久化更新,而會(huì)被方法的返回值重新賦值。 接上文, React流程圖:https://bogdan-lyashenko.gith... 更新組件 關(guān)于組件的更新,我們先看下代碼里的注釋: 對(duì)于已掛載組件的更新過(guò)程,React會(huì)首先調(diào)用component...
摘要:接上文,流程圖我們已經(jīng)知道掛載的工作流程,現(xiàn)在我們換個(gè)方向研究下方法,這個(gè)也是的重要組成部分。這個(gè)問(wèn)題,我們會(huì)在下一篇文章中進(jìn)行解答。。。 接上文, React流程圖:https://bogdan-lyashenko.gith... this.setState 我們已經(jīng)知道掛載的工作流程,現(xiàn)在我們換個(gè)方向研究下--setState方法,這個(gè)也是React的重要組成部分。 首先,為什么我...
摘要:當(dāng)鼠標(biāo)事件發(fā)生時(shí),組件的最外層會(huì)進(jìn)行處理,然后通過(guò)幾層包裝器的處理后,會(huì)開(kāi)始進(jìn)行批量更新操作。在這之后,會(huì)將這些事件處理成常見(jiàn)到樣子。 接上文, React流程圖:https://bogdan-lyashenko.gith... 回到最初 在流程圖中,也許你已經(jīng)注意到,setState方法可以通過(guò)幾種方式觸發(fā),更準(zhǔn)確的說(shuō),可以分為是否由外部引起的(也就是是否由用戶觸發(fā))。讓我們看下如下...
摘要:接著,將返回的元素和之前的進(jìn)行比較的,以驗(yàn)證是否真的需要更新。我們看下代碼,代碼比較簡(jiǎn)單好,對(duì)應(yīng)于我們的這個(gè)列子,我們對(duì)于方法的更改并不會(huì)對(duì)方法造成影響。所以我們進(jìn)入下一步,也就是對(duì)于節(jié)點(diǎn)的更新。 接上文, React流程圖:https://bogdan-lyashenko.gith... 如果組件真的需要更新 在組件剛開(kāi)始更新過(guò)程時(shí),如果有定義componentWillUpdate方...
閱讀 1354·2023-04-25 23:42
閱讀 2845·2021-11-19 09:40
閱讀 3529·2021-10-19 11:44
閱讀 3565·2021-10-14 09:42
閱讀 1873·2021-10-13 09:39
閱讀 3840·2021-09-22 15:43
閱讀 675·2019-08-30 15:54
閱讀 1457·2019-08-26 13:32