摘要:接著,將返回的元素和之前的進行比較的,以驗證是否真的需要更新。我們看下代碼,代碼比較簡單好,對應于我們的這個列子,我們對于方法的更改并不會對方法造成影響。所以我們進入下一步,也就是對于節點的更新。
接上文,
React流程圖:
https://bogdan-lyashenko.gith...
在組件剛開始更新過程時,如果有定義componentWillUpdate方法,則會進行調用。之后,會重繪組件并將對于componentDidUpdate方法的調用壓入隊列(React會延遲這個方法的調用,因為這個方法需要在更新過程的最后被調用)。
對于重繪過程,就是調用組件的render方法,然后根據返回值更新DOM。具體過程如下,第一步,調用組件實例(ExampleApplication)的render方法然后將結果保存下來(調用render方法會返回React元素)。接著,將返回的元素和之前的進行比較的,以驗證DOM是否真的需要更新。
上面的過程是不是很熟悉?沒錯,這個就是React的看家本領了,虛擬DOM,避免對于DOM的無用更新,提高了整個React的性能。看下代碼里對shouldUpdateReactComponent的注釋:
決定當前的實例是否需要更新,或者銷毀然后用新的實例替換
大致說來,這個方法就是用來檢測當前元素是否需要被完全替換,換句話說,老的元素應該首先被卸載,然后,新元素(render方法的返回)應該被掛載并做標記,然后接收到的mount方法的返回值,應該會被用于替換當前DOM上的元素,或者,如果元素只需要部分更新,那就按需進行更新。當以下場景發生時,通常是需要完全替換元素的:新元素不包含任何東西(在render方法里被移除了)或者元素類型完全不同。比如,原先是div,但是現在變成了其他標簽。我們看下代碼,代碼比較簡單:
///src/renderers/shared/shared/shouldUpdateReactComponent.js#25 function shouldUpdateReactComponent(prevElement, nextElement) { var prevEmpty = prevElement === null || prevElement === false; var nextEmpty = nextElement === null || nextElement === false; if (prevEmpty || nextEmpty) { return prevEmpty === nextEmpty; } var prevType = typeof prevElement; var nextType = typeof nextElement; if (prevType === "string" || prevType === "number") { return (nextType === "string" || nextType === "number"); } else { return ( nextType === "object" && prevElement.type === nextElement.type && prevElement.key === nextElement.key ); } }
好,對應于我們的ExampleApplication這個列子,我們對于state方法的更改并不會對render方法造成影響。所以我們進入下一步,也就是對于DOM節點的更新。
(未完待續)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95966.html
摘要:方法實際會操作兩件事在前一個和下一個的基礎上,更新屬性和更新的子元素。對于更新屬性,我們在之前已經分析了如果還有印象,它就是用來處理元素的屬性,樣式,事件監聽器等等。下一步,我們就分析下遺留的方法未完待續 接上文, React流程圖:https://bogdan-lyashenko.gith... 接收組件(更準確的說,是接收新元素) 通過ReactReconciler.receive...
摘要:技術上來說,當方法被調用后或者發生改變后,方法都會被調用。下一步,會設置為。之后,檢測當前更新是否由更新引起的。這是因為,使用是導致組件持久化更新,而會被方法的返回值重新賦值。 接上文, React流程圖:https://bogdan-lyashenko.gith... 更新組件 關于組件的更新,我們先看下代碼里的注釋: 對于已掛載組件的更新過程,React會首先調用component...
摘要:接上文,流程圖我們已經知道掛載的工作流程,現在我們換個方向研究下方法,這個也是的重要組成部分。這個問題,我們會在下一篇文章中進行解答。。。 接上文, React流程圖:https://bogdan-lyashenko.gith... this.setState 我們已經知道掛載的工作流程,現在我們換個方向研究下--setState方法,這個也是React的重要組成部分。 首先,為什么我...
摘要:源碼里有個獨立的模塊管理組件的所有子元素。第一個,實例化子元素使用并掛載它們。至于具體掛載流程,基于子元素類型的不同而有不同的掛載過程。掛載的過程基本完成了。 接上文, React流程圖:https://bogdan-lyashenko.gith... 創建初始子組件 在之前的步驟里,組件本身的構建已經完成,接下去,我們分析它們的子元素。總共分為兩步:掛載子元素(this.mountC...
摘要:當鼠標事件發生時,組件的最外層會進行處理,然后通過幾層包裝器的處理后,會開始進行批量更新操作。在這之后,會將這些事件處理成常見到樣子。 接上文, React流程圖:https://bogdan-lyashenko.gith... 回到最初 在流程圖中,也許你已經注意到,setState方法可以通過幾種方式觸發,更準確的說,可以分為是否由外部引起的(也就是是否由用戶觸發)。讓我們看下如下...
閱讀 2465·2021-09-29 09:34
閱讀 3301·2021-09-23 11:21
閱讀 2495·2021-09-06 15:00
閱讀 1123·2019-08-30 15:44
閱讀 2024·2019-08-29 17:23
閱讀 2996·2019-08-29 16:44
閱讀 3053·2019-08-29 13:13
閱讀 1932·2019-08-28 18:12