VUE 応答性原理の詳細な説明

VUE 応答性原理の詳細な説明

1. 応答原理の基盤

応答性の基本原理はObject.defineProperty(obj, prop, descriptor)に基づいています。descriptor では get descriptorと set メソッドを定義できます。get メソッドはプロパティ値を取得するときにトリガーでき (依存関係を収集できます)、set メソッドはプロパティ値を設定するときにトリガーできます (依存関係を更新できます)。

拡張: 上記は vue2.0 の基本的な応答性原則です。vue3.0 の基本原則は Proxy で、属性の get および set メソッドの監視、属性の追加と削除の監視などを行うことができます。Object.defineProperty よりも強力ですが、IE11 と互換性がありません。

2. コアオブジェクト: Dep と Watcher

Dep : データ内で vue によって宣言された各プロパティは Dep のインスタンス オブジェクトを生成し、Dep.subs はプロパティが変更されたときに更新する必要がある Watcher を格納します。

Watcher : Watcher インスタンス オブジェクトが生成される状況は 3 つあります。

1. computed で定義された計算プロパティ。

2. 時計に書き込まれた監視機能。

3. コンポーネントレンダリングウォッチャー

3. 依存関係を収集して更新する

3.1 依存関係の収集

Watcher インスタンス オブジェクト w を、それが依存する属性の Dep に配布します。プロセスは次のとおりです。

1. Dep.target を現在の Watcher のインスタンス オブジェクト w に設定します。

2.w は定義された関数 (つまり、computed/watch で記述された関数) を実行します。

3. 関数実行プロセス中に data で定義された属性が使用されると、属性の get メソッドがトリガーされます。 get メソッドでは、Dep インスタンス オブジェクト dep が Dep.target に格納されている w を dep.subs 配列に格納して、依存関係のコレクションを完了します。

注: Dep.targetは現在のウォッチャーのインスタンスオブジェクトです。

3.2 依存関係の更新

宣言したプロパティを変更すると、プロパティの set メソッドがトリガーされます。set メソッドは、dep.subs 配列に収集された Watcher インスタンス オブジェクトを更新します。つまり、computed および watch で定義した関数をトリガーします。

4. ソースコードのデバッグ

4.1 テストページコード

<テンプレート>
  <div>
    <div>a:<input v-model="a" /> </div>
    <div>c:{{ c }}</div>
    <div>b:<input v-model="b" /> </div>
  </div>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
  データ: () => {
    戻る {
      a: ''、
      b: ''
    }
  },
  計算: {
    c() {
      'source from ' + this.a を返します。
    }
  },
  時計:
    b() {
      console.log('bが変更されました');
    }
  }
};
</スクリプト>

上記のコードは、Vue が初期化された後に次のオブジェクトを生成します。

1. オブジェクトの説明

属性 a と b に対応する Dep インスタンス オブジェクト (a と b が変更されたときに更新する必要があるウォッチャーを収集): depAdepB

ページ レンダリング関数は、対応する Watcher インスタンス オブジェクトupdateWatcher生成します。

計算プロパティ c は、対応する Watcher インスタンス オブジェクトwatcherCを生成します。

ウォッチ リスナー属性 b は、対応する Watcher インスタンス オブジェクトwatcherBを生成します。

2. DepとWatcherの関係

a と b が変更されるとページを再レンダリングする必要があるため、 depAdepBsubsupdateWatcherが存在します。

計算されたプロパティ c はプロパティ a の変更に依存するため、 watcherC depA のサブに存在します。

b の変更は、watch の定義内の b の listen 関数をトリガーするため、 watcherB depB のサブに存在します。

3. 最終的な関係の結果

最後のプロパティ a は依存関係を収集しますdepA.subs = [ updateWatcher, watcherC] ;

最終プロパティ b は依存関係を収集しますdepB.subs = [ updateWatcher, watcherB] ;

4.2 ソースコードのデバッグ

ソースファイルを見つけます: node_modules\vue\dist\vue.runtime.esm.js ;

主に以下の機能が含まれます。

1. コレクション依存のエントリ関数: initState (ページが初期化されるときに実行されます)。

