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

資訊專(zhuān)欄INFORMATION COLUMN

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

SnaiLiu / 513人閱讀

摘要:當(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ā))。讓我們看下如下兩個(gè)列子,第一個(gè)中,
是由鼠標(biāo)點(diǎn)擊觸發(fā)的,第二個(gè)中,是在componentDidMount中由setTimeout方法中被觸發(fā)的。

為什么會(huì)有這些不同呢?如果你還有印象,在之前的文章中,React對(duì)于更新的處理是批量的,也就是說(shuō),一系列更新操作會(huì)通過(guò)某種方式被收集起來(lái),然后統(tǒng)一刷新到頁(yè)面上。當(dāng)鼠標(biāo)事件發(fā)生時(shí),組件的最外層會(huì)進(jìn)行處理,然后通過(guò)幾層包裝器的處理后,會(huì)開(kāi)始進(jìn)行批量更新操作。注意,批量更新操作的前提是確保ReactEventListener處于enabled狀態(tài),而且,在前文提到過(guò),在組件的掛載階段,ReactReconcileTransaction包裝器中的一個(gè)會(huì)先關(guān)閉它,以確保整個(gè)掛載過(guò)程的安全。 至于setTimeout中的調(diào)用,則是在將組件放入dirtyComponents列表之前,React會(huì)確保事務(wù)處于打開(kāi)狀態(tài),在這之后,關(guān)閉事務(wù)包裝器,然后將更新刷新到頁(yè)面上。

正如你所知,React實(shí)現(xiàn)了合成事件,在一下原生事件包裹了一些合成語(yǔ)法糖。在這之后,React會(huì)將這些事件處理成常見(jiàn)到樣子。看下如下代碼里到注釋?zhuān)?/p>

為了更好地開(kāi)發(fā),通過(guò)模擬真實(shí)游覽器事件,我們可以得到更好開(kāi)發(fā)工具整合過(guò)程(To help development we can get better dev tool integration by simulating a real browser event’)
var fakeNode = document.createElement("react");

ReactErrorUtils.invokeGuardedCallback = function (name, func, a) {
      var boundFunc = func.bind(null, a);
      var evtType = "react-" + name;

      fakeNode.addEventListener(evtType, boundFunc, false);

      var evt = document.createEvent("Event");
      evt.initEvent(evtType, false, false);

      fakeNode.dispatchEvent(evt);
      fakeNode.removeEventListener(evtType, boundFunc, false);
};

回到我們的更新流程,我們?cè)谶@里總結(jié)下大概的步驟:
1 調(diào)用setState方法
2 如果批量事務(wù)未處于開(kāi)啟狀態(tài),則打開(kāi)該事務(wù)
3 將受影響組件添加到dirtyComponents列表里
4 通過(guò)調(diào)用ReactUpdates.flushBatchedUpdates方法關(guān)閉事務(wù),也就意味著開(kāi)始對(duì)dirtyComponents列表進(jìn)行處理。

(未完待續(xù))

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/95916.html

相關(guān)文章

  • Under-the-hood-ReactJS-Part11】React源碼解讀

    摘要:技術(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)于組件的更新,我們先看下代碼里的注釋?zhuān)?對(duì)于已掛載組件的更新過(guò)程,React會(huì)首先調(diào)用component...

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

    摘要:接上文,流程圖我們已經(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的重要組成部分。 首先,為什么我...

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

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

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

    摘要:接著,將返回的元素和之前的進(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方...

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

    摘要:接上文,流程圖子組件掛載我們繼續(xù)探究方法。對(duì)于我們的實(shí)例代碼而言,就是標(biāo)簽,所以沒(méi)有額外的處理過(guò)程。屬性驗(yàn)證緊接著的被調(diào)用的驗(yàn)證方法用于確保被正確設(shè)置,否則,會(huì)拋出異常。 接上文, React流程圖:https://bogdan-lyashenko.gith... 子組件掛載 我們繼續(xù)探究mount方法。 如果渲染的標(biāo)簽里有復(fù)雜的html標(biāo)簽,如video,form,textarea等...

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

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

0條評(píng)論

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