React@15.6.2源碼解析---從 ReactDOM.render 到頁面渲染(3)ReactUpdates

上篇博客介紹了instantiateReactComponent方法,方法內部實現(xiàn)還是很簡單的,那么回到react得渲染流程里冠王,接下來就是執(zhí)行ReactUpdates.batchedUpdates方法向挖,所以本篇博客講解ReactUpdates操作,從名字可以看出這是處理React更新的文件哪替,內部用到一個很重要得東西就是Transaction栋荸,對于這個詞想必大家還是很熟悉得。ReactUpdates內部實現(xiàn)也是很簡單,內部封裝了batchedUpdates蒸其,enqueueUpdate敏释,flushBatchedUpdates等方法,而這三個是最重要的操作摸袁。內部也用到了一些全局依賴注入得東西钥顽,和上一篇博客提到的是一樣的。

ReactUpdates

var ReactUpdates = {
  /**
   * React references `ReactReconcileTransaction` using this property in order
   * to allow dependency injection.
   *
   * @internal
   */
  ReactReconcileTransaction: null,

  batchedUpdates: batchedUpdates,
  enqueueUpdate: enqueueUpdate,
  flushBatchedUpdates: flushBatchedUpdates,
  injection: ReactUpdatesInjection,
  asap: asap
};

這是最終的ReactUpdates對象靠汁,內部得屬性還是很少的蜂大,這邊的asap不做說明,我沒看懂這個東西蝶怔,還望各位大牛指導奶浦!,下面就一一為這些屬性說明

ReactUpdates.injection

injection放在第一個是因為踢星,這個方法在全局以來注入的時候就被執(zhí)行了澳叉,論執(zhí)行順序的話,這個方法是第一個被執(zhí)行的方法沐悦,而且下面的方法需要用到依賴注入的東西成洗,本著不讓看官不知道這個變量是從哪里來的原則,所以這個方法放在第一位藏否。

injection對應著ReactUpdatesInjection

// ReactUpdates.js
var ReactUpdatesInjection = {
  injectReconcileTransaction: function (ReconcileTransaction) {
    !ReconcileTransaction ? /**/
    ReactUpdates.ReactReconcileTransaction = ReconcileTransaction;
  },

  injectBatchingStrategy: function (_batchingStrategy) {
    !_batchingStrategy ? /**/
    batchingStrategy = _batchingStrategy;
  }
};

內部有兩個函數(shù)瓶殃,分別用于給ReactUpdates.ReactReconcileTransaction 和 外部閉包的batchingStrategy變量賦值。每個函數(shù)內部都會首先對傳入的參數(shù)做一個是否存在的驗證副签。那么來看傳遞的實參是什么遥椿,回到ReactDefaultInjection.js文件

// ReactDefaultInjection.js
ReactInjection.Updates.injectReconcileTransaction(ReactReconcileTransaction);
ReactInjection.Updates.injectBatchingStrategy(ReactDefaultBatchingStrategy);

那么這邊可以看到一個是ReactReconcileTransaction 對象,一個是ReactDefaultBatchingStrategy對象淆储,這兩個都是重點冠场。拿起小筆開始畫重點了!6艨肌慈鸠!依舊留坑,以后會說的灌具。本人是講信用的人青团,你看這兩篇博客不就是在填坑。

ReactUpdates.ReactReconcileTransaction

ReactReconcileTransaction 屬性是全局依賴注入通過ReactUpdates.injection.injectReconcileTransaction方法完成賦值操作咖楣。

該屬性翻譯為中文就是 ‘React 調和事務’督笆。這邊reconcile調和調節(jié)得意思,實質上就是一個過程诱贿,state改變導致VDom改變娃肿,然后計算真實Dom的過程咕缎。這邊用到了Transaction將在下一篇博客進行講解。并將React中得各個Transaction衍生而來得自定義Transaction做一個總結料扰。

ReactUpdates.batchedUpdates

batchedUpdates 翻譯為中文就是‘批量更新’凭豪,大家都知道在React中,setState方法是批處理的晒杈。這也是為什么React會渲染很快的原因嫂伞,內部的更新進行批處理操作,避免不必要的渲染拯钻。

function batchedUpdates(callback, a, b, c, d, e) {
  ensureInjected();
  return batchingStrategy.batchedUpdates(callback, a, b, c, d, e);
}

這邊首先執(zhí)行一個ensureInjected()方法帖努,目的是確保之前依賴注入的兩個變量都完成了注入。

function ensureInjected() {
  !(ReactUpdates.ReactReconcileTransaction && batchingStrategy)
    ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactUpdates: must inject a reconcile transaction class and batching strategy')
    : _prodInvariant('123') : void 0;
}

順便一提粪般,這邊有一個小東西 void 0拼余,在我的博客網(wǎng)站有做過說明,附上傳送門void (0) ??? undefined

