これは、React DOM 操作を詳細に説明した最初の記事です。記事の内容はコミット フェーズで発生します。 Fiber アーキテクチャでは、React が 2 種類のツリー構造を維持する必要があります。1 つは Fiber ツリー、もう 1 つは DOM ツリーです。 DOM ノードが削除されると、ファイバー ツリーも同期的に変更される必要があります。ただし、削除操作のタイミングには注意してください。DOM ノードの他の変更 (追加、修正) を完了する前に、他の操作への干渉を避けるために、まずファイバー ノードを削除してください。 これは、他の DOM 操作を実行するときにファイバー ツリーをループする必要があるためです。削除する必要があるのに削除されていないファイバー ノードがあると、混乱が生じます。
Fiber.deletions はレンダリング フェーズの diff プロセスです。ファイバーの子ノードを削除する必要がある場合は、ここで追加されます。 commitDeletion 関数はノードを削除するためのエントリ ポイントであり、unmountHostComponents を呼び出すことによって削除を実装します。削除操作を理解する前に、シーンを見てみましょう。 以下のようにファイバーツリーがあり、Node(Nodeはコード名であり、特定のノードを指すものではありません)ノードが削除されようとしています。
このシナリオから、ノードが削除されると、その下のサブツリー内のすべてのノードが削除されることが推測できます。それでは、このシナリオを例に、削除プロセスを見ていきましょう。このプロセスは、実際には unmountHostComponents 関数の動作メカニズムです。 削除プロセス Node ノードを削除するには、親 DOM ノードの参加が必要です。
したがって、まず親ノードを見つける必要があります。このプロセスは、ファイバー ツリー内のノードの親ノードから上方向に検索し、最初に見つかったネイティブ DOM ノードが親ノードになります。この例では、親ノードは div です。その後、ノードから始めて、ファイバー ツリーでもあるサブツリーをトラバースします。トラバースは深さ優先トラバーサルであるため、各子ノードを削除します。 特に注意が必要なのは、ループ ノードを削除するときに、各ノードが削除操作によって処理されることです。ここでの各ノードは、DOM ノードではなくファイバー ノードです。 DOM ノードは、ノードのトラバースと削除を開始すると削除されます。最初のネイティブ DOM ノード (HostComponent または HostText) が検出されると、そのサブツリーのすべてのファイバー ノードが削除された後にのみ削除されます。 上記はプロセス全体の簡単な説明です。詳細なプロセスについては、いくつかの主要な機能の責任と呼び出し関係を明確にする必要があります。 unmountHostComponents 関数はファイバー ノードを削除します。削除されたノードはターゲット ノードと呼ばれ、その役割は次のとおりです。
ステップ 3 の操作は、サブツリーをトラバースしてノードをアンマウントするという単純で明確な責任を持つ commitNestedUnmounts によって完了します。 その後、commitUnmount によって各ノードの特定のアンマウント プロセスが完了します。その責任は
さまざまな種類のコンポーネントの具体的な削除プロセスを見てみましょう。 削除されたコンポーネントのカテゴリを区別する ノード タイプにはさまざまなものがあります。削除プロセスを説明するために、最も一般的な 3 つのタイプ (HostComponent、ClassComponent、HostPortal) を例に挙げます。 まず、unmountHostComponents を実行します。これは、DOM レベルで親ノードを見つけ、次の 3 つのコンポーネント タイプに従って処理します。1 つずつ見ていきましょう。 ホストコンポーネント Node が HostComponent の場合、commitNestedUnmounts が呼び出され、Node から開始してサブツリーをトラバースし、すべての子ファイバーのアンマウントを開始します。トラバーサル プロセスは深さ優先トラバーサルです。
アンインストールするには、各ノードで commitUnmount を 1 つずつ実行します。このトラバーサル プロセスは、実際には 3 種類のノードで同様です。スペースを節約するために、ここでは 1 回だけ説明します。 Node のファイバーがアンロードされ、次に下方向に p のファイバーがアンロードされます。p には子がなく、その兄弟である <Child> が見つかります。<Child> のファイバーがアンロードされ、次に下方向に a が見つかり、a のファイバーがアンロードされます。この時点で、サブツリー全体のリーフ ノードに到達し、上方向への戻りを開始します。 a から <Child> へ、そして Node に戻ると、トラバーサルとアンインストールのプロセスが終了します。 サブツリーのすべてのファイバー ノードがアンロードされた後にのみ、ノードの DOM ノードを親ノードから安全に削除できます。 クラスコンポーネント
ノードは ClassComponent です。対応する DOM ノードはありません。最初に commitUnmount を呼び出して自身をアンインストールする必要があります。次に、下方を調べて最初のネイティブ DOM タイプ ノード span を見つけ、それを開始点としてサブツリーをトラバースし、すべてのファイバー ノードがアンインストールされていることを確認し、親ノードから span を削除します。 ホストポータル
ノードはHostPortalで、対応するDOMノードがないため、削除プロセスは基本的にClassComponentと同じです。違いは、その下の最初の子ファイバーのDOMノードを削除するときに、削除されたHostPortalタイプのノードのDOMレベルの親ノードから削除されるのではなく、図のdiv2であるHostPortalのcontainerInfoから削除されることです。これは、HostPortalが子ノードを親コンポーネントの外部のDOMノードにレンダリングするためです。 上記は、3 種類のノードの削除プロセスです。注目すべきは、unmountHostComponents 関数を実行してサブツリーをトラバースし、各ノードをアンインストールするときに、HostPortal タイプの子ノードに遭遇すると、unmountHostComponents が再度呼び出され、それをターゲット ノードとして使用して、そのノードとそのサブツリーをアンインストールして削除するということです。これは再帰プロセスに相当します。 コミットアンマウント HostComponent と ClassComponent の削除は両方とも commitUnmount を呼び出し、FunctionComponent もそれを呼び出します。その役割は 3 つのコンポーネントごとに異なります。
要約する 削除プロセスの重要なポイントを確認しましょう。
ファイバー ノードに基づいて DOM に対して他の操作を実行する前に、後続の操作のために残されたファイバー ノードが有効であることを確認するために、まずノードを削除する必要があります。削除の対象は、ファイバー ノードとそのサブツリー、およびファイバー ノードに対応する DOM ノードです。 軌跡全体はファイバー ツリーに沿って進み、対象ノードとすべての子ノードをアンロードし、対象ノードに対応する DOM ノード (またはその下の最初のノード) を削除します。ネイティブ DOM タイプのノードの場合、親 DOM ノードから直接削除されます。HostPortal ノードの場合、子ノードは外部 DOM ノードにレンダリングされるため、この DOM ノードから削除されます。上記 3 つのポイントを明確にし、上記の整理プロセスと組み合わせることで、削除操作のコンテキストを徐々に整理することができます。 |
>>: 業界丨2020年のインテリジェントウェーブを理解するには、BaiduとGoogleのAIの足跡から始める
[[355166]]この記事はWeChatの公開アカウント「bigsai」から転載したもので、著者は...
[[201203]] 1. Keras を使用する理由ディープラーニングが大人気の昨今、サードパーテ...
[[187204]]最近、シェフィールド大学自動制御システム工学部のロデリッヒ・グロス博士は次のよう...
モノのインターネット(IoT)はどこにでもあります。実際、ここ数年、スマート製造、サプライ チェーン...
人工知能ツールによって特定された、火星の最新のクレーター群の高解像度画像。画像出典: Space.c...
4月13日、TechnologyReviewによると、ロボットが倉庫への特定のルートを取ることを決...
現在、人工知能や5Gなどの技術の助けを借りて、我が国のドローン開発は急速な成長の軌道に乗っています。...
今年 7 月、OpenAI は強力なプラグインである Code Interpreter をリリースし...