最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3?Reactive響應(yīng)式原理邏輯詳解

 更新時間:2022年07月03日 10:03:44   作者:??Liqiuyue????  
這篇文章主要介紹了Vue3?Reactive響應(yīng)式原理邏輯詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

前言

本篇文章主要講解vue響應(yīng)式原理的邏輯,也就是vue怎么從最開始一步步推導(dǎo)出響應(yīng)式的結(jié)構(gòu)框架。 先從頭構(gòu)建一個簡單函數(shù)推導(dǎo)出Vue3的Reactive原理,最后再進(jìn)行源碼的驗(yàn)證。

一、怎么實(shí)現(xiàn)變量變化

怎么實(shí)現(xiàn)變量變化,相關(guān)依賴的結(jié)果也跟著變化

 當(dāng)原本price=5變?yōu)?code>price=20后total應(yīng)該變?yōu)?code>40,但是實(shí)際total并不會改變。 解決辦法可以這樣,當(dāng)變量改變了,重新計(jì)算一次,那么結(jié)果就會改變?yōu)樽钚碌慕Y(jié)果。

如果需要重新計(jì)算,我們需要將total語句存儲為一個函數(shù),才能實(shí)現(xiàn)依賴的變量改變就進(jìn)行一次依賴項(xiàng)計(jì)算。這里就用effect表示函數(shù)名。

來,試一下:

 ??,實(shí)現(xiàn)了變量price改變,依賴變量price quantity的變量total也發(fā)生改變。

下一步,我們要解決的問題是:應(yīng)該怎么把effect存儲起來,讓代碼更加有通用性,而不是一直復(fù)寫effect,分離出其他的功能的函數(shù)各司其職,也就是大家常說的解耦。

二、怎么實(shí)現(xiàn)變量變化

怎么實(shí)現(xiàn)變量變化,變量改變后就取出effect執(zhí)行

用什么存儲effect呢?當(dāng)然是用Set,因?yàn)镾et會過濾出重復(fù)的元素,所以能夠保證存儲在Set中的函數(shù)不是重復(fù)的。 這里定義一個存儲effect依賴的變量為dep = new Set(),定義track函數(shù)表示存儲的過程。 定義trigger函數(shù)用以取出dep中相關(guān)的effect函數(shù)執(zhí)行(這里定義的函數(shù)與Vue3源碼同名同意義)。

  • effect: 會影響結(jié)果的函數(shù)(要實(shí)現(xiàn)響應(yīng)式的依賴語句)
  • track:保存所有的effect
  • trigger: 當(dāng)變量改變重新執(zhí)行代碼

 ??,解耦之后代碼結(jié)構(gòu)更清晰了。

下面需要解決的一個問題:一個object通常有多個屬性,比如product = { price: 5, quantity: 2 },在保存依賴時只創(chuàng)建了一個dep的集合,應(yīng)該給pricequantity都創(chuàng)建dep,因?yàn)?code>total的最終結(jié)果依賴這兩個屬性,其中任何一個改變都要觸發(fā)trigger函數(shù)。創(chuàng)建了兩個dep就需要一個容器將dep存儲起來。

三、將多個dep存儲在Map中

因?yàn)椴煌膶傩悦凶约簩?yīng)的dep,所以我們用Map結(jié)構(gòu)(鍵值對形式)來保存不同dep。

 ??,一個object的多個屬性依賴問題解決,更具有通用性了。

下一個問題是:不可能只有一個對象,多個對象又怎么辦?let product = { price: 5, quantity: 2 } let user = { firstName: "Joe", lastName: "Smith" },比如兩個對象的時候就需要進(jìn)一步修改上面的代碼了。

四、將多個object的depsMap繼續(xù)存儲起來

這里用WeakMap數(shù)據(jù)結(jié)構(gòu)去存儲多個需要響應(yīng)式的object的depsMap。WeakMap的基本使用和Map差不多,只不過WeakMap只接受對象為鍵值,而depsMap是一個Map結(jié)構(gòu)剛好(必須是)是對象類型。targetMap作為存儲多個depsMap的容器名。

??,到這里已經(jīng)基本實(shí)現(xiàn)了通用性的響應(yīng)式代碼了,但是還有最后一個問題就是:我們的代碼都需要手動執(zhí)行(自己添加trigger運(yùn)行),不能自動運(yùn)行。怎么讓它能夠自動檢測變量改變,然后自動修改結(jié)果呢?

五、核心

通過Reflect和Proxy解決自執(zhí)行問題

在JavaScript中,自動檢測變量不就是get、自動修改變量不就是set嗎?在Vue2.x版本中用ES5的Obeject.defineProperty()自帶的getter/setter去解決這個問題。ES6中Proxy也能解決這個問題,但是Proxy不兼任IE瀏覽器,當(dāng)時大家還討論過說不知道尤大怎么去考慮這個問題,現(xiàn)在問題的答案就是——不考慮。也就是根本不考慮IE兼不兼容????。

