1. reactive api
為什么要使用reactive api鸭栖,因?yàn)橄胍獜?fù)刻options api的做法,在setup函數(shù)中是行不通的握巢,data函數(shù)中定義的變量之所以是響應(yīng)式的晕鹊,是因?yàn)榻?jīng)過了reactive函數(shù)的處理。
可以看到這樣的寫法變量counter不是響應(yīng)式的镜粤。
使用reactive api修改之后:將counter放在對(duì)象中捏题,由reactive函數(shù)處理,使用處理過的返回值中的couter
可以看到肉渴,此時(shí)state對(duì)象中的counter已經(jīng)是響應(yīng)式的了公荧。
reactive api傳入類型必須是對(duì)象或者數(shù)組,這樣在使用時(shí)同规,需要用state.counter的形式來取用counter循狰,感覺有點(diǎn)麻煩,這時(shí)Vue3提供了另一個(gè)api:ref api券勺。
2.ref api
使用ref api需要注意的地方:
1.ref傳入類型:所有類型绪钥,比reactive api不受限制;
2.ref返回一個(gè)響應(yīng)式的對(duì)象关炼,value屬性維護(hù)其值程腹;
3.模板(template)中會(huì)自動(dòng)解包,不需要以.value的形式獲取值儒拂,但setup函數(shù)中不會(huì)自動(dòng)解包寸潦。
如果我將counter放在一個(gè)對(duì)象中,再使用ref社痛,那么模板是否會(huì)自動(dòng)解包:不會(huì)
4. 原因:ref的解包是一個(gè)淺層的解包
此時(shí)需要.value來獲取這個(gè)ref對(duì)象的值
但是reactive api 包裹的對(duì)象见转,可以深層解包
3.reactive判斷的api
1. isProxy: 檢查對(duì)象是否由reactive或readonly創(chuàng)建的proxy;
2. isReactive: 檢查對(duì)象是否是由 reactive創(chuàng)建的響應(yīng)式代理蒜哀,但是如果該代理是 readonly 建的斩箫,但包裹了由 reactive 創(chuàng)建的另一個(gè)代理,它也會(huì)返回 true撵儿;
3.? isReadonly:?檢查對(duì)象是否是由 readonly 創(chuàng)建的只讀代理乘客;
4.? toRaw: 返回 reactive 或 readonly 代理的原始對(duì)象(不建議保留對(duì)原始對(duì)象的持久引用)
5. shallowReactive: 創(chuàng)建一個(gè)響應(yīng)式代理,它跟蹤其自身 property 的響應(yīng)性淀歇,但不執(zhí)行嵌套對(duì)象的深層響應(yīng)式轉(zhuǎn)換(深層還是原生對(duì)象)寨典;
6. shallowReadonly: 創(chuàng)建一個(gè) proxy,使其自身的 property 為只讀房匆,但不執(zhí)行套對(duì)象的深度只讀轉(zhuǎn)換(深層還是可讀、可寫的);
4.Ref api 的補(bǔ)充
假如想對(duì)響應(yīng)式對(duì)象解構(gòu)賦值浴鸿,盡管是reactive處理過的對(duì)象井氢,解構(gòu)出來的值不會(huì)是響應(yīng)式的
想讓其成為響應(yīng)式的,可以使用toRefs api
1.toRefs api: 將reoctive對(duì)象中的所有屬性都轉(zhuǎn)成ref岳链,建立連接
而且花竞,toRefs api相當(dāng)于在info中的每一個(gè)屬性的value與解構(gòu)之后的值做了連接,一個(gè)更改之后另一個(gè)也會(huì)隨之更改
如果只想對(duì)其中一個(gè)屬性轉(zhuǎn)換為ref掸哑,那么可以使用toRef api
2.toRef: 對(duì)其中一個(gè)屬性進(jìn)行轉(zhuǎn)換ref约急,建立連接
格式:toRef(object,key)