" />

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

Vue響應(yīng)式系統(tǒng)的原理詳解

 更新時間:2021年12月30日 15:44:00   作者:蘇米素  
這篇文章主要為大家介紹了Vue響應(yīng)式系統(tǒng)的原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

vue響應(yīng)式系統(tǒng)的基本原理

我們使用vue時,對數(shù)據(jù)進(jìn)行操作,就能影響對應(yīng)的視圖。那么這種機(jī)制是怎么實(shí)現(xiàn)的呢?

思考一下,是不是就好像我們對數(shù)據(jù)的操作 被“某人”監(jiān)視了?一旦我們對數(shù)據(jù)進(jìn)行了更改,“某人”就能感應(yīng)到,并幫我們更新視圖

那么這個“某人”到底是誰呢?其實(shí)它很普通,就是我們基礎(chǔ)里面有學(xué)過的?Object.defineProperty,使用它來對數(shù)據(jù)進(jìn)行一下加工,就能實(shí)現(xiàn)當(dāng)數(shù)據(jù)被讀時,執(zhí)行“讀”的回調(diào)函數(shù);數(shù)據(jù)被寫時,執(zhí)行“寫”的回調(diào)函數(shù)。

接下來,我們將簡單回顧該方法的使用,再用幾個實(shí)戰(zhàn)小例子帶大家徹底弄懂這個原理。

1.回顧一下Object.defineProperty的用法

參數(shù)解釋:

	obj: 目標(biāo)對象
	prop: 需要操作的目標(biāo)對象的屬性名
	descriptor: 描述符
	
	return value 傳入對象

descriptor的一些屬性,簡單介紹幾個屬性。

	enumerable,屬性是否可枚舉,默認(rèn) false。
	configurable,屬性是否可以被修改或者刪除,默認(rèn) false。
	writable,屬性是否可以被修改,默認(rèn)false
	get,獲取屬性的方法。
	set,設(shè)置屬性的方法。

完整用法:

	Object.defineProperty(obj, prop, descriptor)

2.實(shí)戰(zhàn)1:使用 Object.defineProperty 對 person的age屬性 進(jìn)行監(jiān)聽

踩坑

看下面代碼,乍一看是不是感覺沒什么不妥?

當(dāng)有人讀取person的age屬性時,我就把person的age屬性return出去;當(dāng)有人修改person的age屬性,我就直接修改person.age的值。

在這里插入圖片描述

但是!同學(xué)們,運(yùn)行了一下,雖然沒報錯,但是編譯器一直瘋狂輸出“@@有人讀取了age屬性”。

在這里插入圖片描述

這是為啥呢?你想想,你在get函數(shù)里面直接return person.age,這算不算又一次讀取了person的age屬性呢?此時程序又去執(zhí)行age的get函數(shù),反反復(fù)復(fù)。

打個比方哈,相當(dāng)于 你想讀取age,于是你告訴編譯器,我要輸出person.age,好的,編譯器去查person.age,發(fā)現(xiàn)它有g(shù)et函數(shù),于是執(zhí)行g(shù)et函數(shù),此時你以為你要拿到它的值了,沒想到get函數(shù)里面又告訴編譯器,我要person.age。這樣的話,就形成了死循環(huán)??!

那要怎么解決呢?我在get里面不能直接返回 person.age,那我要怎么拿到這個屬性的值呢?

:是不是可以用變量來替代呢?

我把person.age的值放在變量ageNumber中,我要讀的時候,就返回ageNumber的值;要修改的時候,就修改ageNumber的值;

這樣不就避免了在get,set函數(shù)里面直接用person.age來訪問嗎?

正確代碼

在這里插入圖片描述

這時,效果就完成了,讀取和修改的時候,都能被監(jiān)聽到。

在這里插入圖片描述

3.數(shù)據(jù)代理

數(shù)據(jù)代理是什么意思呢?

答:簡單解釋一下,就是通過一個對象 代理 對另一個對象中屬性的操作 (讀/寫)

有點(diǎn)抽象對嗎?用下面的小例子來解釋一下吧。

在這里插入圖片描述

在這里插入圖片描述

當(dāng)老師想查看 或者 修改學(xué)生的成績時,直接在老師這個對象上操作就行了,不需要直接去操作student對象。

這也就是上面想解釋的,通過 老師對象(teacher) 代理 了學(xué)生對象(student)中的成績屬性(score)的操作 (讀/寫)

4.vue中實(shí)現(xiàn)響應(yīng)式思路

有一點(diǎn)vue2基礎(chǔ)的同學(xué)們應(yīng)該知道,我們在vue中data() {} 中定義的數(shù)據(jù),是不是都會被掛載到vm對象上去?然后我們是通過 this.數(shù)據(jù)名 來對數(shù)據(jù)進(jìn)行操作的,對嗎?