Proxy就是代理的意思,任何對真實(shí)數(shù)據(jù)的操作它都能攔截并且代理操作,也就是說Object上一些能實(shí)現(xiàn)的方法,Proxy也能實(shí)現(xiàn)。Proxy使用語法是new Proxy(target, hanler)handler是你想實(shí)現(xiàn)什么樣的代理功能配置。 而Reflect就更神奇了,它的作用是取代Object類上的一些方法讓Obeject類更純粹的代表一個類,不要附加太多方法在上面,比如a in obj表示判斷obj中是否有a,在Reflect中用Reflect.has(a)比較語義化的方式就可以代替之前的方法。

正是因?yàn)檫@樣,ProxyReflect就對應(yīng)上了,都有Object上的方法。

稍微封裝一下我們的函數(shù),名叫Reactive

 ??,至此,Vue3基本的響應(yīng)式原理就解析完了。

六、源碼解析(TypeScript)

 returncreateReactiveObject函數(shù),所以去看createReactiveObject

 前面的代碼都是判斷各種情況,我們就看最后幾行

const observed = new Proxy(
    target,
    collectionTypes.has(target.constructor) ? collectionHandlers : baseHandlers
  )

可以看到ProxyhandlercollectionHandlers或者 baseHandlers,繼續(xù)選擇一個看一看。

在 baseHandlers中可以看到導(dǎo)出了get/set/deleteProperty等屬性配置:

我們看一下set

 和我們之前的邏輯差不多,只不過真正實(shí)現(xiàn)就很復(fù)雜,因?yàn)橛泻芏鄰?fù)雜條件需要去處理。

其他的get等方法也一樣,做了很多條件判斷處理,完善了每一種會出現(xiàn)的情況。

到此這篇關(guān)于Vue3 Reactive響應(yīng)式原理邏輯詳解的文章就介紹到這了,更多相關(guān)Vue3 Reactive響應(yīng)式 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue-element-admin配置小結(jié)

    vue-element-admin配置小結(jié)

    本文主要介紹了vue-element-admin配置小結(jié),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vuejs 動態(tài)添加input框的實(shí)例講解

    vuejs 動態(tài)添加input框的實(shí)例講解

    今天小編就為大家分享一篇vuejs 動態(tài)添加input框的實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Vue2的路由和異步請求方式

    Vue2的路由和異步請求方式

    這篇文章主要介紹了Vue2的路由和異步請求方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 詳解用vue.js和laravel實(shí)現(xiàn)微信支付

    詳解用vue.js和laravel實(shí)現(xiàn)微信支付

    本篇文章主要介紹了用vue.js和laravel實(shí)現(xiàn)微信支付,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Vue中watch監(jiān)聽屬性新舊值相同的問題解決方案

    Vue中watch監(jiān)聽屬性新舊值相同的問題解決方案

    這篇文章主要給大家分享了Vue中watch監(jiān)聽屬性新舊值相同問題解決方案,如果有遇到相同問題的朋友,可以參考閱讀本文
    2023-08-08
  • vue2手機(jī)APP項(xiàng)目添加開屏廣告或者閃屏廣告

    vue2手機(jī)APP項(xiàng)目添加開屏廣告或者閃屏廣告

    這篇文章主要為大家詳細(xì)介紹了vue2手機(jī)APP項(xiàng)目添加開屏廣告或者閃屏廣告的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • 使用vue深度選擇器修改ElementUI組件內(nèi)樣式的示例代碼

    使用vue深度選擇器修改ElementUI組件內(nèi)樣式的示例代碼

    在帶有scoped屬性的style中書寫樣式時,無法作用影響到子組件中的樣式,此時我們會使用到deep深度選擇器,來解決此問題,我們在使用less預(yù)處理器,能正常使用,但是在scss預(yù)處理器中會報(bào)錯,下面通過本文介紹vue深度選擇器修改ElementUI組件內(nèi)樣式,需要的朋友可以參考下
    2022-12-12
  • vue3中nextTick()應(yīng)用實(shí)例詳解

    vue3中nextTick()應(yīng)用實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于vue3中nextTick()應(yīng)用的相關(guān)資料,nextTick()等待下一次DOM更新刷新的工具方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • vue如何通過ref調(diào)用router-view子組件的方法

    vue如何通過ref調(diào)用router-view子組件的方法

    這篇文章主要介紹了vue?通過ref調(diào)用router-view子組件的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-11-11
  • VUEJS實(shí)戰(zhàn)之利用laypage插件實(shí)現(xiàn)分頁(3)

    VUEJS實(shí)戰(zhàn)之利用laypage插件實(shí)現(xiàn)分頁(3)

    這篇文章主要為大家詳細(xì)介紹了VUEJS實(shí)戰(zhàn)之修復(fù)錯誤并且美化時間,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06

最新評論

南部县| 铜鼓县| 陇西县| 绥中县| 九龙城区| 忻城县| 钟祥市| 曲松县| 徐闻县| 乐业县| 苍山县| 同江市| 万全县| 海南省| 舟山市| 安塞县| 浙江省| 汨罗市| 融水| 灵山县| 鹤庆县| 五莲县| 长岛县| 阿拉善左旗| 喀什市| 化州市| 华亭县| 垦利县| 天峻县| 富锦市| 北辰区| 龙泉市| 冀州市| 三都| 邻水| 桐柏县| 孙吴县| 苏尼特右旗| 漳州市| 龙口市| 旺苍县|