初期化の順序は、データ --> 計算済み --> ウォッチです。これは、計算済みがデータに依存し、ウォッチがデータとウォッチに依存するため、依存するものを最初に初期化する必要があるためです。

2. 計算と監視を初期化するときに、ウォッチャーインスタンス化オブジェクトを生成する

まずWatcher.get関数を実行し、Dep.targetを現在のWatcherインスタンス化オブジェクトに設定します。

依存関係の収集をトリガーする

計算プロパティで関数を実行します。データ内のプロパティにアクセスすると、データ プロパティの get メソッドがトリガーされ、依存関係の収集がトリガーされます。

このプロパティが変更されると、set メソッドがトリガーされ、dep.subs 内のウォッチャー オブジェクトの更新がトリガーされます。

最後に、Watcher の更新関数がトリガーされ、更新されるウォッチャーがキューに入れられます。

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • Vueにおけるv-modelと応答性の実装原理の分析
  • Vue の応答性原則の詳細な例
  • Vue3.0 レスポンシブ機能の原理の詳細
  • Vueのレスポンシブシステムの原理の詳細な説明
  • Vue3のレスポンシブ原則の詳細な説明
  • VUE レスポンシブ原則の実装の詳細な説明

<<:  HTML のスクロールバーについて/スクロールバーの削除

>>:  @media レスポンシブ CSS を使用してさまざまな画面に適応する例

推薦する

HTMLはキャンバスを使用して箇条書きスクリーン機能を実装します

導入最近、大きな課題をこなす際に、弾幕プレイヤーを作る必要がありました。他の人のソースコードを借りて...

Win10 での MySQL 8.0.15 のインストールと設定のグラフィック チュートリアル

この記事ではMySQL 8.0.15のインストールと設定方法を参考までに記録します。具体的な内容は以...

Docker プライマリ ネットワーク ポート マッピング構成

ポートマッピングDocker コンテナを起動する前にポート マッピングを行わないと、コンテナ外部のネ...

Vue の v-model ディレクティブと .sync 修飾子の違いの詳細な説明

目次vモデル.sync微妙な違い機能シナリオを要約します。 vモデル <!--親コンポーネント...

CSS でリスト スタイル属性を設定する方法 (この記事を読むだけ)

リストスタイルのプロパティHTMLには、順序なしリストと順序ありリストの2種類のリストがあります。仕...

JS における ES6 継承と ES5 継承の違い

目次継承ES5 プロトタイプ継承ES6 クラス継承両者の違いES5プロトタイプ継承の内部実装ES6 ...

Dockerイメージの作成Dockerfileとコミット操作

イメージを構築するイメージを構築するには、主に 2 つの方法があります。実行中のコンテナをイメージに...

MySQL 8.0 エラー サーバーがクライアントに不明な認証方法を要求しました 解決策

最新バージョンのMySQL 8.0.11をインストールした後、ユーザーを作成して認証します。認証され...

ubuntu18.04 での qt5.12.8 のインストールと環境設定に関する詳細なチュートリアル

環境システム: Ubuntu 18.04ソフトウェア: qt5.12.8 1. インストールパッケー...

VUE ユニアプリライフサイクルに関する簡単な説明

目次1. アプリケーションライフサイクル2. ページのライフサイクルコンポーネントライフサイクル要約...

純粋な CSS3 で美しい入力ボックスアニメーションスタイルライブラリを実現 (テキスト入力愛)

純粋な CSS3 で実装された美しい入力ボックス アニメーション スタイル ライブラリを共有します ...

HTML/CSS の基礎 - HTML コード記述におけるいくつかの注意事項 (必読)

この記事の警告事項は、ブラウザの互換性とはまったく関係ありません。主に、プロジェクトで遭遇したいくつ...

Reactでwindow.print()を使用した際にページが応答しなくなる問題の解決記録について

目次1. 問題の背景: 2. 問題の原因: 3. 問題解決:要約: 1. 問題の背景: window...

CSS フロントエンドの知識ポイントのまとめ(必読)

1. CSS の概念: (カスケーディング スタイル シート)利点: 1. コンテンツとプレゼンテ...

MySQL最適化ツール(推奨)

序文今日 GitHub を閲覧していたところ、SQL を最適化および書き換えるための sora とい...