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