一篇文章上手Vue3中新增API

1. 初始化項(xiàng)目
//?①?npm?i?-g?@vue/cli
//?②?vue?create?my-project
//?③?npm?install?@vue/composition-api?-S
//?④?main,js
import?Vue?from?'vue'
import?VueCompositionApi?from?'@vue/composition-api'
Vue.use(VueCompositionApi)
2. setup方法
setup是vue3.x中新的操作組件屬性的方法,它是組件內(nèi)部暴露出所有的屬性和方法的統(tǒng)一API。
2.1 執(zhí)行時(shí)機(jī)
setup的執(zhí)行時(shí)機(jī)在:beforeCreate 之后 created之前
setup(props,?ctx)?{
????console.log('setup')
??},
??beforeCreate()?{
????console.log('beforeCreate')
??},
??created()?{
????console.log('created')
??},
2.2 接受props數(shù)據(jù)
"傳值給?com-setup"/>
//?通過 setup 函數(shù)的第一個(gè)形參,接收 props 數(shù)據(jù):
setup(props)?{
??console.log(props)
},
//?在 props 中定義當(dāng)前組件允許外界傳遞過來的參數(shù)名稱:
props:?{
????p1:?String
}
/*
{}
p1:?"傳值給 com-setup"
get?p1:???reactiveGetter()
set?p1:???reactiveSetter(newVal)
__proto__:?Object
*/
2.3 context
setup 函數(shù)的第二個(gè)形參是一個(gè)上下文對(duì)象,這個(gè)上下文對(duì)象中包含了一些有用的屬性,這些屬性在 vue 2.x 中需要通過 this 才能訪問到,在 vue 3.x 中,它們的訪問方式如下:
setup(props,?ctx)?{
????console.log(ctx)
????console.log(this)?//?undefined
??},
/*
attrs:?Object
emit:???()
listeners:?Object
parent:?VueComponent
refs:?Object
root:?Vue
...
*/
注意:在 setup() 函數(shù)中無法訪問到 this
3. reactive
reactive函數(shù)接收一個(gè)普通函數(shù),返回一個(gè)響應(yīng)式的數(shù)據(jù)對(duì)象。
reactive函數(shù)等價(jià)于 vue 2.x 中的 Vue.observable() 函數(shù),vue 3.x 中提供了 reactive() 函數(shù),用來創(chuàng)建響應(yīng)式的數(shù)據(jù)對(duì)象,基本代碼示例如下:
??
????
????當(dāng)前的 count 值為:{{count}}
????
??
4. ref
ref() 函數(shù)用來根據(jù)給定的值創(chuàng)建一個(gè)響應(yīng)式的數(shù)據(jù)對(duì)象,ref() 函數(shù)調(diào)用的返回值是一個(gè)對(duì)象,這個(gè)對(duì)象上只包含一個(gè) .value 屬性:
??
????02.ref.vue?文件
????refCount:{{refCount}}
????
??
4.1 在 reactive 對(duì)象中訪問 ref 創(chuàng)建的響應(yīng)式數(shù)據(jù)
當(dāng)把 ref() 創(chuàng)建出來的響應(yīng)式數(shù)據(jù)對(duì)象,掛載到 reactive() 上時(shí),會(huì)自動(dòng)把響應(yīng)式數(shù)據(jù)對(duì)象展開為原始的值,不需通過 .value 就可以直接被訪問,例如:
setup()?{
??const?refCount?=?ref(0)
??const?state?=?reactive({refCount})
??console.log(state.refCount)?//?輸出?0
??state.refCount++?//?此處不需要通過?.value?就能直接訪問原始值
??console.log(refCount)?//?輸出?1
??return?{
????refCount
??}
}
注意:新的 ref 會(huì)覆蓋舊的 ref,示例代碼如下:
setup()?{
??//?創(chuàng)建?ref?并掛載到?reactive?中
??const?c1?=?ref(0);
??const?state?=?reactive({?c1?});
??//?再次創(chuàng)建?ref,命名為?c2
??const?c2?=?ref(9);
??//?將?舊?ref?c1?替換為?新?ref?c2
??state.c1?=?c2;
??state.c1++;
??console.log(state.c1);?//?輸出?10
??console.log(c2.value);?//?輸出?10
??console.log(c1.value);?//?輸出?0
}
5. isRef
isRef() 用來判斷某個(gè)值是否為 ref() 創(chuàng)建出來的對(duì)象;應(yīng)用場景:當(dāng)需要展開某個(gè)可能為 ref() 創(chuàng)建出來的值的時(shí)候,例如:
import?{?ref,?reactive,?isRef?}?from?"@vue/composition-api";
export?default?{
??setup()?{
????const?unwrapped?=?isRef(foo)???foo.value?:?foo
??}
};
6. toRefs
toRefs() 函數(shù)可以將 reactive() 創(chuàng)建出來的響應(yīng)式對(duì)象,轉(zhuǎn)換為普通的對(duì)象,只不過,這個(gè)對(duì)象上的每個(gè)屬性節(jié)點(diǎn),都是 ref() 類型的響應(yīng)式數(shù)據(jù)。
??
????03.toRefs.vue文件
????{{?count?}}?-?{{?name?}}
????
????
??
7. computed計(jì)算屬性
7.1 只讀的計(jì)算屬性
??
????04.computed.vue文件
????refCount:?{{refCount}}
????計(jì)算屬性的值computedCount?:?{{computedCount}}
????
????????
????
??
7.2 可讀可寫的計(jì)算屬性
??
????04.computed.vue文件
????refCount:?{{refCount}}
????計(jì)算屬性的值computedCount?:?{{computedCount}}
????
??
8. watch
watch() 函數(shù)用來監(jiān)視某些數(shù)據(jù)項(xiàng)的變化,從而觸發(fā)某些特定的操作,使用之前需要按需導(dǎo)入:
import?{?watch?}?from?'@vue/composition-api'
8.1 基本用法
??
????05.watch.vue文件
????refCount:?{{refCount}}
??
8.2 監(jiān)視數(shù)據(jù)源
監(jiān)視 reactive 類型的數(shù)據(jù)源:
??
????05.watch.vue文件
????count:?{{count}}
?//?不是響應(yīng)式數(shù)據(jù)
??
監(jiān)視 ref 類型的數(shù)據(jù)源:
export?default?{
??setup()?{
????//?定義數(shù)據(jù)源
????let?count?=?ref(0);
????//?指定要監(jiān)視的數(shù)據(jù)源
????watch(count,?(count,?prevCount)?=>?{
??????console.log(count,?prevCount)
????})
????setInterval(()?=>?{
??????count.value?+=?2
????},?2000)
????console.log(count.value)
????return?{
??????count
????}
??}
};
8.3 監(jiān)聽多個(gè)數(shù)據(jù)源
監(jiān)視 reactive 類型的數(shù)據(jù)源:
export?default?{
??setup()?{
????const?state?=?reactive({count:?100,?name:?'houfei'})
????watch(
??????//?監(jiān)聽count?name
??????[()?=>?state.count,?()?=>?state.name],
??????//?如果變換?執(zhí)行以下函數(shù)
??????([newCount,?newName],?[oldCount,?oldName])?=>?{
????????console.log(newCount,?oldCount)
????????console.log(newName,?oldName)
??????},
??????{?lazy:?true}?//?在?watch?被創(chuàng)建的時(shí)候,不執(zhí)行回調(diào)函數(shù)中的代碼
????)
????setTimeout(()?=>?{
??????state.count?+=?2
??????state.name?=?'qweqweewq'
????},?3000)
????return?state
??}
};
監(jiān)視 ref 類型的數(shù)據(jù)源:
export?default?{
??setup()?{
????//?定義數(shù)據(jù)源
????const?count?=?ref(10)
????const?name?=?ref('zs')
????//?指定要監(jiān)視的數(shù)據(jù)源
????watch(
??????[count,?name],
??????([newCount,?newName],?[oldCount,?oldName])?=>?{
????????console.log(newCount,?oldCount)
????????console.log(newName,?oldName)
??????},
??????{?lazy:?true}
????)
????setInterval(()?=>?{
??????count.value?+=?2
????},?2000)
????console.log(count.value)
????return?{
??????count
????}
??}
};
8.4 清除監(jiān)視
在 setup() 函數(shù)內(nèi)創(chuàng)建的 watch 監(jiān)視,會(huì)在當(dāng)前組件被銷毀的時(shí)候自動(dòng)停止。如果想要明確地停止某個(gè)監(jiān)視,可以調(diào)用 watch() 函數(shù)的返回值即可,語法如下:
8.5 在watch中清除無效的異步任務(wù)
有時(shí)候,當(dāng)被 watch 監(jiān)視的值發(fā)生變化時(shí),或 watch 本身被 stop 之后,我們期望能夠清除那些無效的異步任務(wù),此時(shí),watch 回調(diào)函數(shù)中提供了一個(gè) cleanup registrator function 來執(zhí)行清除的工作。這個(gè)清除函數(shù)會(huì)在如下情況下被調(diào)用:
watch 被重復(fù)執(zhí)行了
watch 被強(qiáng)制 stop 了
Template 中的代碼示例如下:
??
????
????type="text"?v-model="keywords"?/>
????keywords:---?{{?keywords?}}
??
Script 中的代碼示例如下:
9. provide & inject 組件傳值
provide() 和 inject() 可以實(shí)現(xiàn)嵌套組件之間的數(shù)據(jù)傳遞。這兩個(gè)函數(shù)只能在 setup() 函數(shù)中使用。父級(jí)組件中使用 provide() 函數(shù)向下傳遞數(shù)據(jù);子級(jí)組件中使用 inject() 獲取上層傳遞過來的數(shù)據(jù)。
9.1 共享普通數(shù)據(jù)
app.vue 根組件:
??"app">
????父組件
????
????
????
????
????
??
06.son.vue son 組件:
??
????"{color:?color}">son?組件
????
??
07.grandson.vue son 組件:
??
????"{color:?color}">grandson?組件
??
9.2 共享ref響應(yīng)式數(shù)據(jù)
app.vue 根組件:
??"app">
????父組件
????
??
06.son.vue son 組件:
??
????"{color:?color}">son?組件
????
??
07.grandson.vue son 組件:
template>
??
????"{color:?color}">grandson?組件
??
10. 節(jié)點(diǎn)的引用 template ref
10.1 dom的引用
??
????"h3Ref">TemplateRefOne
??
10.2 組件的引用
App父組件:
??"app">
????父組件
????
????"comRef">
??
06.son.vue子組件:
??
????"{color:?color}">son?組件
????{{str1}}
??
11 nextTick
??
????09.nextTick?組件
????學(xué)習(xí)?$nextTick
????
????type="text"?v-else?ref="ipt">
??
學(xué)習(xí)交流
關(guān)注公眾號(hào)【前端宇宙】,每日獲取好文推薦 添加微信,入群交流 “在看和轉(zhuǎn)發(fā)”就是最大的支持