那這個是不是就相當(dāng)于上面的小例子中的情景呢,這里是vm對象   代理   你定義的data對象中的屬性的操作(讀/寫)

再用個例子完整實(shí)現(xiàn)一下vue的響應(yīng)式原理

把data對象中的所有屬性 交給 vm對象進(jìn)行代理(讓vm 掌控data對象中的屬性的 (讀/寫) 操作 )當(dāng)數(shù)據(jù)變化時,能更新對應(yīng)視圖

總結(jié)

1.Vue中的數(shù)據(jù)代理:

通過vm對象來代理data對象中屬性的操作(讀/寫)

2.Vue中數(shù)據(jù)代理的好處:

更加方便的操作data中的數(shù)據(jù)

3.基本原理:

通過Object.defineProperty()把data對象中所有屬性添加到vm上。

為每一個添加到vm上的屬性,都指定一個getter/setter。

getter/setter內(nèi)部去操作(讀/寫)data中對應(yīng)的屬性。

4.vue中實(shí)現(xiàn)響應(yīng)式思路

不使用數(shù)據(jù)代理,直接把數(shù)據(jù) 賦值 掛載到vm上。

1.下圖的方法是對 數(shù)據(jù)對象設(shè)置get,set的通用方法

在這里插入圖片描述

2.在new一個Vue時,就會直接把用戶傳入的data對象,掛載到Vue實(shí)例身上

再對Vue實(shí)例上面的data對象進(jìn)行監(jiān)視(響應(yīng)式處理)

在這里插入圖片描述

在這里插入圖片描述

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Vue.js 中取得后臺原生HTML字符串 原樣顯示問題的解決方法

    Vue.js 中取得后臺原生HTML字符串 原樣顯示問題的解決方法

    這篇文章主要介紹了VUE.js 中取得后臺原生HTML字符串 原樣顯示問題 ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-06-06
  • 詳解如何解決Vue和vue-template-compiler版本之間的問題

    詳解如何解決Vue和vue-template-compiler版本之間的問題

    這篇文章主要介紹了詳解如何解決Vue和vue-template-compiler版本之間的問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • Vite代理如何解決跨域問題詳解

    Vite代理如何解決跨域問題詳解

    跨域是指瀏覽器不能執(zhí)行其他網(wǎng)站的腳本,它是由瀏覽器的同源策略造成的,是瀏覽器對JavaScript實(shí)施的安全限制,下面這篇文章主要給大家介紹了關(guān)于Vite代理如何解決跨域問題的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • Vue3如何在SCSS中使用v-bind

    Vue3如何在SCSS中使用v-bind

    這篇文章主要介紹了Vue3如何在SCSS中使用v-bind,通過template先創(chuàng)建一個通用的頁面結(jié)構(gòu),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • 記錄vue做微信自定義分享的一些問題

    記錄vue做微信自定義分享的一些問題

    這篇文章主要介紹了記錄vue做微信自定義分享的一些問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • vue router的基本使用和配置教程

    vue router的基本使用和配置教程

    這篇文章主要介紹了vue-router的基本使用和配置教程,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧,需要的朋友可以參考下
    2018-11-11
  • vant-List-@load事件一直觸發(fā)的解決

    vant-List-@load事件一直觸發(fā)的解決

    這篇文章主要介紹了vant-List-@load事件一直觸發(fā)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Vue實(shí)現(xiàn)用戶登錄及token驗證

    Vue實(shí)現(xiàn)用戶登錄及token驗證

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)用戶登錄及token驗證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 詳解element上傳組件before-remove鉤子問題解決

    詳解element上傳組件before-remove鉤子問題解決

    這篇文章主要介紹了詳解element上傳組件before-remove鉤子問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Vue分頁器實(shí)現(xiàn)原理詳解

    Vue分頁器實(shí)現(xiàn)原理詳解

    這篇文章主要為大家詳細(xì)介紹了Vue分頁器實(shí)現(xiàn)原理,編寫了分頁器組件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06

最新評論

通许县| 枣庄市| 新蔡县| 茌平县| 鄢陵县| 台中县| 乌兰县| 建昌县| 博罗县| 罗城| 丹巴县| 丰镇市| 闽侯县| 彭水| 鄂托克旗| 中牟县| 临高县| 黄梅县| 黔江区| 峨眉山市| 张家川| 桃园县| 恭城| 甘孜县| 佛山市| 平原县| 东阳市| 南丰县| 德州市| 准格尔旗| 金平| 栾川县| 旌德县| 罗平县| 连州市| 东海县| 鹤庆县| 南京市| 大竹县| 西乌珠穆沁旗| 洪泽县|