手書きの 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 無料インストール設定方法

推薦する

素晴らしい CSS ナビゲーション バーの下線効果

中国初のカッター github.com/chokcocoまず、ここに画像があります。純粋な CSS ...

MySQL で中国語の文字をピンインでソートする簡単な例

名前を格納するフィールドが GBK 文字セットを使用している場合、GBK 内部コード自体がエンコード...

MySQL でパーセンテージと最初の数パーセントを表示する方法

目次必要とする実装コードデータベース数日前、友人からこれを書くのを手伝ってほしいと頼まれました。ただ...

MySQLデータベースインデックスの左端一致原則

目次1. 共同インデックスの説明2. ac はインデックスを使用できますか? 3. 考える4. 最左...

DIV共通属性コレクション

1. 物件リストコードをコピーコードは次のとおりです。色: #999999 テキスト色フォントファミ...

VMware 構成 VMnet8 ネットワーク方法の手順

目次1. はじめに2. 設定手順1. はじめに1. NAT モード (VMnet8) は、仮想マシン...

MySQLはカバーインデックスを使用してテーブルリターンを回避し、クエリを最適化します。

序文カバーリング インデックスについて説明する前に、まずそのデータ構造である B+ ツリーを理解する...

Windows ベースの MySQL 8.0.12 のインストール

このチュートリアルは Windows システムにのみ適用されます。インストールしたがまだインストール...

React における同期および非同期 setState の問題のコード分析

React は Facebook の社内プロジェクトとして始まりました。 React の出現は革命的...

Linux の traceroute コマンドの使用方法の詳細な説明

Traceroute を使用すると、情報がコンピュータからインターネットの反対側のホストまでたどるパ...

VUE ユニアプリの基本コンポーネントの簡単な紹介

1. スクロールビュー垂直スクロールを使用する場合は、固定の高さを指定して CSS で高さを設定する...

Vue 計算プロパティ実装トランスクリプト

この記事では、Vueの計算プロパティ実装レポートカードを参考に共有します。具体的な内容は次のとおりで...

Windows システムでの MySQL 8.0.21 インストール チュートリアル (図とテキスト)

インストールの提案: インストールには .exe を使用せず、圧縮パッケージを使用してください。これ...

JavaScript でネットワーク速度をテストする方法

目次序文ネットワーク速度のフロントエンド判定原理のまとめ1. img を読み込むか Ajax リクエ...