Vueのデータ応答性原則の詳細な説明

Vueのデータ応答性原則の詳細な説明

この記事は主に、Vue のレスポンシブ ソース コードを理解していない、または触れたことがない人向けです。主な目的は、Vue のレスポンシブ原則の基本を理解することです。面接でこのような質問をされた場合、面接官があなたに何と答えてほしいかわかりますか?追記:記事に間違いがありましたら、ご訂正いただければ幸いです。

応答的な理解

応答性とは、その名前が示すように、データが変更されるとビューが更新されることを意味します。この記事では主に、Vue2.0 におけるオブジェクトと配列の応答性の実装を分析します。依存関係の収集とビューの更新については次の記事に譲ります。

Vue では、レスポンシブ データとは、一般的に配列型とオブジェクト型のデータを指します。 Vue は Object.defineProperty メソッドを通じてオブジェクトのプロパティを内部的にハイジャックし、配列は配列メソッドをオーバーライドすることによって実装されます。以下に簡単に実装してみましょう。

まず、傍受する必要があるデータを定義します。

定数vm = 新しいVue({
 データ () {
  戻る {
   カウント: 0,
   人: { 名前: 'xxx' },
   編曲: [1, 2, 3]
  }
 }
})
配列メソッド
function Vue (options) { // ここではデータの操作のみ考慮します let data = options.data
 if (データ) {
  data = this._data = typeof data === 'function' ? data.call(this) : data
 }
 観察者(データ)
}
関数オブザーバー(データ) { 
 if (typeof data !== 'object' || data === null) {
  データを返す
 }
 if (data.__ob__) { // __ob__ 属性が存在するということは、それが傍受されたことを示している return data
 }
 新しいオブザーバー(データ)
}

arrayMethods、Observer、__ob__の実装と機能については、以下をお読みください。

オブザーバークラスの実装

クラスオブザーバー{
 コンストラクタ(データ){
  Object.defineProperty(data, '__ob__', { // 配列ハイジャックに必要な、データの __ob__ プロパティを定義します。enumerable: false, // 列挙できません。configurable: false, // 構成できません。value: this // 値は Observer インスタンスです。})
  if (Array.isArray(data)) { //配列をインターセプトする data.__proto__ = arrayMethods //プロトタイプ継承 this.observerArray(data)
  } else { // オブジェクトのインターセプション this.walk(data)
  }
 }
 歩く(データ){
  定数キー = Object.keys(データ)
  for(let i = 0; i < keys.length; i++) {
   定数キー = キー[i]
   defineReactive(データ、キー、データ[キー])
  }
 }
 observerArray (data) { // 配列内の各項目をインターセプトします data.forEach(value => observer(value))
 }
}

オブジェクトの傍受

オブジェクトハイジャックに関して注意すべき点がいくつかあります。

  • オブジェクトを走査します。値がまだオブジェクト型である場合は、オブザーバー メソッドを再度呼び出す必要があります。
  • 新しい値セットがオブジェクト型の場合、これもインターセプトされる必要がある。
//処理オブジェクトのインターセプト関数 defineReactive(data, key, value) {
 observer(value) // value がまだオブジェクト型の場合は、再帰的にハイジャックする必要があります Object.defineProperty(data, key, {
  得る() {
   戻り値
  },
  set(新しい値){
   (newValue === value)の場合、戻り値
   値 = 新しい値
   observer(newValue) // newValue 値もオブジェクト型の場合は、ハイジャックする必要があります}
 })
}

配列ハイジャック

配列ハイジャックに関して注意すべき点がいくつかあります。

  • 配列は関数ハイジャック(スライスプログラミング)の考え方を利用してデータを傍受する
  • 配列に新しく追加された値がオブジェクト型の場合、再インターセプトする必要があります。
const oldArrayPrototype = Array.prototype
配列メソッド = Object.create(oldArrayPrototype)
const methods = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'] // 元の配列を変更できるメソッド methods.forEach(method => {
 配列Methods[メソッド] = 関数(...引数) {
  const result = oldArrayPrototype[methods].call(this, ...args)
  const ob = this.__ob__ // これはメソッドを呼び出す配列です let insert; // 配列に新しく追加された項目のコレクションをインターセプトする必要があります switch(methods) {
   ケース 'プッシュ': 
   ケース 'unshift':
    挿入された = 引数
   ケース 'スプライス':
    insert = args.slice(2) // spliceの2番目のパラメータが追加されるため}
  if (挿入) {
   ob.observerArray(挿入)
  }
  結果を返す
 }
})

原則の概要

インタビューでは、Vue のレスポンシブ原則を手書きする必要がある場合、上記のコードで十分です。しかし、Vue のソースコードを学習することで、面接で以下のような要約回答ができれば、面接官からより好まれるでしょう。

