1. デップ実際、これは依存関係の収集用のコンテナーです。depend クラス 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);
クラスウォッチャー{ /** * @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. プロセスを要約する
シンプルなデータレスポンスシステムの実装に関するこの記事はこれで終わりです。より関連性の高いデータレスポンスシステムコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: 一般的な Dockerfile コマンドの使用方法の紹介
>>: 色の16進数カラーコード表表示と16進値の比較表示で簡単に検索できます
MySQLはインストール版と無料インストール版に分かれていますインストール版の拡張子はmsi、無料イ...
I. はじめにDockerテクノロジーは現在非常に人気があります。コンテナを介してプロジェクト環境を...
目次序文1. es6の前にオブジェクトを作成する2. es6 後のクラス宣言3. クラスの継承4. ...
必要Zabbix で DingTalk アラームを設定する方法は、Prometheus で Ding...
この記事では、MySQL が 2 つのテーブルを比較して、異なるデータがあるかどうかを確認する方法を...
序文数日前、偶然、コーナーの四角形が欠落している機能に遭遇しました。最初に頭に浮かんだのは、必要な場...
1. 基本的な文法コードをコピーコードは次のとおりです。埋め込み src=url注: 埋め込みはさま...
今日のタスク1. Linuxディストリビューションの選択2.vmwareが仮想マシン(centos)...
1. システム環境[root@localhost ホーム]# cat /etc/redhat-re...
まずデータ テーブルを作成しましょう。 使用テスト; テーブル「従業員」を作成します( emp_no...
HTML ページでは、div 内のコンテンツが制限を超えた後に自動的にスクロール バーを表示する必要...
圧縮アップロード画像、スクラッチカード、ポスター作成、チャートプラグインなど、フロントエンド開発にお...
目次序文Viteプロジェクトを作成する改修プロジェクトディレクトリの規則その他の構成序文毎日鳩、火ば...
CSS 3 アニメーションの例 - タブの背景切り替えの動的効果、具体的なコードは次のとおりです。 ...
MySQL操作情報のクエリ show status -- すべての MySQL 操作情報を表示します...