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によって誤って削除されたファイルを回復する方法

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

推薦する

nginx と openssl で https を実装する方法

サーバーデータがSSL証明書を使用して暗号化および認証されていない場合、ユーザーのデータはプレーンテ...

Linux で MySQL パスワードを忘れた場合の解決策

問題は次のとおりです。mysql -uroot -p コマンドを入力しましたが、パスワードを忘れてし...

Windows Server 2008R2、2012、2016、2019 の違い

目次共通バージョンの紹介共通バージョンのダウンロードアドレスとインストール以下に簡単な違いを示します...

アイデア展開Tomcatサービス実装プロセス図

まずプロジェクトの成果物を構成するスタートアップ項目の設定 Tomcatサービスを作成する開始したい...

MySQLで更新可能なビューを作成する方法の詳細な説明

この記事では、例を使用して、MySQL で更新可能なビューを作成する方法について説明します。ご参考ま...

自動行折り返し機能付き CSS Flex レイアウトのサンプル コード

フレックス コンテナーを作成するには、要素に display: flex プロパティを追加するだけで...

MySqlエスケープの詳細な使用例

MySQL エスケープエスケープとは、エスケープ文字の本来の意味を意味します。エスケープ文字の目的は...

Dockerカスタムネットワーク実装

目次1. コンテナ相互接続を実現するためにネットワークをカスタマイズする2. ネットワーク接続1. ...

Linux で NFS のワンクリック展開を実装する方法

サーバー情報管理サーバー: m01 172.16.1.61サーバー: nfs01 172.16.1....

MySQL 8.0.13 で日付を 0000-00-00 00:00:00 に設定すると発生する問題を解決する

データベース操作を学び始めたばかりです。今日、データを保存していたところ、エラーが発生していることに...

Vueでeslintを使用する方法の詳細な説明

目次1. 説明2. 関連する依存パッケージをダウンロードする3. 設定ファイル .eslintrc....

Webフロントエンドベクターアイコンの使い方

序文フロントエンドページを書くとき、小さなアイコンなどの画像を使うことが多いです。画像を使うとコード...

react-color を使用してフロントエンドのカラーピッカーを実装する方法

背景次の図に示すように、 react-color を使用してフロントエンド インターフェースのカラー...

Linux システムで Vim を使用してリモート ファイルを読み書きするコマンドの詳細な説明

vim の動作モードを設定する (一時的) :set (モード情報) :set nu — 行番号を表...

momentJs を使用してカウントダウン コンポーネントを作成する (サンプル コード)

今日はvueとmomentで作ったカウントダウンを紹介したいと思います。具体的な内容は以下のとおりで...