Vue3和Vue2響應(yīng)式的區(qū)別

1.拉開(kāi)序幕的setup

理解:Vue3.0中一個(gè)新的配置項(xiàng),值為一個(gè)函數(shù)丸相。

setup是所有Composition API(組合API)“ 表演的舞臺(tái) ”

組件中所用到的:數(shù)據(jù)彼棍、方法等等灭忠,均要配置在setup中。

setup函數(shù)的兩種返回值:

若返回一個(gè)對(duì)象座硕,則對(duì)象中的屬性弛作、方法, 在模板中均可以直接使用。(重點(diǎn)關(guān)注;摇)

若返回一個(gè)渲染函數(shù):則可以自定義渲染內(nèi)容缆蝉。(了解)

注意點(diǎn):

盡量不要與Vue2.x配置混用

Vue2.x配置(data、methos瘦真、computed...)中可以訪問(wèn)到setup中的屬性、方法黍瞧。

但在setup中不能訪問(wèn)到Vue2.x配置(data诸尽、methos、computed...)印颤。

如果有重名, setup優(yōu)先您机。

setup不能是一個(gè)async函數(shù),因?yàn)榉祷刂挡辉偈莚eturn的對(duì)象, 而是promise, 模板看不到return對(duì)象中的屬性年局。(后期也可以返回一個(gè)Promise實(shí)例际看,但需要Suspense和異步組件的配合)

2.ref函數(shù)

作用: 定義一個(gè)響應(yīng)式的數(shù)據(jù)

語(yǔ)法: const xxx = ref(initValue)

創(chuàng)建一個(gè)包含響應(yīng)式數(shù)據(jù)的引用對(duì)象(reference對(duì)象,簡(jiǎn)稱ref對(duì)象)矢否。

JS中操作數(shù)據(jù): xxx.value

模板中讀取數(shù)據(jù): 不需要.value仲闽,直接:<div>{{xxx}}</div>

備注:

接收的數(shù)據(jù)可以是:基本類型、也可以是對(duì)象類型僵朗。

基本類型的數(shù)據(jù):響應(yīng)式依然是靠Object.defineProperty()的get與set完成的赖欣。

對(duì)象類型的數(shù)據(jù):內(nèi)部 “ 求助 ” 了Vue3.0中的一個(gè)新函數(shù)—— reactive函數(shù)。

3.reactive函數(shù)

作用: 定義一個(gè)對(duì)象類型的響應(yīng)式數(shù)據(jù)(基本類型不要用它验庙,要用ref函數(shù))

語(yǔ)法:const 代理對(duì)象= reactive(源對(duì)象)接收一個(gè)對(duì)象(或數(shù)組)顶吮,返回一個(gè)代理對(duì)象(Proxy的實(shí)例對(duì)象,簡(jiǎn)稱proxy對(duì)象)

reactive定義的響應(yīng)式數(shù)據(jù)是“深層次的”粪薛。

內(nèi)部基于 ES6 的 Proxy 實(shí)現(xiàn)悴了,通過(guò)代理對(duì)象操作源對(duì)象內(nèi)部數(shù)據(jù)進(jìn)行操作。

4.Vue3.0中的響應(yīng)式原理

vue2.x的響應(yīng)式

實(shí)現(xiàn)原理:

對(duì)象類型:通過(guò)Object.defineProperty()對(duì)屬性的讀取、修改進(jìn)行攔截(數(shù)據(jù)劫持)湃交。

數(shù)組類型:通過(guò)重寫(xiě)更新數(shù)組的一系列方法來(lái)實(shí)現(xiàn)攔截熟空。(對(duì)數(shù)組的變更方法進(jìn)行了包裹)。

Object.defineProperty(data,'count', {

get() {},

set() {}

})

存在問(wèn)題:

新增屬性巡揍、刪除屬性, 界面不會(huì)更新痛阻。

直接通過(guò)下標(biāo)修改數(shù)組, 界面不會(huì)自動(dòng)更新。

Vue3.0的響應(yīng)式

實(shí)現(xiàn)原理:

通過(guò)Proxy(代理):? 攔截對(duì)象中任意屬性的變化, 包括:屬性值的讀寫(xiě)腮敌、屬性的添加阱当、屬性的刪除等。

