Vue3のレスポンシブ原則の詳細な説明

Vue3のレスポンシブ原則の詳細な説明

Vue2 レスポンシブ原則のレビュー

// 1. オブジェクトの応答性: 各キーを走査し、ゲッターとセッターを定義する
// 2. 配列の応答性: 配列のプロトタイプメソッドをオーバーライドし、追加の通知ロジックを追加します。const originalProto = Array.prototype
const arrayProto = Object.create(originalProto)
  ;['push'、'pop'、'shift'、'unshift'、'splice'、'reverse'、'sort'].forEach(
    メソッド => {
      arrayProto[メソッド] = 関数 () {
        originalProto[メソッド].apply(this, 引数)
        通知更新()
      }
    }
  )
関数 observe(obj) {
  if (typeof obj !== 'object' || obj == null) {
    戻る
  }
  // 配列型の判定を追加し、配列の場合はそのプロトタイプを上書きします if (Array.isArray(obj)) {
    Object.setPrototypeOf(obj, 配列Proto)
  } それ以外 {
    定数キー = Object.keys(obj)
    (i = 0 とします; i < keys.length; i++) {
      定数キー = キー[i]
      defineReactive(obj, キー, obj[キー])
    }
  }
}
関数defineReactive(オブジェクト、キー、値){
  observe(val) // ネストされたオブジェクトの問題を解く Object.defineProperty(obj, key, {
    得る () {
      戻り値
    },
    設定(新しい値) {
      (newVal !== val) の場合 {
        observe(newVal) // 新しい値はオブジェクトです val = newVal
        通知更新()
      }
    }
  })
}
関数notifyUpdate(){
  console.log('ページが更新されました!')
}

vue2 の応答性の欠点:
応答性プロセスには再帰的なトラバーサルが必要であり、大量のリソースを消費します。新しく追加または削除された属性は監視できません。配列の応答性には追加の実装が必要です。
マップ、セット、クラスなどはレスポンシブに変更できず、構文も制限されています。

Vue3 レスポンシブ原則の分析

Vue3 はこれらの問題を解決するために ES6 の Proxy 機能を使用します。

関数リアクティブ(obj) {
  if (typeof obj !== 'object' && obj != null) {
    オブジェクトを返す
  }
  // プロキシはオブジェクトの外側のレイヤーにインターセプションを追加することと同じです // http://es6.ruanyifeng.com/#docs/proxy
  const 観察 = 新しいプロキシ(obj, {
    get (ターゲット、キー、受信者) {
      // Reflect は、より標準化され、使いやすい、オブジェクトに対するデフォルトの操作を実行するために使用されます。 // Proxy メソッドと Object メソッドには、対応する Reflect メソッドがあります。 // http://es6.ruanyifeng.com/#docs/reflect
      const res = Reflect.get(ターゲット、キー、レシーバー)
      console.log(`${key}:${res} を取得`)
      戻り値
    },
    (ターゲット、キー、値、受信者) を設定します {
      const res = Reflect.set(ターゲット、キー、値、レシーバー)
      console.log(`${key}:${value} を設定`)
      戻り値
    },
    deleteProperty (ターゲット、キー) {
      const res = Reflect.deleteProperty(ターゲット、キー)
      console.log(`${key}:${res} を削除`)
      戻り値
    }
  })
  復帰が観察された
}
//コードテスト const state = reactive({
  foo: 'foo',
  バー: { a: 1 }
})
// 1. state.foo を取得する // ok
// 2. 既存の属性を設定する state.foo = 'fooooooo' // ok
// 3. 存在しない属性を設定する state.dong = 'dong' // ok
// 4. 属性を削除する delete state.dong // ok

ネストされたオブジェクトの応答性

テスト: ネストされたオブジェクトが応答しない

// ネストされたオブジェクトのプロパティを設定する react.bar.a = 10 // no ok

