React では、ノード操作、ライフサイクル メソッド、および Effect メソッドを実行するために EffectList がトラバースされます。EffectList はクリスマス ツリーにぶら下がっているカラフルなライトに例えることができ、このクリスマス ツリーは Fiber ツリーです。 EffectList はなぜ存在するのでしょうか?たとえば、ファイバー ツリーには、 EffectList はこの問題を解決します。ファイバー ツリーの構築中に、ファイバー ノードの EffectList コレクションEffectList は一方向のリンク リストです。firstEffect ファイバー ツリーの構築は深さ優先です。つまり、子ファイバー ノードが最初に下向きに構築され、子ノードが構築された後に親ファイバー ノードが上向きに構築されるため、子ファイバー ノードは常に EffectList の先頭になります。 Fiber ノードの構築を完了する操作は、 簡略化されたコードは次のとおりです。 関数 completeUnitOfWork(unitOfWork: Fiber): void { 完了した作業 = unitOfWork とします。 する { 現在の作業を完了します。 const returnFiber = 完了した作業.return; 次は、completeWork を現在の作業、completedWork、subtreeRenderLanes に格納します。 // エフェクトリストの構築 if ( returnFiber !== null && (returnFiber.flags & 不完全) === NoFlags ){ // レイヤーごとにコピーします if (returnFiber.firstEffect === null) { 戻り値: } 完了した作業の最後の効果が null ではない場合 // これは、現在のノードが兄弟ノードであり、子ノードに効果があり、returnFiber.lastEffect に値が割り当てられていることを意味します if (returnFiber.lastEffect !== null) { // 兄弟ノードを接続する効果 戻り値: } 戻り値: } const flags = 完了した作業.flags; // このファイバーノードには効果があります if (フラグ > 実行された作業) { // 現在のノードにはエフェクトリストに接続されたエフェクトがあります returnFiber.lastEffect !== null の場合 { 完了した作業を返します。 } それ以外 { // returnFiber に firstEffect がない場合、効果を持つノードに初めて遭遇したときです。 returnFiber.firstEffect = CompletedWork; } 完了した作業を返します。 } } // 兄弟要素を走査し、親に戻ります。const siblingFiber = completeWork.sibling; 兄弟ファイバーが null の場合 作業進行中 = 兄弟ファイバー; 戻る; } 完了した作業 = returnFiber; 進行中 = 完了した作業; } while (completedWork !== null); } EffectList は実際にはバブルのように動作し、 次の構造のように、各 <div id="1"> <div id="4"/> <div id="2"> <div id="3"/> </div> </div> 最終的なEffectListは 最初の効果 => div4 最後の効果 => div1 Fiber ツリーは深さ優先で構築されるため、すべての EffectList のトラバーサルは 最初の効果 => div4 div4.nextEffect => div3 div3.nextEffect => div2 div2.nextEffect => div1 最初のレンダリング時のEffectList React では、最初のマウントに対してパフォーマンスの最適化が行われ、Fiber ノードの EffectList には 最初の効果をさせる; // ルートノードfinishedWorkも接続します if (finishedWork.flags > PerformedWork) { 終了した作業の最後の効果が null の場合 終了した作業.lastEffect.nextEffect = 終了した作業; firstEffect = 完成した作業。firstEffect; } それ以外 { 最初の効果 = 完成した作業; } } それ以外 { // ルートノードは効果がありません。 firstEffect = 完成した作業。firstEffect; } EffectList のトラバーサルEffectList は主に、レイアウト フェーズのライフ サイクル メソッドと DOM 操作の実行に使用されます。 // getSnapshotBeforeUpdate を処理し、useEffect をスケジュールする 次のエフェクト = 最初のエフェクト; する { コミット前にミューテーション効果(); } while (nextEffect !== null); //DOM 操作 nextEffect = firstEffect; する { commitMutationEffects(ルート、renderPriorityLevel); } while (nextEffect !== null); // ライフサイクルメソッドの実行 nextEffect = firstEffect; する { commitLayoutEffects(ルート、レーン); } while (nextEffect !== null); レイアウト ステージのこれらの 3 つのメソッドでは、 要約するEffectList はグローバル変数ではありません。ファイバー ツリーの作成中に、 コレクション プロセスは深さ優先であるため、子が最初にコレクションされ、トラバーサル中に子が最初に操作されます。そのため、面接官が子と親のライフ サイクルまたは 上記はReactのEffectListの詳細についての簡単な分析です。ReactのEffectListの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: マルチコア CPU を使用して Linux コマンドを高速化する方法 (GNU Parallel)
>>: Django+mysql の設定と簡単な操作データベースのサンプルコード
1. Flashプラグインパッケージのダウンロードアドレス: https://get.adobe.c...
最近 Linux をいじっていたので、nginx の新しいバージョンをインストールしたいと思いました...
インターネット時代が成熟するにつれて、オンライン広告の発展も加速しています。圧倒的な広告収入と完璧な...
目次1. 背景2. バーチャルリストとは何か3. 関連概念の紹介4. 仮想リストの実装4.1 ドライ...
大規模な Web サイトでは、多数の同時アクセスを処理するために、Web サイト上の分散負荷分散以上...
1. Eコマースアイコン2. アイコンスイーツ2 3. 携帯電話アイコンパック4. 旗アイコンセット...
ポートマッピングDocker コンテナを起動する前にポート マッピングを行わないと、コンテナ外部のネ...
目次序文SQL文の最適化遅いクエリSQLを記録する設定を変更する方法スロークエリログを表示するSQL...
Rownum は、Oracle での独自の書き込み方法です。Oracle では、rownum を使用...
実際のプロジェクトでは、複数のテーブル間に関係が存在します。 1 つのテーブル内のすべてのデータを取...
目次1. reduxとreactの関係2. Reactのマルチコンポーネント共有3. reduxの3...
このキー属性の機能は何ですか?まずは公式の説明を見てみましょう。 kekey 属性は主に、新しいノー...
目次インストールソフトウェア管理匿名アクセスモード設定ファイルを変更するクライアントがサーバーにログ...
ステップ: 1. 仮想マシンディレクトリに新しいdocker-compose.ymlファイルを作成し...
この記事の例では、Androidの9グリッド画像を表示するための具体的なコードを参考までに共有してい...