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

推薦する

ランダムロールコールテーブルを実装するためのネイティブJavaScript

この記事では、JavaScriptのランダムロールコールテーブルの具体的なコードを参考までに紹介しま...

uniapp プロジェクトの最適化方法と提案

目次1. 複雑なページデータ領域をコンポーネントにカプセル化する2. 大きな画像の使用を避ける3. ...

VUE ユニアプリカスタムコンポーネントについての簡単な説明

1. 親コンポーネントはpropsを通じて子コンポーネントにデータを渡すことができる2. 子コンポー...

Ubuntu16.04はphp5.6ウェブサーバー環境を構築します

Ubuntu 16.04 はデフォルトで PHP7.0 環境をインストールしますが、PHP7 は一部...

JavaScript を使用してカルーセル効果を実装する

この記事では、カルーセルマップの特殊効果を実現するためのJavaScriptの具体的なコードを参考ま...

Docker-compose を使用して GitLab をデプロイする方法

Docker-compose は GitLab をデプロイします1. Dockerをインストールする...

高度な JavaScript フロントエンド開発でよく使用されるいくつかの API の例の詳細な説明

目次ミューテーションオブザーバーAPI特徴インターセクションオブザーバーAPI例えば画像の遅延読み込...

HTMLを使用して、IPを制限する投票ウェブサイトの不正行為スキームを実装する

これは、IP アドレスが制限されている投票 Web サイトの不正行為の手口です。この方法は、投票 W...

CocosCreator 一般的なフレームワーク設計リソース管理

目次Cocos Creator のリソース管理に関する問題リソースの依存関係リソースの使用レスローダ...

WeChatアプレットはシンプルな計算機を実装する

参考までにWeChatアプレットで書かれた簡単な計算機です。具体的な内容は次のとおりです。 jisa...

MySQL で単一のデータベースまたはテーブルを復元する方法と、起こりうる落とし穴

序文:最も一般的に使用される MySQL 論理バックアップ ツールは mysqldump です。通常...

dubbo での Zookeeper リクエストのタイムアウト問題: mysql8.0.15 に接続する mybatis+spring の構成

ここ2日間Javaを復習するつもりなので、練習にdubboを使ってショッピングモールプロジェクトを書...

JavaScriptのアンチシェイクとスロットリングとは

目次1. 関数デバウンス1. 画像安定化とは何ですか? 2. 関数のスロットリング2.1 タイマーの...

Alibaba Cloud Nginx はドメイン名アクセス プロジェクトを実装するために https を設定します (グラフィック チュートリアル)

ステップ1: サードパーティの信頼できるSSL証明書に署名するAlibaba Cloud で直接、無...

CentOS7 構成 Alibaba Cloud yum ソースメソッドコード

Centos yumフォルダを開くコマンドcd /etc/yum.repos.d/を入力します。 w...