VueJS設(shè)計與實現(xiàn)之淺響應(yīng)與深響應(yīng)詳解
正文
前文中講完了如何響應(yīng)Object,并處理了一些響應(yīng)中的問題,但是我們目前,包括之前實現(xiàn)的響應(yīng)式,其實只是淺響應(yīng)。
直接上代碼
const obj = {a:{b:1}} const reactive = (obj)=> new Proxy(obj,{ get(target,key,receiver){ /*省略其他邏輯*/ return Reflect.get(target,key,receiver) }, /*省略其他攔截*/ }) const data = reactive(obj)
問題就出現(xiàn)在Reflect.get(target, key, receiver)
這句代碼里,我們現(xiàn)在嘗試一下獲取data.a
,應(yīng)該返回的是{b:1}
,不是Proxy
,自然不會響應(yīng)什么。
所以對于這種嵌套對象,我們自然要去遞歸的把對象轉(zhuǎn)換為響應(yīng)式對象。
const reactive = (obj)=> new Proxy(obj,{ get(target,key,receiver){ /*省略其他邏輯*/ const res = Reflect.get(target,key,receiver) if(res && typeof res === 'object'){ return reactive(res) } return res }, /*省略其他攔截*/ })
這樣,當(dāng)內(nèi)部是嵌套對象的時候,我們遞歸把嵌套對象轉(zhuǎn)換為響應(yīng)式對象,這樣再按之前的追蹤依賴,觸發(fā)響應(yīng)去處理就好了。
當(dāng)時,深響應(yīng)和淺響應(yīng)都是有各自的使用條件的。比如我在完成第一個vue3.2項目有感中寫過,我就比較喜歡用shallowRef
,這就是一種淺響應(yīng)。
好了,話題收回來。我們之前封裝的那個reactive已經(jīng)變成一個深響應(yīng)了,我們現(xiàn)在就在封裝一層,去區(qū)分淺響應(yīng)和深響應(yīng)。我們通過一個新的參數(shù)deepify
去判斷淺響應(yīng)和深響應(yīng),然后深響應(yīng)的時候才去遞歸。
之所以再封裝了一層,是因為我們后續(xù)還要繼續(xù)擴展這個函數(shù)
const createReactive = (obj,deepify = true)=>new Proxy(obj,{ get(target,key,receiver){ /*省略其他邏輯*/ const res = Reflect.get(target,key,receiver) //深響應(yīng)式遞歸 if(deepify && res && typeof res === 'object'){ return reactive(res) } return res }, /*省略其他攔截*/ })
這樣子封裝之后,我們就有了2個函數(shù)reactive
,shallowReactive
const reactive = (obj)=>createReactive(obj) const shallowReactive = (obj)=>createReactive(obj,false)
大家使用的時候,其實需要看情況去選擇,淺響應(yīng)其實有時候比深響應(yīng)更方便。就比如我之前在那篇文章中舉得例子一樣。
以上就是VueJS設(shè)計與實現(xiàn)之淺響應(yīng)與深響應(yīng)詳解的詳細(xì)內(nèi)容,更多關(guān)于VueJS淺響應(yīng)深響應(yīng)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于element-ui封裝可搜索的懶加載tree組件的實現(xiàn)
這篇文章主要介紹了基于element-ui封裝可搜索的懶加載tree組件的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05vue2.0/3.0中provide和inject的用法示例
provide和inject是成對出現(xiàn)的,主要用于父組件向子孫組件傳遞數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于vue2.0/3.0中provide和inject用法的相關(guān)資料,需要的朋友可以參考下2021-09-09默認(rèn)瀏覽器設(shè)置及vue自動打開頁面的方法
今天小編就為大家分享一篇默認(rèn)瀏覽器設(shè)置及vue自動打開頁面的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09