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

Vue.js響應(yīng)式數(shù)據(jù)的簡(jiǎn)單實(shí)現(xiàn)方法(一看就會(huì))

 更新時(shí)間:2022年03月01日 10:26:58   作者:將煥  
Vue最巧妙的特性之一是其響應(yīng)式系統(tǒng),下面這篇文章主要給大家介紹了關(guān)于Vue.js響應(yīng)式數(shù)據(jù)的簡(jiǎn)單實(shí)現(xiàn)方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

引言

在Vue.js之中,Vue會(huì)自動(dòng)跟蹤JavaScript狀態(tài)變化并在狀態(tài)發(fā)生改變時(shí)響應(yīng)式地更新DOM,這就是Vue.js的兩大核心功能之一——響應(yīng)性,是每一個(gè)Vue.js框架使用者必須熟練掌握的的功能。而得益于Vue.js自身支持的聲明式渲染,Vue.js的學(xué)習(xí)成本大大降低,就算是一個(gè)前端領(lǐng)域的小白,只要能看懂并簡(jiǎn)單使用基本的HTML、JavaScript以及CSS,就能夠很快上手Vue.js。學(xué),確實(shí)好學(xué);用,真的好用!但,你對(duì)Vue.js框架的內(nèi)部實(shí)現(xiàn)原理掌握多少呢?今天,就讓我們一起來簡(jiǎn)單復(fù)現(xiàn)一下Vue.js數(shù)據(jù)響應(yīng)式。

基本概念

副作用函數(shù)

什么是副作用函數(shù)?意如其名,副作用函數(shù)指的就是會(huì)產(chǎn)生副作用的函數(shù)。什么是副作用呢?就是會(huì)對(duì)函數(shù)作用域外的其他部分產(chǎn)生影響。俗話說:是藥三分毒,能治病,亦能致病。藥,就有副作用,副作用函數(shù)也是。

副作用函數(shù)代碼示例如下:

當(dāng)effect函數(shù)執(zhí)行時(shí),它會(huì)設(shè)置body的文本內(nèi)容,從而直接或間接影響到其他任何對(duì)body文本內(nèi)容有所依賴的函數(shù)的執(zhí)行。這就是一個(gè)簡(jiǎn)單的副作用函數(shù)。

響應(yīng)式數(shù)據(jù)

以我的理解,相較“響應(yīng)式數(shù)據(jù)”而言更直白的叫法應(yīng)該是“副作用數(shù)據(jù)”,就好像副作用函數(shù)的執(zhí)行可能會(huì)影響到函數(shù)作用域外的其他內(nèi)容一樣,“副作用數(shù)據(jù)”的更改可能會(huì)直接或間接影響到所有依賴該數(shù)據(jù)的函數(shù)。

假響應(yīng)式數(shù)據(jù)代碼示例如下:

如上圖,假設(shè)每一次修改對(duì)象obj的text屬性值,都會(huì)觸發(fā)函數(shù)effect的重新執(zhí)行,那么就可以說對(duì)象obj是一個(gè)響應(yīng)式數(shù)據(jù)。當(dāng)然,在這個(gè)示例里,實(shí)際上并沒有實(shí)現(xiàn)對(duì)obj對(duì)象的數(shù)據(jù)響應(yīng)。

響應(yīng)式數(shù)據(jù)的基本實(shí)現(xiàn)

實(shí)現(xiàn)思路

仔細(xì)觀察思考上述的例子,你可能會(huì)發(fā)現(xiàn)響應(yīng)式數(shù)據(jù)的實(shí)現(xiàn)存在兩個(gè)關(guān)鍵點(diǎn):

  • 副作用函數(shù)effect的執(zhí)行會(huì)觸發(fā)字段obj.text的讀取操作
  • 響應(yīng)式數(shù)據(jù)obj.text值的修改會(huì)觸發(fā)字段obj.text的設(shè)置操作

事情的脈絡(luò)漸漸清晰起來:如果我們能夠攔截對(duì)象obj的讀取和設(shè)置操作,在副作用函數(shù)effect首次讀取字段obj.text的值時(shí)將它與對(duì)象obj關(guān)聯(lián)起來,此后每次重新設(shè)置字段obj.text的值,都會(huì)重新調(diào)用一次effect函數(shù),這樣不就簡(jiǎn)單的實(shí)現(xiàn)了對(duì)obj對(duì)象的響應(yīng)嗎?

初步實(shí)現(xiàn)嘗試