オブジェクト型再帰を追加

      // ヘルパーメソッドを抽出 const isObject = val => val !== null && typeof val === 'object'
      関数リアクティブ(obj) {
        //オブジェクトかどうかを判定する if (!isObject(obj)) {
          オブジェクトを返す
        }
        const 観測 = 新しいプロキシ(obj, {
          get (ターゲット、キー、受信者) {
            // ...
            // オブジェクトの場合は再帰が必要です return isObject(res) ? reactive(res) : res
          },
          //...
        }

重複エージェントを避ける

繰り返し使用する薬剤、例えば

reactive(data) // プロキシされた純粋なオブジェクト
reactive(react) // プロキシオブジェクト

解決策: 以前のプロキシ結果をキャッシュし、取得時に直接使用します。

const toProxy = new WeakMap() // obj:observedと同じ
      const toRaw = new WeakMap() // 観測されたものと同じ:obj
      関数リアクティブ(obj) {
        //...
        // 重複プロキシを避けるためにキャッシュを検索する if (toProxy.has(obj)) {
          Proxy.get(obj) に戻ります
        }
        toRaw.has(obj) の場合 {
          オブジェクトを返す
        }
        const 観察 = 新しい Proxy(...)
        // プロキシの結果をキャッシュする toProxy.set(obj, observe)
        toRaw.set(観測値、オブジェクト)
        復帰が観察された
      }
      // テスト効果 console.log(reactive(data) === state)
      console.log(リアクティブ(状態) === 状態)

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • Vueにおけるv-modelと応答性の実装原理の分析
  • Vue の応答性原則の詳細な例
  • Vue3.0 レスポンシブ機能の原理の詳細
  • Vueのレスポンシブシステムの原理の詳細な説明
  • VUE 応答性原理の詳細な説明
  • VUE レスポンシブ原則の実装の詳細な説明

<<:  Linux環境でrmによって誤って削除されたファイルを回復する方法

>>:  表内のコンテンツオーバーフローのレイアウト方法について

推薦する

Docker Swarm 外部検証ロードバランシングが機能しない場合の解決策

問題の説明Centos7 をローカルにインストールして 3 つの仮想マシンを作成し、Swarm クラ...

Vueはアップロードコンポーネントを実装します

目次1. はじめに2. アイデアファイルをアップロードする2つの方法3. ライフサイクル4. コード...

Zabbix で監視項目と集約されたグラフを設定するためのサンプルコード

1. ローカルマシンを監視するためにZabbixエージェントをインストールするエージェントソフトウェ...

ウェブサイトのコードブロックのpreタグにコピーコードボタンコードを追加します

他のよりプロフェッショナルなブログ システムを参照すると、コード ブロックにコードのコピー ボタンが...

HTML ドラッグ アンド ドロップ機能の実装コード

Vueベースこの機能の核となるアイデアは、JavaScript コードを通じてページ上のノードの左余...

jsを使用してシンプルな虫眼鏡効果を実現します

この記事では、簡単な虫眼鏡効果を実現するためのjsの具体的なコードを参考までに共有します。具体的な内...

dockerでマウントされたディレクトリが読み書きできない問題を解決する

次のコマンドを使用してコンテナを作成し、ローカルの /home/dock/Downloads ディレ...

ウェブデザインにおけるインタラクション: ページングの問題に関する簡単な説明

機能: 前のページまたは次のページにジャンプします。要素: ページングの基本要素は、前のページ + ...

Kylin 4.0.2 (Ubuntu) でブート パーティションを拡張するプロセスの紹介

目次序文1. 新しいパーティションを準備する2. ブートパーティションをコピーする3. fstabフ...

ラベルとボタンを削除し、背景画像の点線/影を追加すると完璧な解決策になります

ユーザーが登録すると、ラベルをクリックして確認コードを変更します。クリックするとラベルに影の部分がで...

docker で golang イメージに基づいて ssh サービスを構築する方法

以下は、docker の golang イメージに基づいて ssh サービスを構築するためのコードで...

vue-router からのフロントエンドルーティングの 2 つの実装

目次モードパラメータハッシュ履歴ハッシュ履歴.push()ハッシュ履歴.replace()アドレスバ...

MySQL DML言語操作例

追加説明、外部キー: 外部キーを使用しないでください。すべての外部キーの概念はアプリケーション層で解...

CocosCreatorメッセージ配信メカニズムの詳細な説明

概要この記事は、ゲームビジネスアーキテクチャに関連するコンテンツの紹介から始まります。ゲームビジネス...

ウェブページ内でウェブテーブルやdivレイヤーが引き伸ばされる問題の解決策

<br />Web ページをデザインするときには、いつも不快なことに遭遇します。最も一般...