この記事は、Vue を学習し、Vue の応答性の原則を深く理解するのに役立ちます。お役に立てば幸いです。
この記事は、レスポンシブ構文シュガーの譲渡を記念します
早速、本題に入りましょう。簡単な例を示します:
let a=3 let b=a*10 console.log(b)//30 a=4 console.log(b)//40
現時点では b=4*10 が必要ですが、#var## の前に ## を追加したとしても、これは明らかに不可能です。 # 変数のプロモーション
のみが行われ、指定した値はプロモーションされません。 現時点では、応答性の役割が反映されています。
import { reactive } from 'vue' let state = reactive({ a: 3 }) let b = computed(() => state.a * 10) console.log(b.value) // 30 state.a = 4 console.log(b.value) // 40
単純な
応答性 API のみが、変更を追跡する効果を実現できます。 [関連する推奨事項: vuejs ビデオ チュートリアル
、Web フロントエンド開発 ]
は本質的に、データの依存関係を追跡する依存関係グラフを作成することによる パブリッシュ/サブスクライブ モデル
です。依存関係グラフは、どのデータがどのデータに依存するかを説明するグラフです。データが変更されると、Vue 3 の
システムがビューの更新を自動的にトリガーします。これは、依存関係グラフ内のデータの変更を追跡し、それをビューの更新に関連付けることによってこれを実現するためです。ここでは、簡単な例として、Youda が Vue Master でデモしたコードをリストします。
class Dep{ constructor(value){ this.subscribers=new Set() this._value=value } get value(){ this.depend() return this._value } set value(newValue){ this._value=newValue this.notify() } depend(){ if(activeEffect){ this.subscribers.add(activeEffect) } } notify(){ this.subscribers.forEach(effect=>{ effect() }) } }
このコードを分析してみましょう:
subscribe
変数の値が変更されると、すべてのサブスクライバーに更新するように自動的に通知できます- 属性を購読者リストとして定義し、すべての購読者情報を保存します
depend- 関数は依存関係を管理するために使用されます。つまり、サブスクライバが依存する変数
notify- 関数が通知として使用されます。この変数の値はすべてのサブスクライバに対して変更されました
Vue2 の Object.defineProperty
によって実装されていましたが、Vue3 では Proxy
に切り替えられました。その理由を実際のコードと組み合わせて見てみましょう。まず、 Vue2 がどのように実装されているかを見てください: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">function reactive(raw){
Object.keys(raw).forEach(ket=>{
const dep=new Dep()
let value=raw[key]
Object.definProperty(raw,key,{
get(){
dep.depend()
return value
},
//当属性发生
set(newValue){
value=newValue
dep.notify()
}
})
})
//这时候返回的原始对象已经具有响应性
return raw
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
このような単純なリアクティブ API が実装されています
しかし、ここでの欠点は明らかです:
Vue 2.x では、渡されるオブジェクトは直接Vue.observable によって変更されました。Vue3 では、
応答性の高いプロキシを返しますが、ソース オブジェクトを直接変更しても応答しません。これにより、次のような問題が発生します。 :
オブジェクトのプロパティをProxy追加または削除する場合、Vue は初期化時にプロパティのゲッター/セッター変換を実行するため、Vue2 の応答性を検出できません。インスタンスの場合、プロパティは
しか選択できませんでしたが、 ES6 版では- data
arrayに存在する必要があります。オブジェクトに存在する場合にのみ、Vue はそれを応答型に変換できます。
サブスクリプトと長さ
の変更を検出できません- Object.definProperty
もちろん、これは歴史的な制限です。当時、ES5 は
が増えていますが、この時点で Vue の応答式がバージョンアップされました Vue3 の Proxy
でリアクティビティをトリガーし、コードの見栄えを良くします。はじめに
包括的な配列変更検出、Vue2 の無効な境界条件を排除します。 Vue3 で書かれたレスポンシブ コード。開発がより便利になります
- 実際のコードがどのようなものかを見てみましょう:
レスポンシブな方法は オブジェクトの依存関係を収集const reactiveHandles={ get(target,key,receiver){ const dep=getDep(target,key) dep.depend() return Reflect.get(target,key,receiver) }, set(target,key,value,receiver){ const dep=getDep(target,key) const result=Reflect.set(target,key,value,receiver) dep.notify() return result } }ログイン後にコピーVue3 の応答性の本質
ref
公式ドキュメントに次のような文があります: reactive のさまざまな制限() は、最終的には JavaScript が機能できないためです。すべての値の型に対する「参照」メカニズムと、リアクティブの制限は次のとおりです。
は、配列などの監視可能なデータ構造のみを処理できます。およびオブジェクト、およびプリミティブ データ型などの観察できないデータ構造は監視できません
#データが配置されているコンポーネントで定義されたデータのみを処理でき、グローバル変数は処理できませんのために生まれ、リアクティブの欠点を補っています。単純な単一の変数値に適しています(ただし、実際の開発では、ほとんどの場合、単なる参照です。はははは)基本データ型
- #そして今回はそれが必要です
- ref
がここにあり、ref は
ところで、レスポンシブ構文シュガーの提案がキャンセルされたのは残念です
(学習ビデオ共有: vuejs 入門チュートリアル 、基本プログラミング ビデオ )
以上がVueの反応性の原理を詳しく解説した記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。