這篇文章主要介紹“Vue3的組合式API實(shí)例應(yīng)用分析”的相關(guān)知識,小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“Vue3的組合式API實(shí)例應(yīng)用分析”文章能幫助大家解決問題。
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),裕民企業(yè)網(wǎng)站建設(shè),裕民品牌網(wǎng)站建設(shè),網(wǎng)站定制,裕民網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,裕民網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
組合式api(Composition API)算是vue3對我們開發(fā)者來說非常有價(jià)值的一個api更新,我們先不關(guān)注具體語法,先對它有一個大的感知
options API開發(fā)出來的vue應(yīng)用如左圖所示,它的特點(diǎn)是理解容易,因?yàn)楦鱾€選項(xiàng)都有固定的書寫位置,比如響應(yīng)式數(shù)據(jù)就寫到data選擇中,操作方法就寫到methods配置項(xiàng)中等,應(yīng)用大了之后,相信大家都遇到過來回上下找代碼的困境
composition API開發(fā)的vue應(yīng)用如右圖所示,它的特點(diǎn)是特定功能相關(guān)的所有東西都放到一起維護(hù),比如功能A相關(guān)的響應(yīng)式數(shù)據(jù),操作數(shù)據(jù)的方法等放到一起,這樣不管應(yīng)用多大,都可以快讀定位到某個功能的所有相關(guān)代碼,維護(hù)方便,設(shè)置如果功能復(fù)雜,代碼量大,我們還可以進(jìn)行邏輯拆分處理
特別注意:
選項(xiàng)式api和組合式api倆種風(fēng)格是并存的關(guān)系 并不是非此即彼
需要大量的邏輯組合的場景,可以使用compition API進(jìn)行增強(qiáng)
上面我們通過圖示簡單了解了一下vue3帶來的全新的api形式,下面我們通過一個具體的小案例更加深入的體會一下倆種api下的開發(fā)模式對比,我們先暫時忽略語法細(xì)節(jié),只關(guān)注代碼編寫形式
倆個獨(dú)立的功能:
通過點(diǎn)擊按鈕來控制p的顯示和隱藏
通過點(diǎn)擊按鈕控制p內(nèi)字體顏色的變化
一個被控制顯隱的div一個被控制字體顏色的的div
一個被控制顯隱的div一個被控制字體顏色的的div
在這里可能會有疑惑,那我們現(xiàn)在是把功能相關(guān)的所有數(shù)據(jù)和行為放到一起維護(hù)了,如果應(yīng)用很大功能很多的情況下,setup函數(shù)不會變得很大嗎?豈不是又會變得比較難維護(hù),接下來我們就來拆解一下龐大的setup函數(shù)
以上,我們通過定義功能函數(shù),把倆個功能相關(guān)的代碼各自抽離到一個獨(dú)立的小函數(shù)中,然后通過在setUp函數(shù)中再把倆個小功能函數(shù)組合起來,這樣一來,我們既可以把setup函數(shù)變得清爽,又可以方便維護(hù)快速定位功能位置
到此我們沒有關(guān)注api細(xì)節(jié),只是體會組合式api給到我們的好處,接下來我們就要深入到api細(xì)節(jié),看看全新的api都該如何使用 ↓
setup 函數(shù)是一個新的組件選項(xiàng),作為組件中組合式API 的起點(diǎn)(入口)
setup 中不能使用 this, this 指向 undefined
setup函數(shù)只會在組件初始化的時候執(zhí)行一次
setup函數(shù)在beforeCreate生命周期鉤子執(zhí)行之前執(zhí)行
export default { setup () { console.log('setup執(zhí)行了') console.log(this) }, beforeCreate() { console.log('beforeCreate執(zhí)行了') console.log(this) }}
作用:reactive是一個函數(shù),接收一個普通的對象傳入,把對象數(shù)據(jù)轉(zhuǎn)化為響應(yīng)式對象并返回
使用步驟
從vue框架中導(dǎo)入reactive函數(shù)
在setup函數(shù)中調(diào)用reactive函數(shù)并將對象數(shù)據(jù)傳入
在setup函數(shù)中把reactive函數(shù)調(diào)用完畢之后的返回值以對象的形式返回出去
代碼落地
{{ state.name }}{{ state.age }}
作用:ref是一個函數(shù),接受一個簡單類型或者復(fù)雜類型的傳入并返回一個響應(yīng)式且可變的 ref 對象
使用步驟
從vue框架中導(dǎo)出ref函數(shù)
在setup函數(shù)中調(diào)用ref函數(shù)并傳入數(shù)據(jù)(簡單類型或者復(fù)雜類型)
在setup函數(shù)中把ref函數(shù)調(diào)用完畢的返回值以對象的形式返回出去
注意:在setup函數(shù)中使用ref結(jié)果,需要通過.value 訪問,模板中使用不需要加.value
{{ money }}
總結(jié)說明:
ref 函數(shù)可以接收一個簡單類型的值,返回一個可改變的 ref 響應(yīng)式對象,從而彌補(bǔ)reactive函數(shù)不支持簡單類型的問題
reactive和ref函數(shù)都可以提供響應(yīng)式數(shù)據(jù)的轉(zhuǎn)換,具體什么時候需要使用哪個API社區(qū)還沒有最佳實(shí)踐,大家暫時可以使用自己熟練的API進(jìn)行轉(zhuǎn)換
推薦一種寫法:只有我們明確知道要轉(zhuǎn)換的對象內(nèi)部的字段名稱我們才使用reactive,否則就一律使用ref,從而降低在語法選擇上的心智負(fù)擔(dān)
場景: 經(jīng)過reactive函數(shù)處理之后返回的對象,如果給這個對象解構(gòu)或者展開,會讓數(shù)據(jù)丟失響應(yīng)式的能力,為了解決這個問題需要引入toRefs函數(shù),使用 toRefs函數(shù) 可以保證該對象展開的每個屬性都是響應(yīng)式的
還是之前的案例,如果我們想在模板中省略到state,直接書寫name和age,你可能會想到,那我在return出去的時候把state中的屬性解構(gòu)出來不就好了
修改前
{{ state.name }}{{ state.age }}
解構(gòu)修改后
{{ name }}{{ age }}
點(diǎn)擊改值按鈕,發(fā)現(xiàn)視圖已經(jīng)不發(fā)生變化了,這就是我們所說的,如果解構(gòu)reactive的返回值,將破壞調(diào)用響應(yīng)式特性,就需要我們使用toRefs方法進(jìn)行處理了
{{ name }}{{ age }}
在setup函數(shù)中使用計(jì)算屬性函數(shù)
作用:根據(jù)現(xiàn)有響應(yīng)式數(shù)據(jù)經(jīng)過一定的計(jì)算得到全新的數(shù)據(jù)
使用步驟
從vue框架中導(dǎo)入computed 函數(shù)
在setup函數(shù)中執(zhí)行computed函數(shù),并傳入一個函數(shù),在函數(shù)中定義計(jì)算公式
把computed函數(shù)調(diào)用完的執(zhí)行結(jié)果放到setup的return值對象中
{{ list }} {{ filterList }}
在setup函數(shù)中偵聽器的使用
作用:基于響應(yīng)式數(shù)據(jù)的變化執(zhí)行回調(diào)邏輯,和vue2中的watch的功能完全一致
普通監(jiān)聽
立即執(zhí)行
深度監(jiān)聽
使用步驟
從vue框架中導(dǎo)入watch函數(shù)
在setup函數(shù)中執(zhí)行watch函數(shù)開啟對響應(yīng)式數(shù)據(jù)的監(jiān)聽
watch函數(shù)接收三個常規(guī)參數(shù)
第一個參數(shù)為函數(shù),返回你要監(jiān)聽變化的響應(yīng)式數(shù)據(jù)
第二個參數(shù)為響應(yīng)式數(shù)據(jù)變化之后要執(zhí)行的回調(diào)函數(shù)
第三個參數(shù)為一個對象,在里面配置是否開啟立刻執(zhí)行或者深度監(jiān)聽
{{ age }}
watch的效果默認(rèn)狀態(tài)下,只有監(jiān)聽的數(shù)據(jù)發(fā)生變化才會執(zhí)行回調(diào),如果你需要在一上來的時候就立刻執(zhí)行一次,需要配置一下
immediate
屬性
{{ age }}
當(dāng)我們監(jiān)聽的數(shù)據(jù)是一個對象的時候,默認(rèn)狀態(tài)下,對象內(nèi)部的屬性發(fā)生變化是不會引起回調(diào)函數(shù)執(zhí)行的,如果想讓對象下面所有屬性都能得到監(jiān)聽,需要開啟
deep
配置
{{ name }} {{ info.age }}
使用watch的時候,盡量詳細(xì)的表明你到底要監(jiān)聽哪個屬性,避免使用deep引起的性能問題,比如我僅僅只是想在state對象的age屬性變化的時候執(zhí)行回調(diào),可以這么寫
{{ name }} {{ info.age }}
使用步驟
先從vue中導(dǎo)入以on打頭的生命周期鉤子函數(shù)
在setup函數(shù)中調(diào)用生命周期函數(shù)并傳入回調(diào)函數(shù)
生命周期鉤子函數(shù)可以調(diào)用多次
生命周期函數(shù)
選項(xiàng)式API | 組合式API |
---|---|
beforeCreate | 不需要(直接寫到setup函數(shù)中) |
created | 不需要(直接寫到setup函數(shù)中) |
beforeMount | onBeforeMount |
mounted | onMounted |
beforeUpdate | onBeforeUpdate |
updated | onUpdated |
beforeDestroyed | onBeforeUnmount |
destroyed | onUnmounted |
在vue3的組合式API中,父傳子的基礎(chǔ)套路完全一樣,基礎(chǔ)思想依舊為:父傳子是通過prop進(jìn)行傳入,子傳父通過調(diào)用自定義事件完成
實(shí)現(xiàn)步驟
setup函數(shù)提供倆個參數(shù),第一個參數(shù)為props,第二個參數(shù)為一個對象context
props為一個對象,內(nèi)部包含了父組件傳遞過來的所有prop數(shù)據(jù),context對象包含了attrs,slots, emit屬性,其中的emit可以觸發(fā)自定義事件的執(zhí)行從而完成子傳父
代碼落地app.vue
components/son.vue
{{name}}
通常我們使用props進(jìn)行父子之間的數(shù)據(jù)傳遞,但是如果組件嵌套層級較深,一層一層往下傳遞將會變的非常繁瑣,有沒有一種手段可以把這個過程簡化一下呢,有的,就是我們馬上要學(xué)習(xí)的provide 和 inject,它們配合起來可以方便的完成跨層傳遞數(shù)據(jù)
在setup函數(shù)中使用provide和inject的基礎(chǔ)用法
來個需求: 爺組件中有一份數(shù)據(jù) 傳遞給孫組件直接使用
實(shí)現(xiàn)步驟:
頂層組件在setup方法中使用provide函數(shù)提供數(shù)據(jù)
任何底層組件在setup方法中使用inject函數(shù)獲取數(shù)據(jù)
代碼落地爺爺組件 - app.vue
孫組件 - components/Son.vue
我是子組件 {{ name }}
事實(shí)上,只要是后代組件,都可以方便的獲取頂層組件提供的數(shù)據(jù)
provide默認(rèn)情況下傳遞的數(shù)據(jù)不是響應(yīng)式的,也就是如果對provide提供的數(shù)據(jù)進(jìn)行修改,并不能響應(yīng)式的影響到底層組件使用數(shù)據(jù)的地方,如果想要傳遞響應(yīng)數(shù)據(jù)也非常簡單,只需要將傳遞的數(shù)據(jù)使用ref或者reactive生成即可
通過provide/inject傳遞響應(yīng)式數(shù)據(jù)app.vue
在模板中使用ref,我們都很清楚,它一般有三種使用場景
ref + 普通dom標(biāo)簽 獲取真實(shí)dom對象
ref + 組件標(biāo)簽 獲取組件實(shí)例對象
ref + v-for 獲取由dom對象(實(shí)例對象)組成的數(shù)組 (不經(jīng)常使用)
在setup函數(shù)中使用ref獲取真實(shí)dom獲取組件實(shí)例的方法
實(shí)現(xiàn)步驟
使用ref函數(shù)傳入null創(chuàng)建 ref對象 => const hRef = ref(null)
模板中通過定義ref屬性等于1中創(chuàng)建的ref對象名稱建立關(guān)聯(lián) =>
使用 =>hRef.value
代碼落地components/RefComponent.vue
我是一個普通的組件
app.vue
我是普通dom標(biāo)簽
核心功能
渲染列表數(shù)據(jù) v-for
點(diǎn)擊刪除當(dāng)前列表 splice + index
回車添加新項(xiàng)目 @keyup.enter=“addTodo” list.unshift
選擇狀態(tài)切換 v-model
多選和取消多選 計(jì)算屬性的set和get
未完成任務(wù)數(shù)量統(tǒng)計(jì) computed
todos
關(guān)于“Vue3的組合式API實(shí)例應(yīng)用分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點(diǎn)。