手書きの Vue2.0 データハイジャックの例

手書きの Vue2.0 データハイジャックの例

1: webpackをビルドする

webpack 構成をビルドするだけです。新しいフォルダーを作成して初期化します。次に、webpack の設定ファイルである新しい webpack.config.js ファイルを作成します。いくつかの簡単な依存関係をインストールします。

npm で webpack をインストールします。webpack-cli webpack-dev-server -D

エクスポート ファイルとエントリ ファイルと同じディレクトリに public/index.html ファイルと src/index.js ファイルを作成します。

webpack.config.js ファイルで webpack を構成するだけです。

定数パス = require('path');
HtmlWebpackPlugin は 'html-webpack-plugin' を必要とします。
モジュール.エクスポート = {
 エントリ: './src/index.js',
 出力: {
  ファイル名: 'bundle.js',
  パス: path.resolve(__dirname, 'dist')
 },
 解決する: { 
  モジュール:
  path.resolve(__dirname, '')、path.resolve(__dirname, 'node_modules')  
  ] 
 },
 プラグイン: [  
  新しいHtmlWebpackプラグイン({   
   テンプレート: path.resolve(__dirname, 'public/index.html')  
  }) 
 ]
}

さて、webpack を設定したら、トピックを開始できます。

2. データハイジャック

v2 では、vue は new Vue(el, options) を通じてインスタンス化されます。新しい vue ファイルを作成し、データハイジャック方法を vue に統合する必要があります。

データハイジャックのエントリファイルとして新しい vue/index.js を作成します。

'./init.js' から {initState} をインポートします。