通過(guò)Reflect(反射):? 對(duì)源對(duì)象的屬性進(jìn)行操作糜工。

MDN文檔中描述的Proxy與Reflect:

Proxy:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Reflect:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect

newProxy(data, {

? ? // 攔截讀取屬性值

get(target,prop) {

? ? returnReflect.get(target,prop)

?? },

// 攔截設(shè)置屬性值或添加新屬性

set(target,prop,value) {

? ? returnReflect.set(target,prop,value)

?? },

// 攔截刪除屬性

deleteProperty(target,prop) {

? ? returnReflect.deleteProperty(target,prop)

?? }

})

proxy.name='tom'

5.reactive對(duì)比ref

從定義數(shù)據(jù)角度對(duì)比:

ref用來(lái)定義:基本類型數(shù)據(jù)弊添。

reactive用來(lái)定義:對(duì)象(或數(shù)組)類型數(shù)據(jù)

備注:ref也可以用來(lái)定義對(duì)象(或數(shù)組)類型數(shù)據(jù), 它內(nèi)部會(huì)自動(dòng)通過(guò)reactive轉(zhuǎn)為代理對(duì)象捌木。

從原理角度對(duì)比:

ref通過(guò)Object.defineProperty()的get與set來(lái)實(shí)現(xiàn)響應(yīng)式(數(shù)據(jù)劫持)油坝。

reactive通過(guò)使用Proxy來(lái)實(shí)現(xiàn)響應(yīng)式(數(shù)據(jù)劫持), 并通過(guò)Reflect操作源對(duì)象內(nèi)部的數(shù)據(jù)。

從使用角度對(duì)比:

ref定義的數(shù)據(jù):操作數(shù)據(jù)需要.value刨裆,讀取數(shù)據(jù)時(shí)模板中直接讀取不需要.value澈圈。

reactive定義的數(shù)據(jù):操作數(shù)據(jù)與讀取數(shù)據(jù):均不需要.value。

6.setup的兩個(gè)注意點(diǎn)

setup執(zhí)行的時(shí)機(jī)

在beforeCreate之前執(zhí)行一次帆啃,this是undefined瞬女。

setup的參數(shù)

props:值為對(duì)象,包含:組件外部傳遞過(guò)來(lái)努潘,且組件內(nèi)部聲明接收了的屬性诽偷。

context:上下文對(duì)象

attrs: 值為對(duì)象,包含:組件外部傳遞過(guò)來(lái)疯坤,但沒(méi)有在props配置中聲明的屬性, 相當(dāng)于 this.$attrs报慕。

slots: 收到的插槽內(nèi)容, 相當(dāng)于 this.$slots。

emit: 分發(fā)自定義事件的函數(shù), 相當(dāng)于 this.$emit压怠。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末眠冈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子菌瘫,更是在濱河造成了極大的恐慌洋闽,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件突梦,死亡現(xiàn)場(chǎng)離奇詭異诫舅,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)宫患,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)刊懈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事虚汛∝依耍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵卷哩,是天一觀的道長(zhǎng)蛋辈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)将谊,這世上最難降的妖魔是什么冷溶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮尊浓,結(jié)果婚禮上逞频,老公的妹妹穿的比我還像新娘。我一直安慰自己栋齿,他們只是感情好苗胀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瓦堵,像睡著了一般基协。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上菇用,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天澜驮,我揣著相機(jī)與錄音,去河邊找鬼刨疼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鹅龄,可吹牛的內(nèi)容都是我干的揩慕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扮休,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼迎卤!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起玷坠,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蜗搔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后八堡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體樟凄,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年兄渺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缝龄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖叔壤,靈堂內(nèi)的尸體忽然破棺而出瞎饲,到底是詐尸還是另有隱情,我是刑警寧澤炼绘,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布嗅战,位于F島的核電站,受9級(jí)特大地震影響俺亮,放射性物質(zhì)發(fā)生泄漏驮捍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一铅辞、第九天 我趴在偏房一處隱蔽的房頂上張望厌漂。 院中可真熱鬧,春花似錦斟珊、人聲如沸苇倡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)旨椒。三九已至,卻和暖如春堵漱,著一層夾襖步出監(jiān)牢的瞬間综慎,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工勤庐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留示惊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓愉镰,卻偏偏與公主長(zhǎng)得像米罚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丈探,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容