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('ページが更新されました!') }
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 }, //... } 重複エージェントを避ける繰り返し使用する薬剤、例えば
解決策: 以前のプロキシ結果をキャッシュし、取得時に直接使用します。 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 のその他のコンテンツにも注目していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Linux環境でrmによって誤って削除されたファイルを回復する方法
>>: 表内のコンテンツオーバーフローのレイアウト方法について
今日は、サンダーファイタータイピングゲームを実装します。ゲームプレイは非常に簡単です。それぞれの「敵...
この記事では、参考までに、簡単な計算機機能を実現するためのVueの具体的なコードを紹介します。具体的...
目次ブラウザ同一生成元ポリシー1. VUEフロントエンド構成プロキシはクロスドメインの問題を解決しま...
一般的に、マウスは上向きの斜め矢印として表示され、テキストの上に移動すると垂直線になり、ハイパーリン...
いわゆる才能(左脳と右脳)つまり、芸術的な才能があるかどうかは、人間の左脳と右脳の分業によって主に決...
前回のエピソードレビュー:昨日は、ページがさまざまなデバイス サイズにどのように対応するかについて説...
CSSスタイルとHTMLタグ要素を使用するさまざまな HTML タグに点線の境界線を追加するために、...
1. Linuxに対応するRPMパッケージをダウンロードする5.6 より前のバージョンhttp://...
in() の ID の順序に従った Mysql クエリ結果の順序の詳細な説明コード例: <se...
背景AWS EC2 を使用するプロジェクトサービスがあります。セキュリティとパフォーマンスを考慮して...
序文: Vue3 がリリースされてからかなり経ちますが、最近、会社のプロジェクトでVue3 + Ty...
Canvas は HTML5 の新しいタグです。js を使用して Canvas 描画 API を操作...
目次概要達成方法具体的な実装評価関数の終了を決定する生成関数の範囲変換関数マップフィルター割り込み機...
上の境界線のみを表示する <table frame=above>下の境界線のみを表示する...
Vue でタブ切り替えを実装する 3 つの方法1. v-showはコンテンツの切り替えを制御します1...