實(shí)現(xiàn)的思路有了,那現(xiàn)在最關(guān)鍵的問題就是:如何實(shí)現(xiàn)攔截一個(gè)對(duì)象屬性的讀取和設(shè)置操作。如果你對(duì)JavaScript足夠熟悉,你可能就會(huì)想到Object.defineProperty函數(shù)以及Proxy對(duì)象代理。是的,這兩種方案都可以實(shí)現(xiàn)攔截一個(gè)對(duì)象屬性的讀取以及設(shè)置操作。事實(shí)上,用Object.defineProperty函數(shù)實(shí)現(xiàn)數(shù)據(jù)響應(yīng)正是Vue.js 2中所采用的方法,而Proxy對(duì)象代理則正是Vue.js 3中所采用的方法。

接下來讓我們順著上面的思路采用proxy實(shí)現(xiàn)一下:

這就是采用Proxy代理對(duì)象簡(jiǎn)單實(shí)現(xiàn)的數(shù)據(jù)響應(yīng)式,你完全可以自行創(chuàng)建一個(gè)副作用函數(shù)effect進(jìn)行測(cè)試。當(dāng)然,考慮到復(fù)雜多變的環(huán)境,此時(shí)的數(shù)據(jù)相應(yīng)式還有很多繼續(xù)完善的地方,讓我們?cè)偌蛹影?,盡可能地給出一個(gè)相對(duì)完美的響應(yīng)式數(shù)據(jù)實(shí)現(xiàn)方案。

完善響應(yīng)系統(tǒng)

泛化副作用函數(shù)名

假如有一天,副作用的函數(shù)名不叫effect了。而是叫effect1或者effect2,甚至副作用函數(shù)沒有直白的名字了,變成了一個(gè)匿名函數(shù),那么上述的響應(yīng)系統(tǒng)方案顯然是行不通的。此時(shí),為了滿足需求,我們需要提供一個(gè)用來注冊(cè)副作用函數(shù)的機(jī)制,達(dá)到泛化副作用函數(shù)名的效果。

注冊(cè)副作用函數(shù)名的代碼示例如下:

這樣,即使是一個(gè)匿名函數(shù),也能夠被成功地注冊(cè)為副作用函數(shù),注冊(cè)方法如下:

當(dāng)然,此時(shí)攔截?cái)?shù)據(jù)的讀取操作也需要做細(xì)微的調(diào)整:

修復(fù)漏洞

在很多時(shí)候,debug都是最頭疼的,特別是明明知道有bug,但就是找不到修復(fù)的方案,那種感覺真的像在坐牢……

現(xiàn)在我們來考慮一個(gè)極端條件:假如,在響應(yīng)式數(shù)據(jù)對(duì)象obj上添加了一個(gè)原本不存在的屬性,那么會(huì)發(fā)生什么?如果你對(duì)前面的內(nèi)容還不熟悉,可以再返回去翻翻代碼。你會(huì)發(fā)現(xiàn)一個(gè)驚人的事實(shí):在響應(yīng)式數(shù)據(jù)對(duì)象obj上添加一個(gè)原本不存在的屬性,會(huì)在這個(gè)新添加的屬性與相關(guān)的副作用函數(shù)之間建立響應(yīng)聯(lián)系。冷靜下來思考一下,其實(shí),導(dǎo)致該問題出現(xiàn)的根本原因是,沒有在副作用函數(shù)與被操作的目標(biāo)字段之間建立明確的聯(lián)系。那,該如何解決呢?

你想想,在數(shù)據(jù)結(jié)構(gòu)中存不存在一種結(jié)構(gòu),它具有一一對(duì)應(yīng)的關(guān)系?有,當(dāng)然有,映射就是。順著這個(gè)思路,那我們可不可以用映射的來建立目標(biāo)字段與副作用函數(shù)key-value對(duì)應(yīng)的關(guān)系?當(dāng)然可以!那么我們就可以先把負(fù)責(zé)儲(chǔ)存函數(shù)的變量bucket聲明為一個(gè)映射Map<target, Map<key, Set()>>用來儲(chǔ)存響應(yīng)式數(shù)據(jù)(key)-該響應(yīng)式數(shù)據(jù)所有屬性相關(guān)的副作用函數(shù)(value),其中,Map<key, Set>儲(chǔ)存的就是響應(yīng)式對(duì)象屬性與相應(yīng)的副作用函數(shù)集,這樣,一個(gè)明確的聯(lián)系就建立起來了。而在著手優(yōu)化響應(yīng)代碼之前,我們?cè)傧胍幌耄篵ucket用WeakMap會(huì)不會(huì)比用Map要更好一點(diǎn)?我實(shí)話直說吧,當(dāng)然應(yīng)該用WeakMap,因?yàn)閃eakMap的key是弱引用,不會(huì)影響到垃圾回收器的工作,會(huì)在合適的時(shí)候被回收,用在這里更合適。

