Vue 仮想 DOM の問題について

Vue 仮想 DOM の問題について

1. 仮想DOMとは何ですか?

仮想 DOM は、本質的にはビューのインターフェース構造を記述するために使用される共通の JS オブジェクトです。

ここに画像の説明を挿入

Vue では、各コンポーネントにレンダリング関数があります。

ここに画像の説明を挿入

レンダリングがない場合は、テンプレートを探します。テンプレートがない場合は、el を探します。el がある場合は、el.outHTML がテンプレートとして使用され、この文字列がレンダリング関数にコンパイルされます。
テンプレートがあれば、それ以上は見ません。レンダリングについても同様です。

ここに画像の説明を挿入

各レンダリング関数は仮想 DOM ツリーを返します。つまり、各コンポーネントは仮想 DOM ツリーに対応します。
つまり、レンダリングの目的は仮想 DOM を作成し、このコンポーネントが正確に何を表示するかということです。
console.log('レンダリング'); ↓

ここに画像の説明を挿入
ここに画像の説明を挿入

話題外ですが、console.dir() はオブジェクトのすべてのプロパティとメソッドを表示できます。

ここに画像の説明を挿入

戻り値がない場合、ページには実際の DOM が存在しません。
リターンを追加↓

ここに画像の説明を挿入

h関数名はカスタムで、h関数の構造はh(ラベル、{独自の属性}、[サブ要素])です。
h関数を使用してサブ要素の作成を続けます。他の属性もあるため、[ ]内に別のサブ要素を作成します。

ここに画像の説明を挿入

h関数で判定する。オブジェクトでない場合はテキストノードである。↑途中の構成は省略されていると考えられる

ここに画像の説明を挿入

ページ上にレンダリングされます。
console.log(vnode);

ここに画像の説明を挿入

h1 子要素↓

ここに画像の説明を挿入
ここに画像の説明を挿入

.elm を通じて実際のノードに対応する

h('h1','{ {title}}') は絶対に受け入れられません。h('h1',this.title) にする必要があります。

2. 仮想 DOM が必要な理由

Vue では、ビューをレンダリングすると render 関数が呼び出されます。このレンダリングは、コンポーネントが作成されたときだけでなく、ビューが依存するデータが更新されたときにも発生します。レンダリング中に実際の DOM を直接使用すると、実際の DOM の作成、更新、挿入によってパフォーマンスが大幅に低下し、レンダリング効率が大幅に低下します。
そのため、レンダリング時に、Vue は実際の DOM ではなく仮想 DOM を使用し、主にレンダリング効率の問題を解決します。

初めて読み込むときに実 DOM を生成することは避けられず、必要なことなので、実 DOM を生成することに問題はありません。
レンダリング関数は一度だけではなく、データが変更されるたびに生成されます。
しかし、レンダリングで createElement を使用すると、毎回新しい DOM 要素が生成されるため、コストがかかりすぎます。

3. 仮想DOMはどのようにして実際のDOMに変換されるのか

コンポーネント インスタンスが初めてレンダリングされるとき、まず仮想 DOM ツリーを生成し、ノードを深さ優先でトラバースし、属性を設定してから、仮想 DOM ツリーに基づいて実際の DOM を作成します。実際の DOM をページ内の適切な位置にマウントし、div#app を直接置き換えます。この時点で、各仮想 DOM は実際の DOM に対応します。

ここに画像の説明を挿入

div#appが直接置き換えられているため、等しくありません。

コンポーネントがレスポンシブなデータ変更の影響を受け、再レンダリングする必要がある場合でも、レンダリング関数を再度呼び出して新しい仮想 DOM ツリーを作成し、新しいツリーと古いツリーを比較します。比較を通じて、Vue は最小の更新量を見つけ、必要な実際の DOM ノードを更新して、実際の DOM への変更を最小限に抑えます。

ここに画像の説明を挿入

diff アルゴリズムを使用して、2 つの仮想 DOM が異なるかどうかを確認し、対応するノードの実際の DOM を変更して目的の効果を実現し、変更を最小限に抑えて効率を向上させます。

4. テンプレートと仮想DOMの関係

ここに画像の説明を挿入

スキャフォールディングによって構築された仮想DOM

Vue フレームワークにはコンパイル モジュールがあり、主にテンプレートをレンダリング関数に変換する役割を担っており、レンダリング関数はそれを呼び出した後に仮想 DOM を取得します。

コンパイル プロセスは 2 つのステップに分かれています (babel と webpack はどちらもこの方法で作成されます)。

テンプレート文字列をAST(抽象構文木、ツリー構造で内容を記述する)に変換し、ASTをレンダリング関数に変換します。

AST↓、ASTはスタックで構築されていることを述べておきます

ここに画像の説明を挿入

