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 のルート パスワードを忘れた場合の解決方法

推薦する

詳細なLinuxインストールチュートリアル

(Win7 システム) VMware 仮想マシンのインストール チュートリアルVMware は仮想マ...

ウェブデザイン必携ハンドブック 216 ウェブセーフカラー

Web ページ上の色の表現は、さまざまな要因によって影響を受けます。Web ページで非常に美しい配色...

MySQLの共同クエリ最適化メカニズムの詳細な説明

目次MySQL フェデレーテッド クエリ実行戦略。実行計画フェデレーテッドクエリオプティマイザーMy...

MySql インデックスはクエリ速度を向上させる一般的な方法のコード例

インデックスを使用してクエリを高速化する1. はじめにWeb 開発には、ビジネス テンプレート、ビジ...

mysql5.7でbinlogを使用してデータを復元する方法

ステップ1: MySQLでbinlogが有効になっていることを確認する '%log_bin%...

ドメイン名を指定されたポートに転送するようにNginxを設定する方法

/usr/local/nginx/conf と入力する sudo cd /usr/local/ngi...

IE ラベル LI テキスト折り返し問題について

私は長い間この問題に悩まされていましたが、検索してみたところ、実際にこの問題を解決した人がいることが...

JavaScript で配列の変更を監視する方法

序文以前、defineProperty を紹介したとき、オブジェクトの変更のみを監視でき、配列の変更...

Windows サーバー ポートを開きます (例としてポート 8080 を使用します)

ポートとは何ですか?私たちが通常参照するポートは、物理的な意味でのポートではなく、具体的には TCP...

複数の条件を持つ MySQL クエリ メソッド

複数の条件を持つ MySQL クエリ環境: MySQL 5.7 where ステートメントに複数の ...

JavaScript をスリープまたは待機させる方法

目次概要setTimeout() の確認スリープ関数の書き方シンプルな選択ループで実行されますか?要...

HTMLテーブルではテーブルの外側の境界線のみが表示されます

質問があります。Dreamweaver で、3 行 1 列のログイン フォーム (ログイン、登録、パ...

要素 el-table テーブルの二次カプセル化 (テーブルの高さの調整付き)

序文会社でのインターンシップ中、フロントエンド開発にはvue+element-uiフレームワークを使...

負のマージントップ値は、ラベルテキストと入力の間の垂直中央揃えの問題を解決します。

ラベルテキストと入力の垂直方向の中央揃えを調整するのは簡単ではありません。padding、verti...