欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文掌握React?組件樹遍歷技巧

 更新時間:2023年04月17日 09:56:07   作者:uccs  
這篇文章主要為大家介紹了React?組件樹遍歷技巧的掌握,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

本文對應(yīng)的 react 版本是 18.2.0

下面的 dom 結(jié)構(gòu)react 內(nèi)部是如何遍歷的

const App = () => {
  return (
    <div>
      <button>+1</button>
      <A count={0} />
    </div>
  );
};
const A = (props) => {
  useEffect(() => {
    console.log(props.count);
  }, [props.count]);
  return <div>{props.count}</div>;
};

react 內(nèi)部遍歷核心邏輯:

  • render 時調(diào)用 commitPassiveUnmountOnFiber 函數(shù)
  • commitPassiveUnmountOnFiber 處理不同的 WorkTag,并調(diào)用 recursivelyTraversePassiveUnmountEffects
  • recursivelyTraversePassiveUnmountEffects 根據(jù)當(dāng)前 Fiber 的子節(jié)點有沒有 passive effectuseEffect,useLayoutEffect)來決定是否遍歷當(dāng)前 Fiber 的子節(jié)點
    • 如果子節(jié)點有 passive effect,則優(yōu)先遍歷子節(jié)點 (深度優(yōu)先),直到找到最終的葉子節(jié)點,退出當(dāng)前循環(huán)
    • 然后進入兄弟節(jié)點,開始遍歷兄弟節(jié)點的子節(jié)點
      • 具體從哪個兄弟節(jié)點開始遍歷,react 選擇的是離退出循環(huán)的那個葉子節(jié)點的父節(jié)點,檢查有沒有子節(jié)點,以此循環(huán)遍歷
    • 直到最后找到所有有 passive effect 的節(jié)點

代碼簡化:

commitPassiveUnmountOnFiber(root.current);
function commitPassiveUnmountOnFiber(finishedWork) {
  // 省略了處理不同的 WorkTag
  recursivelyTraversePassiveUnmountEffects(finishedWork);
}
function recursivelyTraversePassiveUnmountEffects(parentFiber) {
  // 省略了其他處理
  if (parentFiber.subtreeFlags & PassiveMask) {
    let child = parentFiber.child;
    while (child !== null) {
      commitPassiveUnmountOnFiber(child);
      child = child.sibling;
    }
  }
}

所以對于這段 dom 的遍歷邏輯是:

  • 首先從根組件開始 FiberRootNode,取到 current
    • 也就是說 FiberRootNode.currentdiv#root 這是一個 fiber,它的 tag3
  • 由于 App 的子組件有 passive effect,所以會進入 App 組件,它的 tag0
  • App 組件中節(jié)點是 <div><di >tag5
    • <div> 下面有兩個子元素 <button>、<A>
  • 先遍歷 <button> 它的 tag5
  • <button> 內(nèi)部只有一個文本節(jié)點,沒有 passive effect
    • 所以 react 不遍歷了(跳出當(dāng)前遍歷的循環(huán),也就是 button 這條不在遍歷了)
  • 跳出循環(huán)后,查看 button 的兄弟節(jié)點,它的兄弟節(jié)點是 <A>,<A>tag0
  • 由于 <A> 節(jié)點的子節(jié)點沒有 passive effect,所以跳出循環(huán),結(jié)束整個遍歷

總結(jié)

  • 從跟節(jié)點開始遍歷
  • 當(dāng)前組件的子組件有沒有 passive effect
  • 采取深度優(yōu)先
  • 如果 dom 節(jié)點內(nèi)有函數(shù)組件,則這個 dom 會被遍歷,否則不會遍歷
  • 如果當(dāng)前 fiber 下的所有子 fiber 都沒有 passive effect ,則這一整個都鏈表都不會被遍歷
  • 如果當(dāng)前 fiber 只有 dom,則這些 dom 也不會遍歷

總的來說組件會不會別遍歷看 fiber 有沒有 passive effect

  • 有,一定會被遍歷
  • 沒有,下面兩種情況會被遍歷,其他情況不會被遍歷
    • passive effect 的父組件
    • passive effect 組件是兄弟組件

passive effect 指的是 useEffect,useLayoutEffect

遍歷邏輯如下圖所示

圖中畫綠色勾的都會被遍歷,紅色勾是遍歷的順序

以上就是一文掌握React 組件樹遍歷技巧的詳細內(nèi)容,更多關(guān)于React 組件樹遍歷的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 對react中間件的理解

    對react中間件的理解

    這篇文章主要介紹了對react中間件的理解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 關(guān)于React動態(tài)修改元素樣式的三種方式

    關(guān)于React動態(tài)修改元素樣式的三種方式

    這篇文章主要介紹了關(guān)于React動態(tài)修改元素樣式的三種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 詳解一個基于react+webpack的多頁面應(yīng)用配置

    詳解一個基于react+webpack的多頁面應(yīng)用配置

    這篇文章主要介紹了詳解一個基于react+webpack的多頁面應(yīng)用配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • 關(guān)于React16.0的componentDidCatch方法解讀

    關(guān)于React16.0的componentDidCatch方法解讀

    這篇文章主要介紹了關(guān)于React16.0的componentDidCatch方法解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • React學(xué)習(xí)筆記之列表渲染示例詳解

    React學(xué)習(xí)筆記之列表渲染示例詳解

    最近在學(xué)習(xí)React,學(xué)習(xí)到了列表渲染這一塊,發(fā)現(xiàn)網(wǎng)上這方面的資料較少,所以自己來總結(jié)下,下面這篇文章主要給大家介紹了關(guān)于React學(xué)習(xí)筆記之列表渲染的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • Input標(biāo)簽自動校驗功能去除實現(xiàn)

    Input標(biāo)簽自動校驗功能去除實現(xiàn)

    這篇文章主要為大家介紹了Input標(biāo)簽的自動拼寫檢查功能去除實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • React中的Refs屬性你來了解嗎

    React中的Refs屬性你來了解嗎

    這篇文章主要為大家詳細介紹了的React?Refs屬性,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • react路由v6版本NavLink的兩個小坑及解決

    react路由v6版本NavLink的兩個小坑及解決

    這篇文章主要介紹了react路由v6版本NavLink的兩個小坑及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • react路由守衛(wèi)的實現(xiàn)(路由攔截)

    react路由守衛(wèi)的實現(xiàn)(路由攔截)

    react不同于vue,通過在路由里設(shè)置meta元字符實現(xiàn)路由攔截。本文就詳細的介紹一下,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • React渲染機制及相關(guān)優(yōu)化方案

    React渲染機制及相關(guān)優(yōu)化方案

    這篇文章主要介紹了react中的渲染機制以及相關(guān)的優(yōu)化方案,內(nèi)容包括react渲染步驟、concurrent機制以及產(chǎn)生作用的機會,簡單模擬實現(xiàn) concurrent mode,基于作業(yè)調(diào)度優(yōu)先級的思路進行項目優(yōu)化的兩個hooks,感興趣的小伙伴跟著小編一起來看看吧
    2023-07-07

最新評論