摘要:回到,事務(wù)是中廣泛采用的一種模式。先不論包裝行為,事務(wù)允許應(yīng)用重置事務(wù)流,阻塞一個已經(jīng)在執(zhí)行過程中的同步方法等等。我們調(diào)用掛載方法,并把它包裝進這個事務(wù)中,這是為了在掛載動作后,會檢查已掛載組件影響到了哪些內(nèi)容,并更新這些內(nèi)容。
接上文,
React流程圖:
https://bogdan-lyashenko.gith...
到現(xiàn)在這一步,組件實例已經(jīng)通過某種方式加入到React的生態(tài)系統(tǒng)中了,同時,React也會對組件進行一些處理,比如ReactUpdates這個專門的模塊。正如大家所知,React是批量處理更新的,也就是說,React會收集所有操作然后一次性操作掉。采用這種方式,一些先置條件和后置條件只需要運行一次,避免了每次更新時都要運行的弊端。
那么React是如何處理這些先置和后置條件的呢?答案就是事務(wù)(transaction)。 對于一些人來說這個可能是一個新的詞匯,尤其是從UI角度的解釋。為了更好的解釋這個,我們先從一個簡單的案例開始。
假設(shè)有個通信管道,每次通信前,你都需要先建立連接,然后發(fā)送數(shù)據(jù),最后關(guān)閉連接。如果你有很多信息需要發(fā)送,你需要重復多次這些步驟,這些步驟都需要很多的開銷。但是,所謂的事務(wù)就是你只建立一次連接,然后把所有消息一次性都發(fā)送過去,最后關(guān)閉連接即可。
我們在把這個過程更泛化下,可以把‘發(fā)送信息’認為一次你想做的操作,‘建立/關(guān)閉’連接對應(yīng)于執(zhí)行一次操作的‘前置/后置‘條件。然后,你可以多帶帶定義建立/關(guān)閉標志,然后在任何方法中使用他們(我們可以把這些建立/關(guān)閉標志稱為包裝器(wrappers),因為每個包裝器都會包裝某個動作方法)。
回到React,事務(wù)是React中廣泛采用的一種模式。先不論包裝行為,事務(wù)允許應(yīng)用重置事務(wù)流,阻塞一個已經(jīng)在執(zhí)行過程中的同步方法等等。React中有很多不同的事務(wù)類,每個類都描述一種具體的行為,但是每個類都是繼承自Transaction模塊。每種事務(wù)對應(yīng)的鍵值和特定的事務(wù)包裝類是對應(yīng)的。包裝器就是一個擁有initialize方法和close方法的對象。
總之,大概的過程就是:
調(diào)用每個包裝器的initialize方法,然后緩存其返回值
調(diào)用事務(wù)方法本身
調(diào)用包裝器的close方法
來看些React中其它使用事務(wù)的場景:
保留輸入框的選擇范圍,以便在同步Dom結(jié)構(gòu)之前/之后,其實事件發(fā)送錯誤,依然能夠恢復選擇
在重排DOM防止失焦/聚焦時停止事件,確保重排之后,事件系統(tǒng)重新激活
在游覽器的工作線程中發(fā)生同步Dom結(jié)構(gòu)后,將收集到的DOM變化隊列刷新到UI渲染主線程上
渲染新內(nèi)容后,調(diào)用收集的componentDidUpdaate的回調(diào)函數(shù)。
了解以上內(nèi)容后,回到我們一開始的實例代碼。
從流程圖中能看出,React調(diào)用了類ReactDefaultBatchingStrategyTransaction 。就像我們在上面的內(nèi)容里所說的,一個事務(wù)類的關(guān)鍵是它的包裝器。 所以,我們詳細看下包裝器,然后試著找出事務(wù)的精確定義。 兩個包裝器 FLUSH_BATCHED_UPDATES,RESET_BATCHED_UPDATES. 先看下源碼:
//src endererssharedstack econcilerReactDefaultBatchingStrategy.js#19 var RESET_BATCHED_UPDATES = { initialize: emptyFunction, close: function() { ReactDefaultBatchingStrategy.isBatchingUpdates = false; }, }; var FLUSH_BATCHED_UPDATES = { initialize: emptyFunction, close: ReactUpdates.flushBatchedUpdates.bind(ReactUpdates), } var TRANSACTION_WRAPPERS = [FLUSH_BATCHED_UPDATES, RESET_BATCHED_UPDATES];
正如你所見,這個事務(wù)類沒有先置條件。initialize方法是個空方法,但其中有個close方法--ReactUpdates.flushBatchedUpdates卻值得注意。它的作用是,
在以后的重新渲染中開始臟組件的驗證過程。我們調(diào)用掛載方法,并把它包裝進這個事務(wù)中,這是為了在掛載動作后,React會檢查已掛載組件影響到了哪些內(nèi)容,并更新這些內(nèi)容。
再看下流程圖里被包裝進事務(wù)的方法,事實上,這個方法會調(diào)用另外一個事務(wù)。。。
(未完待續(xù))
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95751.html
摘要:源碼里有個獨立的模塊管理組件的所有子元素。第一個,實例化子元素使用并掛載它們。至于具體掛載流程,基于子元素類型的不同而有不同的掛載過程。掛載的過程基本完成了。 接上文, React流程圖:https://bogdan-lyashenko.gith... 創(chuàng)建初始子組件 在之前的步驟里,組件本身的構(gòu)建已經(jīng)完成,接下去,我們分析它們的子元素。總共分為兩步:掛載子元素(this.mountC...
摘要:當鼠標事件發(fā)生時,組件的最外層會進行處理,然后通過幾層包裝器的處理后,會開始進行批量更新操作。在這之后,會將這些事件處理成常見到樣子。 接上文, React流程圖:https://bogdan-lyashenko.gith... 回到最初 在流程圖中,也許你已經(jīng)注意到,setState方法可以通過幾種方式觸發(fā),更準確的說,可以分為是否由外部引起的(也就是是否由用戶觸發(fā))。讓我們看下如下...
摘要:技術(shù)上來說,當方法被調(diào)用后或者發(fā)生改變后,方法都會被調(diào)用。下一步,會設(shè)置為。之后,檢測當前更新是否由更新引起的。這是因為,使用是導致組件持久化更新,而會被方法的返回值重新賦值。 接上文, React流程圖:https://bogdan-lyashenko.gith... 更新組件 關(guān)于組件的更新,我們先看下代碼里的注釋: 對于已掛載組件的更新過程,React會首先調(diào)用component...
摘要:接上文,流程圖我們已經(jīng)知道掛載的工作流程,現(xiàn)在我們換個方向研究下方法,這個也是的重要組成部分。這個問題,我們會在下一篇文章中進行解答。。。 接上文, React流程圖:https://bogdan-lyashenko.gith... this.setState 我們已經(jīng)知道掛載的工作流程,現(xiàn)在我們換個方向研究下--setState方法,這個也是React的重要組成部分。 首先,為什么我...
摘要:接著,將返回的元素和之前的進行比較的,以驗證是否真的需要更新。我們看下代碼,代碼比較簡單好,對應(yīng)于我們的這個列子,我們對于方法的更改并不會對方法造成影響。所以我們進入下一步,也就是對于節(jié)點的更新。 接上文, React流程圖:https://bogdan-lyashenko.gith... 如果組件真的需要更新 在組件剛開始更新過程時,如果有定義componentWillUpdate方...
閱讀 1392·2023-04-25 18:34
閱讀 3446·2021-11-19 09:40
閱讀 2832·2021-11-17 09:33
閱讀 2945·2021-11-12 10:36
閱讀 2836·2021-09-26 09:55
閱讀 2662·2021-08-05 10:03
閱讀 2523·2019-08-30 15:54
閱讀 2870·2019-08-30 15:54