シンプルなデータ応答システムを実装する

シンプルなデータ応答システムを実装する

1. デップ

実際、これは依存関係の収集用のコンテナーです。depend depend依存関係を収集し、 notify依存関係をトリガーします。

クラス Dep{
  コンストラクタ() {
    this._subs = [];
  }
  依存する() {
    this._subs.push(依存関係ターゲット)
  }
  通知() {
    this._subs.forEach(item => {
      アイテム.fn();
    })
  }
}

// 実はこれが dep と watcher の愛の始まりです。// watcher ではグローバルプロパティを使用して watcher を保存します。
依存関係ターゲット = null;

関数pushTarget(watch) {
  依存関係ターゲット = ウォッチ;
}

関数popTarget() {
  依存関係ターゲット = null;
}

2. 観察者を理解する

データオブジェクトのすべてのプロパティを再帰的にアクセサプロパティに変換する

// アクセサプロパティに変換する function defineReactive (obj, key, val, shallow) {

  // 依存関係コレクション コンテナーを作成します。let dep = new Dep();
  childOb = !shallow && observe(val) とします。

  Object.defineProperty(obj, キー, {
    列挙可能: true、
    設定可能: true、
    取得: 関数reactiveGetter() {
      if(依存先) {
        // 依存関係を収集 dep.depend();
      }
      戻り値:
      // ...
    },
    設定: 関数 reactiveSetter (newVal) {
      newVal === val の場合、戻り値:
      // 再帰的に走査を続けます observe(newVal);
      //トリガー依存関係 dep.notify();
      // ...
    }
  })
}

クラスオブザーバー{
  コンストラクタ(データ) {
    this.walk(データ);
  }

  ウォーク(データ) {
    定数キー = Object.keys(データ)
    (i = 0 とします; i < keys.length; i++) {
      defineReactive(データ、キー[i]、データ[キー[i]])
    }
  }
}

// データオブジェクトのすべてのプロパティを再帰的にアクセサプロパティに変換する function observe (data) {
  if(Object.prototype.toString.call(data) !== '[object Object]') return;
  新しいオブザーバー(データ);
}

この時点で、あらゆるオブジェクトのすべてのプロパティをアクセサに変換できます。

3. 監視と観察者を理解する

定数データ = {
  a: 1、
  2 倍
}

//まずオブジェクトを監視します observe(data);

watcherの主な機能は、特定の属性を検出し、属性が変更されたときにコールバックをトリガーすることです。

クラスウォッチャー{
  /**
  * @params {Function} exp プロパティ式 * @params {Function} fn コールバック */
  コンストラクタ(exp, fn) {
    this.exp = exp;
    this.fn = fn;

    //ウォッチャーを保存
    // Dep.target = this;
    pushTarget(これを);

    // 最初に式関数を1回実行し、呼び出しプロセスで、
    // data.a のアクセサーをトリガーし、data.a の get が実行されます。
    // 依存関係の収集を開始するには dep.depend() をトリガーします this.exp();

    // リリース依存関係ターゲット
    ポップターゲット();
  }
}

// 新しいウォッチャー このような依存関係が収集されます new Watcher(() => {
  data.a + data.b を返します。
}, () => {
  コンソールログ('変更')
})

4. トリガーの依存性

data.a = 3; // 変更
data.b = 3; // 変更

5. プロセスを要約する

  • オブジェクトのすべてのプロパティをアクセサに変換する
  • プロパティにwatcherを追加すると、プロパティのget関数がトリガーされます。 watcherget関数内のプロパティのdep依存関係コンテナーに保存されます。
  • このプロパティが変更されると、プロパティのsetメソッドがトリガーされます。set setdepに保存されているすべての依存関係を実行します。

シンプルなデータレスポンスシステムの実装に関するこの記事はこれで終わりです。より関連性の高いデータレスポンスシステムコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue ソースコード解析のためのデータ応答システムの使用

<<:  一般的な Dockerfile コマンドの使用方法の紹介

>>:  色の16進数カラーコード表表示と16進値の比較表示で簡単に検索できます

推薦する

角度付き双方向バインディングの詳細な説明

目次双方向バインディングの原理ngモデルレンダリングカスタム双方向バインディングプロパティコンポーネ...

404エラーページを作成する際に注意すべき問題の簡単な分析

ウェブサイトを最適化するときは、エラー ページの使い方を学ぶ必要があります。たとえば、ウェブサイトに...

Webpackを使用して複数ページのプログラムを構築するための実装手順

webpack を使用してシングルページのプログラムを構築することは非常に一般的ですが、実際の開発で...

Chrome Dev Tools を使用してページのパフォーマンスを分析する方法 (フロントエンドのパフォーマンス最適化)

背景開発やデバッグには Chrome Dev Tools がよく使用されますが、ページのパフォーマン...

初心者向け入門チュートリアル⑨:ポータルサイトの構築方法

さらに、ブログ プログラムで構築された記事 Web サイトは常にブログのように見え、カスタマイズでき...

Ubuntuが仮想マシンでインターネットに接続できない問題の解決策

インターネットに接続できない仮想マシンをセットアップするのは非常に面倒です。ここでは、Ubuntu ...

コードブロックのハイライトをコピーして表示できる js プラグイン highlight.js + clipboard.js 統合

主に2つの側面から: 1. ハイライト/改行2. コードのコピーボタンこれら両方には既製のプラグイン...

MySQL SQL ステートメントのパフォーマンス チューニングの簡単な例

MySQL SQL ステートメントのパフォーマンス チューニングの簡単な例サーバー開発を行う際には、...

VMware vSphere 6.7 (ESXI 6.7) のグラフィック インストール手順

環境: VMware VCSA 6.7 (VMware-VCSA-all-6.7.0-8169922...

WeChatアプレットのスクロールビューが左右の連動を実現

この記事では、WeChatアプレットのスクロールビューの左右連動を実現するための具体的なコードを参考...

複数のドメイン名、ポート、IP仮想ホストに基づくNginx構成

1. タイプの導入1.1 ドメインベースの仮想ホスティングいわゆるドメイン名ベースの仮想ホストとは、...

Idea で Tomcat のソースコードデバッグを開始し、デバッグのために Tomcat に入る方法

idea 開発ツールを使用してコードをデバッグする場合、Java Web プロジェクトで、Web コ...

Docker+Jenkinsを使用して自動的にビルドおよびデプロイする

この記事では、Docker+Jenkins の自動ビルドデプロイメントを紹介し、皆さんと共有します。...

MySQL 起動時に報告される ERROR:2002 の分析と解決方法

序文この記事は主にMySQL起動エラー2002の分析と解決方法を紹介しています。参考と勉強のために共...

MySql 8.0.11 のインストールと設定のチュートリアル

公式ウェブサイトアドレス: https://dev.mysql.com/downloads/mysq...