関数 Vue (オプション) {
 this._init(options); // データの初期化}
Vue.prototype._init = 関数 (オプション) {
 var vm = options; // インスタンスを保存 vm.$options = options; // インスタンスをマウント initState(vm); // インスタンスの初期化 }

インスタンスを初期化するための新しい init.js ファイルを作成します。

初期化中にいくつかの問題に注意してください。

1. 計算、監視、データは別々に処理する必要があります。

2. ユーザー定義データを直接変更しないでください。

3. データを関数として正式に指定するのは、コンポーネントが独自のスコープを持ち、汚染されないことを保証するためです。データ関数への直接アクセスは不可能であり、自動実行が必要です。データはオブジェクトになることもできる(この状況を考慮する必要がある)

4. このデータ取得方法は vm._data.xxx 経由ですが、Vue ではデータの取得にデータは必要ないため、ここでデータをインターセプトして書き換える必要があります。

5. 内部参照型は再帰を必要とする

関数 initState (vm) {
 var options = vm.$options; // オプションを取得
 if (オプション.データ) {
  initData(vm); // ここで computed と watch を初期化する必要があるため、データを初期化します};

関数 initData (vm) {
 var data = vm.$options.data; // データを再割り当てします。ユーザー定義のデータは変更しません。
 data = vm._data = typeof data === 'function' ? data.call(vm) : data || {};
 for (var key in data) {
  proxyData(vm, '_data', key); // データの値を再割り当てします};
 observe(vm._data); //内部データを観察する}

プロキシ レイヤーとして新しい proxy.js を作成します。

関数 proxyData(vm, ターゲット, キー) { 
 Object.defineProperty(vm, キー, {  
   得る () {   
   // インターセプションはここで行われます: vm.xxx => vm._data.xxx   
   vm[ターゲット][キー]を返します。  
  },  
  set(新しい値) {   
   // vm.xxx = yyy ===> vm._data.title = yyy   
   vm[ターゲット][キー] = 新しい値;  
  } 
 }) 
}
デフォルトの proxyData をエクスポートします。

アクセスの問題が解決されたので、データの内部要素を再帰する必要があります。 (vm._data) を監視します。

新しい observe.js を作成します。

関数 observe(データ) {
 if (typeof data !== 'object' || data = null) return;
 return new Observer(data); // アプリケーション型の場合は、オブザーバーを直接追加します} 

新しいオブザーバーを作成する: observer.js

関数 Observer(データ) {
 Array.isArray(データ)の場合{
  // 配列データを処理します。_proto_ = arrMethods; 
 }
 それ以外 {
  //オブジェクトを処理 this.walks(data);
 }
}
Observer.prototype.walks = 関数 (データ) {
 let keys = Object.keys(data); // data の下のすべてのキーを取得します。これは依然として配列です。 for (var i = 0 ; i < keys.length ; i++) {  
  var キー = keys[i];  
  var 値 = データ[キー];  
  defineReactiveData(data, key, value); // それぞれレスポンシブデータを再生成します }}

オブジェクトやその他のレスポンシブな処理のために新しいreactive.jsを作成する

関数defineReactiveData(データ、キー、値){ 
 observe(value); // 次に子要素に再帰的に適用します。 
 Object.defineProperty(データ、キー、{  
  得る() {   
   戻り値;  
  },  
  (新しい値) を設定する {   
   (newValue === value) の場合、戻り値:   
   value = newValue; // 変更をトリガーする } 
 }
 )
};

さて、オブジェクトデータのハイジャックはここで処理され、残りは配列を処理する必要があります

V2では、プロトタイプ上の7つのメソッドが書き換えられ、データハイジャックが実現されています。

ハイジャック配列:

新しい Array.js ファイルを作成します。

'./config.js' から {ARR_METHODS} をインポートします。  
 // 7 つの配列メソッドのコレクション import observeArr from './observeArr.js';
var originArrMethods = Array.prototype, 
arrMethods = Object.create(originArrMethods); 
ARR_METHODS.map(関数(m) { 
 arrMethods[m] = 関数(){  
  var args = Array.prototype.slice.call(arguments); // クラス配列を配列に変換 var rt = originArrMethods[m].apply(this, args);  
  var newArr;  
  スイッチ(m){   
   ケース 'プッシュ':   
   'ushift'の場合:     
    新しい引数 = 引数;   
   ケース 'スプライス':    
    newArr = args.slice(2);    
    壊す;   
   デフォルト:     
    壊す; };  
  新しいArrと観察Arr(新しいArr);  
  rt を返します。 
  } 
}); 
 エクスポート { arrMethods }

observeArr(newArr): 配列はネストされる可能性もあるため、データを監視する必要があります。

「./observe」から observe をインポートします。
関数 observeArr (arr) { 
 (var i = 0 ; i < arr.length ; i++) の場合 {  
  observe(arr[i]); // 観察に戻ります。 
 }
}
デフォルトの observeArr をエクスポートします。

3: まとめ

基本的なプロセスは次のようになりますが、object.defineProperty でデータを取得して設定するだけという単純なものではありません。主なプロセスを要約します。

(1):初期化中:インスタンスを保存し、インスタンスをマウントします。データは initState メソッドを通じて初期化されます。ここでは主にデータですが、処理が必要な計算値や監視値もあります。

(2): initData()を呼び出し、データを再割り当てしてからデータを実行し、ユーザーのデータ属性の取得方法をthis.xxxに変更してobserve(data)を実行します。

(3): 観察(データ)の際には、データを判断する必要があります。参照型の場合は、オブザーバーを追加する必要があります。同時に、オブザーバーはデータが配列かオブジェクトかを判断します。オブジェクトは直接object.definePropertyを再トリガーし、内部部分を再観察します。配列の場合は、7つの配列メソッドを直接使用し、配列の内部を観察し続けます。

上記は手書きのVue2.0データハイジャックの例の詳細です。手書きのVueデータハイジャックの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Vue2.0 実践基礎編 (1)
  • Vue2.0 でページキャッシュと非キャッシュを実装する方法
  • Vue2.0はhttpインターフェース、コンポーネント開発、ルーティング構成メソッドからデータを取得します
  • Vue2.0+SVGは音楽再生の円形プログレスバーコンポーネントを実現します
  • Vue2.0はシンプルなページングとジャンプ効果を実装します
  • Vue 2.0 の基礎を詳しく解説

<<:  Linuxでブーストライブラリをインストールするための完全な手順

>>:  mysql 5.7.18 winx64 無料インストール設定方法

推薦する

W3C標準に準拠したHTML標準で注意すべき点を詳細に解説

XML/HTML コードコンテンツをクリップボードにコピー<!DOCTYPE html PUB...

CSS 評価効果の星の例

何?何のスターコートですか?さて、もっとわかりやすくするために写真を見てみましょう。 よく見ると、パ...

Maven モードで Tomcat ソースコードを実行する方法

序文最近、Tomcat の起動プロセスを分析していました。Tomcat のソース コードはアイデア次...

MySQL の null 制約のケースの説明

目次テーブルを作成するときにNOT NULL制約を設定するテーブルを変更するときに非NULL制約を追...

OEL7.6 ソースコードから MYSQL5.7 をインストールするチュートリアル

まず、公式サイト https://dev.mysql.com/downloads/mysql/5.7...

DockerでKafkaをデプロイする方法

目次1. Dockerをビルドする2. コンテナに入る3. 設定ファイルを変更する4. Kafkaを...

Linux の MySQL でリモート接続を承認する方法

注意: 他のマシン (IP) は、承認なしではクライアント経由で MySQL データベースに接続でき...

MySQLの共通関数を使用してJSONを処理する方法

公式ドキュメント: JSON 関数名前説明JSON_APPEND() JSONドキュメントにデータを...

Linux 上で Python3.6 をコンパイルしてインストールするための詳細なチュートリアル

1. まず、公式ウェブサイト https://www.python.org/downloads/so...

HTMLの基礎を徹底解説(第1部)

1. WEBを理解するWeb ページは主にテキスト、画像、ハイパーリンクなどの要素で構成されていま...

Linux で at および cron スケジュールタスクをカスタマイズする方法

Linux システムには 2 種類のスケジュールされたタスクがあります。1 つは 1 回だけ実行され...

MySQLの累積集計原理と使用例の分析

この記事では、例を使用して、MySQL 累積集計の原理と使用方法を説明します。ご参考までに、詳細は以...

Linux で 1 回限りのスケジュールされたタスクを実行するための at コマンドの使用に関する詳細な説明

目次序文1. 一度限りの計画タスクの紹介2. コマンド3. 1回限りのスケジュールタスクを作成する4...

mysql バックアップ スクリプトを作成し、7 日間保存します。

スクリプトの要件: MySQL データベースを毎日バックアップし、スクリプトを 7 日間保存します。...