那么回到正題亩歹,這個方法本質上是調用的batchingStrategy.batchedUpdates(callback, a, b, c, d, e)匙监,這邊的batchingStrategy就是一開始依賴注入的ReactDefaultBatchingStrategy,是React的默認批處理策略捆憎。下一片博客的主題就是這個舅柜。

ReactUpdates.flushBatchedUpdates

這邊提到一個對象叫dirtyComponents,因為還沒有用到躲惰,所以這邊只是大概的描述一下,在你的React中变抽,當你調用setState時础拨,React會將你傳入的值壓倒一個隊列中,然后將該組件標記為一個dirtyComponent绍载,最后會回過頭來查看這個更新隊列诡宗,遍歷隊列計算出最終的值,然后進行渲染击儡,這樣就達到了批處理的操作塔沃,避免了大量不必要的渲染。

那么這邊用到了一個ReactUpdatesFlushTransaction ‘更新刷新事務’

var flushBatchedUpdates = function () {
  // ReactUpdatesFlushTransaction's wrappers will clear the dirtyComponents
  // array and perform any updates enqueued by mount-ready handlers (i.e.,
  // componentDidUpdate) but we need to check here too in order to catch
  // updates enqueued by setState callbacks and asap calls.
  while (dirtyComponents.length || asapEnqueued) {
    if (dirtyComponents.length) {
      var transaction = ReactUpdatesFlushTransaction.getPooled();
      transaction.perform(runBatchedUpdates, null, transaction);
      ReactUpdatesFlushTransaction.release(transaction);
    }

    if (asapEnqueued) {
      asapEnqueued = false;
      var queue = asapCallbackQueue;
      asapCallbackQueue = CallbackQueue.getPooled();
      queue.notifyAll();
      CallbackQueue.release(queue);
    }
  }
};

ReactUpdates.asap

不知道是個啥東西阳谍。蛀柴。。

/**
 * Enqueue a callback to be run at the end of the current batching cycle. Throws
 * if no updates are currently being performed.
 * 在當前批處理周期結束時運行回調矫夯。如果當前沒有執(zhí)行更新鸽疾,則引發(fā)。
 */
function asap(callback, context) {
  invariant(batchingStrategy.isBatchingUpdates, "ReactUpdates.asap: Can't enqueue an asap callback in a context where" + 'updates are not being batched.');
  asapCallbackQueue.enqueue(callback, context);
  asapEnqueued = true;
}

總結

那么這邊是執(zhí)行ReactUpdates.batchedUpdates训貌,它實質上是執(zhí)行的ReactDefaultBatchingStrategy.batchedUpdates制肮,這樣我們的渲染流程到此就又加上一筆冒窍。

本篇留坑

Transaction 及尤其衍生出的自定義事務

ReactDefaultBatchingStrategy

下篇博客:ReactDefaultBatchingStrategy

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市豺鼻,隨后出現(xiàn)的幾起案子综液,更是在濱河造成了極大的恐慌,老刑警劉巖儒飒,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谬莹,死亡現(xiàn)場離奇詭異,居然都是意外死亡约素,警方通過查閱死者的電腦和手機届良,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來圣猎,“玉大人士葫,你說我怎么就攤上這事∷突冢” “怎么了慢显?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長欠啤。 經(jīng)常有香客問我荚藻,道長,這世上最難降的妖魔是什么洁段? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任应狱,我火速辦了婚禮,結果婚禮上祠丝,老公的妹妹穿的比我還像新娘疾呻。我一直安慰自己,他們只是感情好写半,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布岸蜗。 她就那樣靜靜地躺著,像睡著了一般叠蝇。 火紅的嫁衣襯著肌膚如雪璃岳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天悔捶,我揣著相機與錄音铃慷,去河邊找鬼。 笑死炎功,一個胖子當著我的面吹牛枚冗,可吹牛的內容都是我干的。 我是一名探鬼主播蛇损,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼赁温,長吁一口氣:“原來是場噩夢啊……” “哼坛怪!你這毒婦竟也來了?” 一聲冷哼從身側響起股囊,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤袜匿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后稚疹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體居灯,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年内狗,在試婚紗的時候發(fā)現(xiàn)自己被綠了怪嫌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡柳沙,死狀恐怖岩灭,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情赂鲤,我是刑警寧澤噪径,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站数初,受9級特大地震影響找爱,放射性物質發(fā)生泄漏。R本人自食惡果不足惜泡孩,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一车摄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧仑鸥,春花似錦练般、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敞贡。三九已至泵琳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間誊役,已是汗流浹背获列。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛔垢,地道東北人击孩。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像鹏漆,于是被迫代替她去往敵國和親巩梢。 傳聞我的和親對象是個殘疾皇子创泄,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內容