react同類同級(jí)diff比較解析

Diff算法3個(gè)策略

  1. 跨層級(jí)不進(jìn)行不比較
  2. 不同類不進(jìn)行比較
  3. 同類同級(jí)通過(guò)key比較

主要對(duì)第三種進(jìn)行解釋

例子

更新前組件:A-B-C-D => 更新后組件:C-B-E-A

滿足child._mountIndex < lastIndex才會(huì)進(jìn)行組件移動(dòng)

  • child._mountIndex其實(shí)是當(dāng)前的index,但此時(shí)正在比較,還未變動(dòng),也就是更新前的index

  • lastIndex是一個(gè)不斷更新的值,每一個(gè)組件比較后,lastIndex為Math.max(prevChild.mountIndex,lastIndex)

遍歷新集合:

比較C:child._mountIndex為2,lastIndex為0,不滿足,不執(zhí)行變動(dòng),更新lastIndex為2;

比較B:child._mountIndex為1,lastIndex為2,滿足,執(zhí)行移動(dòng),更新lastIndex為2;

比較E:舊集合未找到,執(zhí)行添加,lastIndex為2;

比較A:child._mountIndex為0,lastIndex為2,滿足,執(zhí)行移動(dòng),更新lastIndex為2;

遍歷舊集合,發(fā)現(xiàn)D,執(zhí)行刪除

缺點(diǎn)

從上面例子可以發(fā)現(xiàn),diff算法主要通過(guò)不斷更新lastIndex進(jìn)行判斷,因此,
如果lastIndex一開始就更新成最后一個(gè)index,那么后面的所有組件都要進(jìn)行變動(dòng)。

例如:

更新前組件:A-B-C-D => 更新后組件:D-A-B-C

一開始比較D:child._mountIndex為3,lastIndex為0,不滿足,不執(zhí)行變動(dòng),更新lastIndex為3;

此時(shí)lastIndex已經(jīng)為最大值,后面所有比較都會(huì)滿足child._mountIndex < lastIndex

更新變動(dòng)為:

D組件不變

A,B,C組件都要移動(dòng)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 10,583評(píng)論 0 13
  • 目前,前端領(lǐng)域中 React 勢(shì)頭正盛,使用者眾多卻少有能夠深入剖析內(nèi)部實(shí)現(xiàn)機(jī)制和原理。本系列文章希望通過(guò)剖析 R...
    流動(dòng)碼文閱讀 1,017評(píng)論 0 11
  • Virtual DOM能夠體現(xiàn)高質(zhì)量的渲染性能,不得不得意與強(qiáng)大的diff算法。計(jì)算一棵樹形結(jié)構(gòu)轉(zhuǎn)換成另一棵樹形結(jié)...
    tobAlier閱讀 2,946評(píng)論 0 7
  • 我上周日在體育館跑了個(gè)7km,完成了上一周的跑步訓(xùn)練。那天剛剛是家人的生日聚會(huì),家人團(tuán)聚的時(shí)刻,和家人一起娛樂(lè)后,...
    枝枝Rena閱讀 370評(píng)論 0 1
  • 近年來(lái)有關(guān)校園欺凌的新聞屢見報(bào)端。每個(gè)成年人,在自己的求學(xué)時(shí)代,必然會(huì)遇上一些欺負(fù)別人的“壞孩子”。同學(xué)間正常的小...
    輕語(yǔ)言閱讀 627評(píng)論 0 0

友情鏈接更多精彩內(nèi)容