Vue 2.0 ソースコードのレスポンシブ原則:

  • オブジェクトは再帰的にインターセプトされるため、データ レベルが深くなるほどパフォーマンスは低下します。
  • 配列項目が多すぎるとパフォーマンスが低下するため、配列は Object.defineProperty を使用してインターセプトされません。
  • data で定義されたデータのみがインターセプトされます。後でインスタンスに vm.newObj = 'xxx' を通じて追加する属性はインターセプトされません。
  • 配列のインデックスと長さの変更はインターセプトされないため、ビューは更新されません。
  • データへの新しい属性の追加や配列のインデックスと長さの変更をインターセプトする必要がある場合は、$setメソッドを使用できます。
  • Object.freeze メソッドを使用すると、データを最適化し、パフォーマンスを向上させることができます。このメソッドを使用するデータは、set メソッドと get メソッドによって書き換えられません。

Vue 3.0 ソースコードのレスポンシブ原則:

  • バージョン 3.0 では、Object.defineProperty の代わりに proxy が使用されています。proxy には 13 個のインターセプション メソッドがあります。オブジェクトと配列を別々に処理する必要はなく、再帰的にインターセプトする必要もありません。これもパフォーマンスの最大の改善点です。
  • Vue 3.0 バージョンのレスポンシブ原則のシンプルな実装
定数ハンドラ = {
 取得(ターゲット、キー) {
  (typeof target[key] === 'object' && target[key] !== null){
   新しいProxy(target[key], handler)を返す
  }
  Reflect.get(ターゲット、キー) を返します。
 },
 (ターゲット、キー、値)を設定する{
  if(key === 'length') が true を返す
  コンソールログ('更新')
  Reflect.set(ターゲット、キー、値) を返します。
 }
}
定数オブジェクト = {
 編曲: [1, 2, 3],
 カウント: { 数値: 1 }
}
// obj はプロキシのターゲット オブジェクト、handler は構成オブジェクトです。const proxy = new Proxy(obj, handler)

Vue のデータ応答性の原則に関する詳細な説明はこれで終わりです。Vue のデータ応答性に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vueデータ応答性原則の配列の詳細な説明
  • Vue のデータ応答性に関する詳細な理解
  • Vue データの応答性の概要
  • Vue のデータ応答性原則に関する知識ポイントのまとめ
  • Vue データの応答性はどのように実装されていますか?
  • Vue のデータ応答性の原理についての簡単な説明
  • Vueはデータ応答性の原理を詳しく説明します

<<:  ActiveMQ メッセージ サービスを構築するための Docker 学習方法の手順

>>:  MySQL 5.7.16 のインストールと設定方法のグラフィック チュートリアル (Ubuntu 16.04)

推薦する

VirtualBox に CentOS、JDK、Hadoop をインストールする詳細なチュートリアル

目次1. 前提条件1.1 サポートされているプラ​​ットフォーム1.2 jdk および hadoop...

SpringBoot と Docker の統合の詳細なプロセス

目次1. デモプロジェクト1.1 インターフェースの準備1.2 構成の準備2. Dockerがリモー...

画像の色を変更するための純粋なCSS

画像の色を変更するための CSS テクニックは非常にシンプルです。具体的なコードは次のとおりです。ヒ...

Golang を使って Docker API を実際に操作する

目次SDKのインストールローカル Docker の管理コンテナの実行バックグラウンドでコンテナを実行...

LinuxカーネルとSVNバージョン間の競合の解決策

現象システムは Linux システムカーネルを正常にコンパイルできましたが、SVN をインストールし...

TomcatはLog4jを使用してcatalina.outログを出力します。

Tomcat のデフォルトのログは java.util.logging を使用しますが、これにはい...

ネイティブJSで様々なモーションの複合モーションを実現

この記事では、ネイティブ JS で実装された複合モーションを紹介します。複合モーションとは、異なる属...

jQuery はピッカーをシミュレートしてスライド選択効果を実現します

この記事では、スライド選択効果を実現するピッカーをシミュレートするjQueryの具体的なコードを参考...

js キャンバスで円形の水のアニメーションを実現

この記事の例では、円形の水のアニメーションを実現するためのキャンバスの具体的なコードを参考までに共有...

SQL 実装 LeetCode (185. 部門内で最も給与の高い上位 3 名)

[LeetCode] 185. 部門別給与上位3位従業員テーブルにはすべての従業員が保持されます。...

Vue3+Vite+TS は、要素プラスビジネスコンポーネントの二次カプセル化を実装します sfasga

目次1. 構造文字列2. タプルを返す3. Dict辞書にアクセスする4. 図書館を利用する5. リ...

SpringBoot プロジェクトの Docker 環境を実行するときに発生する無限再起動問題の詳細な説明

もしかしたら私の考え方が間違っていたのかもしれないし、問題の説明が少し乱雑だったのかもしれないが、こ...

MySQL の current_timestamp の落とし穴とその解決策を共有する

目次MySQL の current_timestamp の落とし穴エラーを報告する私の解決策mysq...

vscodeで保存した後のHTML自動フォーマットの問題を解決する

vsCode のバージョンは最近更新され、現在のバージョン番号は 1.43 です。実際、vsCode...

MySQL のデータ型とフィールド属性の原理と使用法の詳細な説明

この記事では、MySQL のデータ型とフィールド属性について説明します。ご参考までに、詳細は以下の通...