具體實(shí)現(xiàn)代碼如下:

總結(jié)

總的來說,要想實(shí)現(xiàn)一個(gè)響應(yīng)式數(shù)據(jù)其實(shí)就是利用Proxy對(duì)象代理或者Object.defineProperty對(duì)象來攔截對(duì)數(shù)據(jù)的讀取和設(shè)置操作并與相應(yīng)的副作用函數(shù)作精確綁定。那么,如果現(xiàn)在要求你用Object.defineProperty對(duì)象來實(shí)現(xiàn)數(shù)據(jù)響應(yīng),你能夠獨(dú)立實(shí)現(xiàn)了嗎?試一下唄!

到此這篇關(guān)于Vue.js響應(yīng)式數(shù)據(jù)的簡(jiǎn)單實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Vue.js響應(yīng)式數(shù)據(jù)的實(shí)現(xiàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue項(xiàng)目服務(wù)器部署之子目錄部署方法

    Vue項(xiàng)目服務(wù)器部署之子目錄部署方法

    在本文中我們給大家整理了關(guān)于Vue項(xiàng)目服務(wù)器部署之子目錄部署方法和具體步驟,需要的朋友們參考下。
    2019-05-05
  • 在vue中阻止瀏覽器后退的實(shí)例

    在vue中阻止瀏覽器后退的實(shí)例

    今天小編就為大家分享一篇在vue中阻止瀏覽器后退的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • antd vue v-decorator的取值與賦值問題

    antd vue v-decorator的取值與賦值問題

    這篇文章主要介紹了antd vue v-decorator的取值與賦值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Vue2?的?diff?算法規(guī)則原理詳解

    Vue2?的?diff?算法規(guī)則原理詳解

    這篇文章主要介紹了Vue2的diff算法規(guī)則原理詳解,diff?算法,就是通過比對(duì)新舊兩個(gè)虛擬節(jié)點(diǎn)不一樣的地方,針對(duì)那些不一樣的地方進(jìn)行新增或更新或刪除操作。接下來我們?cè)敿?xì)介紹節(jié)點(diǎn)更新的過程
    2022-06-06
  • 一文詳解Vue中如何實(shí)現(xiàn)頁面骨架屏

    一文詳解Vue中如何實(shí)現(xiàn)頁面骨架屏

    為了提升頁面加載速度,我們可以使用頁面骨架屏技術(shù)來優(yōu)化用戶感知,下面就跟隨小編一起學(xué)習(xí)一下如何在vue中實(shí)現(xiàn)頁面骨架屏吧
    2024-03-03
  • 關(guān)于vue中的時(shí)間格式轉(zhuǎn)化問題

    關(guān)于vue中的時(shí)間格式轉(zhuǎn)化問題

    這篇文章主要介紹了關(guān)于vue中的時(shí)間格式轉(zhuǎn)化問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 又一款MVVM組件 構(gòu)建自己的Vue組件(2)

    又一款MVVM組件 構(gòu)建自己的Vue組件(2)

    這篇文章主要為大家分享了一款MVVM組件,構(gòu)建自己的Vue組件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Vue3中使用pinia的示例代碼

    Vue3中使用pinia的示例代碼

    這篇文章主要介紹了Vue3中使用pinia,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • Vue中使用Datav如何完成大屏基本布局

    Vue中使用Datav如何完成大屏基本布局

    這篇文章主要介紹了Vue中使用Datav如何完成大屏基本布局問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Vue 中批量下載文件并打包的示例代碼

    Vue 中批量下載文件并打包的示例代碼

    本篇文章主要介紹了Vue 中批量下載文件并打包的示例代碼,用 ajax 將文件下載, 然后用 jszip 壓縮文件, 最后用 file-saver 生成文件,有興趣的可以了解一下
    2017-11-11

最新評(píng)論

凤山县| 韩城市| 葫芦岛市| 高青县| 和硕县| 惠东县| 平顶山市| 赤壁市| 桐梓县| 高清| 班戈县| 铁岭县| 宝清县| 宁乡县| 中牟县| 绥芬河市| 衡阳县| 巴彦淖尔市| 腾冲县| 宾阳县| 长春市| 潮安县| 顺平县| 鄱阳县| 金山区| 海安县| 镇安县| 花莲市| 烟台市| 布尔津县| 南昌县| 沿河| 祁阳县| 蒙山县| 广州市| 年辖:市辖区| 海丰县| 崇义县| 阿鲁科尔沁旗| 淄博市| 项城市|