従来のインポート方法 (src) を使用する場合、コンポーネントが初めてロードされたときにコンパイル時間が発生し、これをランタイムコンパイルと呼びます。繰り返しますが、ステップ 1 は非常に時間がかかります。
vue-cli のデフォルト設定の場合、パッケージ化中にコンパイルが行われ、これをテンプレートのプリコンパイルと呼びます。
コンパイルは、パフォーマンスを非常に消費する操作です。プリコンパイルにより、実行時のパフォーマンスを効果的に向上できます。さらに、実行時にコンパイルが不要になるため、vue-cli はパッケージ化時に vue のコンパイル モジュールを除外して、パッケージ サイズを削減します。

上記にテンプレートが書かれていない場合

ここに画像の説明を挿入
ここに画像の説明を挿入

エラーが報告されますが、vue.config.jsで設定できます。

module.export={runtimeCompiler:true}

コンパイルされたコンテンツが追加され、コンテンツが大きくなるため、推奨されません。 (パッケージ化を高速化するために esbuild と vite について言及したいと思いますが、私はまだ使用していません。)

テンプレートが存在するのは、開発者がインターフェース コードを書きやすくするためだけです。
最終的にVueが実行される際に必要となるのはテンプレートではなくレンダリング関数です。そのため、テンプレート内の各種構文は仮想DOM内には存在せず、すべて仮想DOMの構成になります。

ここに画像の説明を挿入

同等

ここに画像の説明を挿入

例: ディレクトリを自動生成する

ここで、スロット内のコンテンツに基づいてディレクトリを自動的に生成できるコンポーネントを作成する必要があります。

ここに画像の説明を挿入
ここに画像の説明を挿入

Vue 仮想 DOM の問題に関するこの記事はこれで終わりです。Vue 仮想 DOM に関するその他の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • この記事は、Vueの仮想Domとdiffアルゴリズムを理解するのに役立ちます。
  • Vue仮想DOMの原理
  • Vue 仮想 DOM クイックスタート
  • Vueソースコード解析における仮想DOMの詳しい説明
  • Vueにおける仮想DOMの理解のまとめ
  • Vue 仮想 Dom から実際の Dom への変換
  • Vue の仮想 DOM に関する知識ポイントのまとめ

<<:  Alibaba Cloud CentOS 7 に yum を使用して MySQL をインストールする正しい方法 (推奨)

>>:  Windows 8.1 で MySQL5.7 のルート パスワードを忘れた場合の解決方法

推薦する

Innodb で MySQL の 2T テーブルをすばやく削除する方法の例

序文この記事は主に、MySQL の Innodb で 2T の大きなテーブルをすばやく削除する方法に...

HTML コード作成ガイド

共通コンベンションタグ自己終了タグ。閉じる必要はありません (例: img input br hr ...

Linux サーバー上で nvidia-docker 環境を設定するプロセスの詳細な説明

Docker はコンテナに相当し、必要な動作環境に応じて対応する動作環境を構築できます。このとき、各...

MySQLは重複しないデータ挿入を実装するためにUNIQUEを使用する

SQL UNIQUE制約UNIQUE 制約は、データベース テーブル内の各レコードを一意に識別します...

MySQL truncate table ステートメントの使用

Truncate table ステートメントは、テーブル内のすべてのデータを削除/切り捨てるために使...

Linux システムに docker をインストールし、ssh 経由で docker コンテナにログインする方法

注: 私はCentosを使ってdockerをインストールしていますステップ1: Dockerをインス...

MySQL インデックスの正しい使い方とインデックスの原理の詳細な説明

1. はじめになぜインデックスが必要なのでしょうか?一般的なアプリケーション システムでは、読み取り...

CentOS 8で自動更新を設定するための手順を完了する

データとコンピューターに対してできる最善のことは、それらを安全に保つことです。アップデートを有効にす...

vue3.2 で追加された defineCustomElement の基本原理の詳細な説明

目次Webコンポーネントカスタム要素概要HTMLTemplateElement コンテンツ テンプレ...

MySQL の隠し列の詳細表示

目次1. 主キーが存在する2. 主キーはないが、一意のインデックスが存在する3. 共同主キーまたは共...

CSS で実現される HTML 背景色のグラデーション

エフェクトのスクリーンショット:実装コード:コードをコピーコードは次のとおりです。 <!DOC...

Dockerのローカルイメージ作成方法の分析

コンテナと呼ばれるものは、実際には親イメージに基づいて読み取りおよび書き込み可能なファイル階層を作成...

MySQL 関数インデックス最適化ソリューション

MySQL を使用する場合、多くの開発者は一部の列に対して関数計算を実行することが多く、その結果、イ...

CocosCreatorでリストを作成する方法

CocosCreator バージョン: 2.3.4 Cocos には List コンポーネントがない...

一般的なMysql DDL操作の概要

図書館管理ライブラリを作成する データベースを作成します [存在しない場合] ライブラリ名;ライブラ...