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

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

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進値の比較表示で簡単に検索できます

推薦する

Deepin Linuxでカーネルを手動でアップグレードする方法

deepinとUbuntuどちらもdebianをベースにしたディストリビューションであり、ここではU...

MySQLでユーザー認証情報を表示する具体的な方法

具体的な方法: 1. コマンドプロンプトを開く2. mysql -u root -pコマンドを入力し...

ページのレンダリング時間を短縮してページの実行速度を速めます

ブラウザでのページのレンダリング時間をできるだけ短縮するにはどうすればよいでしょうか? この記事は、...

CSSトランジションは高さを変更することで要素を拡大したり縮小したりします。

一般的な開発ニーズとして、要素の一部を必要になるまで折りたたんでおきたいことが挙げられます。 Boo...

MySQL 5.7.18 zip バージョンのインストール チュートリアル

MySQL の mysql 5.7.18 zip バージョンは、クリックして次のステップをクリックし...

CentOS6 アップグレード glibc 操作手順

目次背景glibc 2.14をコンパイルするソフトリンクを変更するやっと背景テスト環境には Cent...

JavaScript Alert関数の実行順序の詳細な説明

目次質問分析する解決するAlert() 関数を置き換えるsetTimeOut関数まとめ質問数日前、J...

MySQL デュアルマシン ホットスタンバイ実装ソリューション [テスト可能]

目次1. コンセプト2. 環境の説明3. マスタースレーブホットスタンバイ実装1. コンセプト1. ...

フォント宝庫 50 種類の素晴らしい無料英語フォントリソース パート 1

デザイナーは独自のフォント ライブラリを持っているため、プロジェクトの設計時にすぐに使用できます。今...

Linux システムで時間を取得して使用する方法

Linux システム時間には 2 種類あります。 (1)暦上の時刻。値は、指定された時刻、1970 ...

JavaScript によるデータ視覚化: ECharts マップの作成

目次概要予防1. 使用方法2. 実装手順予備実装コード効果: Geo共通設定上記の構成を追加した後の...

VueはExcelテーブルをインポートし、インポートに失敗したデータを自動的にダウンロードします。

次のような要件があります: インポート ボタン。ボタンをクリックして Excel テーブルをインポー...

UbuntuはSSHサービスのリモートログイン操作を開始します

ssh-secure シェルは、安全なリモート ログインを提供します。組み込みシステムを開発し、Li...

Node8 における AsyncHooks 非同期ライフサイクル

Async Hooks は Node8 の新機能です。NodeJs の非同期リソースのライフサイクル...

Vue 値転送の 12 の方法の概要

目次1. 父から息子へ2. 息子から父へ3. ブラザーコンポーネント通信(バス) 4. ref/re...