国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【Under-the-hood-ReactJS-Part13】React源碼解讀

jerryloveemily / 3224人閱讀

摘要:接著,將返回的元素和之前的進(jìn)行比較的,以驗(yàn)證是否真的需要更新。我們看下代碼,代碼比較簡單好,對(duì)應(yīng)于我們的這個(gè)列子,我們對(duì)于方法的更改并不會(huì)對(duì)方法造成影響。所以我們進(jìn)入下一步,也就是對(duì)于節(jié)點(diǎn)的更新。

接上文,

React流程圖:
https://bogdan-lyashenko.gith...

如果組件真的需要更新

在組件剛開始更新過程時(shí),如果有定義componentWillUpdate方法,則會(huì)進(jìn)行調(diào)用。之后,會(huì)重繪組件并將對(duì)于componentDidUpdate方法的調(diào)用壓入隊(duì)列(React會(huì)延遲這個(gè)方法的調(diào)用,因?yàn)檫@個(gè)方法需要在更新過程的最后被調(diào)用)。
對(duì)于重繪過程,就是調(diào)用組件的render方法,然后根據(jù)返回值更新DOM。具體過程如下,第一步,調(diào)用組件實(shí)例(ExampleApplication)的render方法然后將結(jié)果保存下來(調(diào)用render方法會(huì)返回React元素)。接著,將返回的元素和之前的進(jìn)行比較的,以驗(yàn)證DOM是否真的需要更新。

上面的過程是不是很熟悉?沒錯(cuò),這個(gè)就是React的看家本領(lǐng)了,虛擬DOM,避免對(duì)于DOM的無用更新,提高了整個(gè)React的性能。看下代碼里對(duì)shouldUpdateReactComponent的注釋:

決定當(dāng)前的實(shí)例是否需要更新,或者銷毀然后用新的實(shí)例替換

大致說來,這個(gè)方法就是用來檢測當(dāng)前元素是否需要被完全替換,換句話說,老的元素應(yīng)該首先被卸載,然后,新元素(render方法的返回)應(yīng)該被掛載并做標(biāo)記,然后接收到的mount方法的返回值,應(yīng)該會(huì)被用于替換當(dāng)前DOM上的元素,或者,如果元素只需要部分更新,那就按需進(jìn)行更新。當(dāng)以下場景發(fā)生時(shí),通常是需要完全替換元素的:新元素不包含任何東西(在render方法里被移除了)或者元素類型完全不同。比如,原先是div,但是現(xiàn)在變成了其他標(biāo)簽。我們看下代碼,代碼比較簡單:

///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
        );
    }
}

好,對(duì)應(yīng)于我們的ExampleApplication這個(gè)列子,我們對(duì)于state方法的更改并不會(huì)對(duì)render方法造成影響。所以我們進(jìn)入下一步,也就是對(duì)于DOM節(jié)點(diǎn)的更新。
(未完待續(xù))

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95966.html

相關(guān)文章

  • Under-the-hood-ReactJS-Part13源碼解讀

    摘要:方法實(shí)際會(huì)操作兩件事在前一個(gè)和下一個(gè)的基礎(chǔ)上,更新屬性和更新的子元素。對(duì)于更新屬性,我們在之前已經(jīng)分析了如果還有印象,它就是用來處理元素的屬性,樣式,事件監(jiān)聽器等等。下一步,我們就分析下遺留的方法未完待續(xù) 接上文, React流程圖:https://bogdan-lyashenko.gith... 接收組件(更準(zhǔn)確的說,是接收新元素) 通過ReactReconciler.receive...

    Cobub 評(píng)論0 收藏0
  • Under-the-hood-ReactJS-Part11】React源碼解讀

    摘要:技術(shù)上來說,當(dāng)方法被調(diào)用后或者發(fā)生改變后,方法都會(huì)被調(diào)用。下一步,會(huì)設(shè)置為。之后,檢測當(dāng)前更新是否由更新引起的。這是因?yàn)椋褂檬菍?dǎo)致組件持久化更新,而會(huì)被方法的返回值重新賦值。 接上文, React流程圖:https://bogdan-lyashenko.gith... 更新組件 關(guān)于組件的更新,我們先看下代碼里的注釋: 對(duì)于已掛載組件的更新過程,React會(huì)首先調(diào)用component...

    hiyayiji 評(píng)論0 收藏0
  • Under-the-hood-ReactJS-Part8】React源碼解讀

    摘要:接上文,流程圖我們已經(jīng)知道掛載的工作流程,現(xiàn)在我們換個(gè)方向研究下方法,這個(gè)也是的重要組成部分。這個(gè)問題,我們會(huì)在下一篇文章中進(jìn)行解答。。。 接上文, React流程圖:https://bogdan-lyashenko.gith... this.setState 我們已經(jīng)知道掛載的工作流程,現(xiàn)在我們換個(gè)方向研究下--setState方法,這個(gè)也是React的重要組成部分。 首先,為什么我...

    zhoutk 評(píng)論0 收藏0
  • Under-the-hood-ReactJS-Part6】React源碼解讀

    摘要:源碼里有個(gè)獨(dú)立的模塊管理組件的所有子元素。第一個(gè),實(shí)例化子元素使用并掛載它們。至于具體掛載流程,基于子元素類型的不同而有不同的掛載過程。掛載的過程基本完成了。 接上文, React流程圖:https://bogdan-lyashenko.gith... 創(chuàng)建初始子組件 在之前的步驟里,組件本身的構(gòu)建已經(jīng)完成,接下去,我們分析它們的子元素。總共分為兩步:掛載子元素(this.mountC...

    codergarden 評(píng)論0 收藏0
  • Under-the-hood-ReactJS-Part9】React源碼解讀

    摘要:當(dāng)鼠標(biāo)事件發(fā)生時(shí),組件的最外層會(huì)進(jìn)行處理,然后通過幾層包裝器的處理后,會(huì)開始進(jìn)行批量更新操作。在這之后,會(huì)將這些事件處理成常見到樣子。 接上文, React流程圖:https://bogdan-lyashenko.gith... 回到最初 在流程圖中,也許你已經(jīng)注意到,setState方法可以通過幾種方式觸發(fā),更準(zhǔn)確的說,可以分為是否由外部引起的(也就是是否由用戶觸發(fā))。讓我們看下如下...

    SnaiLiu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<