溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

vue組合式API入門實(shí)例代碼分析

發(fā)布時(shí)間:2023-05-11 15:30:37 來源:億速云 閱讀:143 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“vue組合式API入門實(shí)例代碼分析”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“vue組合式API入門實(shí)例代碼分析”吧!

組合式API

在vue3.0發(fā)布的時(shí)候,組合式API也隨著發(fā)布會(huì)進(jìn)入到大眾的視野。官網(wǎng)把原來的使用方式命名為選項(xiàng)式API,同時(shí)官網(wǎng)也明確表示選項(xiàng)式API是由組合式API所實(shí)現(xiàn)的,所以大概后面vue的主推方向應(yīng)該就是組合式API了。

我學(xué)習(xí)框架的方法是從語法到詞法,再到運(yùn)行狀態(tài)。那么先從語法開始學(xué)習(xí),照舊還是以官網(wǎng)為例。

//代碼一
<script setup> 
    import { ref, onMounted } from 'vue' 
    // 響應(yīng)式狀態(tài) 
    const count = ref(0) 
    // 用來修改狀態(tài)、觸發(fā)更新的函數(shù) 
    function increment() { 
        count.value++ 
    }
    // 生命周期鉤子 
    onMounted(() => { 
        console.log(`The initial count is ${count.value}.`)
    })
</script>
<template>
    <button @click="increment">Count is: {{ count }}</button> 
</template>

可以看出,組合式API和原來的選項(xiàng)式API還是有差別的,原來的選項(xiàng)式API可以直接使用生命周期,變量聲明之類的內(nèi)置方法,組合式API則需要先引入再使用。

先聲明一下,這個(gè)不是vue3.0版本的組合式API寫法,是vue3.2版本發(fā)布時(shí)的語法糖,但是也是我個(gè)人建議使用的方法,畢竟不推薦的話也不會(huì)出這個(gè)語法糖。3.0版本的寫法有些繁瑣,但是大致上大差不差。

//代碼二
import { reactive } from 'vue' 
export default {
    // `setup` 是一個(gè)專門用于組合式 API 的特殊鉤子函數(shù) 
    setup() { 
        const state = reactive({ count: 0 })
        // 暴露 state 到模板
        return { state }
    }
}

這個(gè)是最初的組合式API的寫法,比起新版的語法糖只是多了一個(gè)setup和需要將變量return出來,而這個(gè)setup就是我認(rèn)為的組合式API的核心。

setup

最初的響應(yīng)式API以 setup 函數(shù)作為入口函數(shù), setup函數(shù)必須返回兩種類型的值:第一是對象,第二是函數(shù)。

當(dāng) setup 函數(shù)返回對象時(shí),對象中的數(shù)據(jù)或方法可以在 template中被使用,也就相當(dāng)于data函數(shù)里面的變量。當(dāng) setup函數(shù)返回函數(shù)時(shí),函數(shù)會(huì)被作為 render 函數(shù)。

不過可預(yù)見的是當(dāng)頁面數(shù)據(jù)量變大的時(shí)候,setup函數(shù)會(huì)變得巨大,而且return的內(nèi)容也會(huì)膨脹,所以vue3.2的語法糖省略了setup函數(shù)的包裹,而是直接將setup放到script里面,里面的代碼就等同于放到了setup函數(shù)中,而且還省略了return的步驟。雖然沒有寫出setup函數(shù),但是這段代碼的本質(zhì)就是setup函數(shù)的執(zhí)行。

變量聲明

setup函數(shù)執(zhí)行之后,里面的變量會(huì)被直接暴露給組件,由組件使用。就以最上面的代碼一中的count為例,count被聲明之后就可以放到template里面,還可以被increment函數(shù)修改后在頁面中更新,這個(gè)就是靠ref方法,但是說ref之前先要說一下組合式API生命對象的方法reactive。

代碼二中的state就是reactive方法聲明的對象,reactive和ref一樣,都是用來聲明變量的,只有通過這兩個(gè)方法聲明后的變量才能做到響應(yīng)式更新。這里其實(shí)是vue為了讓用戶簡單而導(dǎo)致的復(fù)雜,具體說比較復(fù)雜,我就簡單說說吧。

vue3依然是響應(yīng)式的架構(gòu),通過對聲明的變量監(jiān)聽從而收集到變量的修改事件,已達(dá)到響應(yīng)式更新的功能。對vue3有一些了解的用戶都知道,vue3用的是proxy,但是proxy只能做到對對象代理,如果使用了原始類型,像是string,number之類的就沒有辦法了,所以vue3為了監(jiān)聽原始類型的數(shù)據(jù),使用ref去聲明原始類型,從而將原始類型變成對象,看起來通過ref聲明后的依然是原始類型,實(shí)際上我們修改的是這個(gè)變量的value的值,而不是這個(gè)對象的值。

組合式API還有一點(diǎn)就是無法直接修改聲明的變量值。以代碼一為例,無論是count = 3還是count=ref(3)都會(huì)導(dǎo)致顯示無法更新。同樣的,代碼二中的state的修改也不可以直接通過state=reactive({a:23})或者state = {a:23}的方式修改。

雖說ref也可以用來生命對象,不過還是不太建議,畢竟還是按照文檔的方式去寫才能做到最方便的維護(hù),畢竟比維護(hù)別人的爛代碼更難受的就是維護(hù)自己的爛代碼。

當(dāng) ref 在模板中作為頂層屬性被訪問時(shí),它們會(huì)被自動(dòng)“解包”,所以不需要使用 .value。所以代碼一中,template中的count不需要寫作count.value。

說回組合式API,變量修改之后,組合式API和選項(xiàng)式API一樣,是無法做到立刻將顯示更新的,所以想要獲取到變量修改后的頁面元素就需要nextTick,用法和vue的nextTick是一樣的,就不多贅述了。

目前比起選項(xiàng)式API的優(yōu)點(diǎn)

從代碼一和代碼二中可以看出,組合式API里面不需要將變量放到data里面,函數(shù)放到method里面,這樣的話可以讓有相關(guān)性的變量和函數(shù)放到一起。開發(fā)選項(xiàng)式API的時(shí)候當(dāng)頁面數(shù)據(jù)量大的時(shí)候在method寫函數(shù)的時(shí)候忘記了變量名稱,就需要滑到data里面看一下,然后在滑回method繼續(xù)寫函數(shù)。組合式API不能說完全避免,但是能大大減少這種情況的出現(xiàn)。

生命周期

vue組合式API入門實(shí)例代碼分析

生命周期官網(wǎng)圖片還是挺全的,基本上和選項(xiàng)式API差不多,就是改改名字,去掉了create,改用setup。

Vue2.xVue3
beforeCreatesetup
created
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeDestroyonBeforeUnmount
destroyedonUnmounted

從這篇文章中找到了一個(gè)對比的列表,大體上是可以一一對應(yīng)的。生命周期的邏輯我就不多贅述了,由于用法不同,所以這里我就根據(jù)代碼一放一個(gè)錯(cuò)誤的例子。

setTimeout(() => { 
    onMounted(() => { 
        // 異步注冊時(shí)當(dāng)前組件實(shí)例已丟失 
        // 這將不會(huì)正常工作 }) 
     }, 100
 )

生命周期可以放到函數(shù)里面,然后在setup里面調(diào)用,但是不能放到異步函數(shù)里面。

感謝各位的閱讀,以上就是“vue組合式API入門實(shí)例代碼分析”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對vue組合式API入門實(shí)例代碼分析這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI