Vue3 Hooks使用實(shí)戰(zhàn)
前言
在 Vue.js 應(yīng)用開(kāi)發(fā)中,隨著業(yè)務(wù)邏輯的復(fù)雜化,組件常常需要處理重復(fù)的邏輯(如數(shù)據(jù)獲取、表單驗(yàn)證、事件監(jiān)聽(tīng)、全局狀態(tài)管理)。傳統(tǒng)的做法是將這些邏輯直接寫(xiě)在組件內(nèi)部,導(dǎo)致代碼冗余、難以維護(hù),且違反“關(guān)注點(diǎn)分離”原則。Vue 3 引入的組合式 API(Composition API)為邏輯復(fù)用提供了更優(yōu)雅的解決方案:Vue Hook,能夠?qū)顟B(tài)、方法和生命周期鉤子等邏輯獨(dú)立出來(lái),從而讓組件代碼更加清晰、易于維護(hù)。
一、核心概念與作用
1.1 什么是 Vue Hooks
Hooks 并不是 Vue 特有的概念,它最初來(lái)源于 React 16 之后的一種新的函數(shù)式編程思維。在 React 中,Hooks 提供了一系列以 use 開(kāi)頭的函數(shù),允許開(kāi)發(fā)者在函數(shù)式組件中完成生命周期、狀態(tài)管理、邏輯復(fù)用等幾乎全部組件開(kāi)發(fā)工作。
在Vue 3中,Hooks 結(jié)合了 Vue 的響應(yīng)式系統(tǒng),成為了一種強(qiáng)大的狀態(tài)邏輯封裝與復(fù)用機(jī)制。允許開(kāi)發(fā)者將Vue組件的邏輯拆分成多個(gè)獨(dú)立的、可復(fù)用的函數(shù),這些函數(shù)就被稱為 Hooks。每個(gè) Hooks 都封裝了一段具有狀態(tài)邏輯的代碼,可以在多個(gè)組件中共享和復(fù)用。
1.2 核心價(jià)值
- 邏輯復(fù)用:將通用邏輯(如數(shù)據(jù)請(qǐng)求、表單驗(yàn)證、鼠標(biāo)追蹤)封裝成獨(dú)立函數(shù),避免代碼重復(fù)。相比 Vue 2 的 Mixins,Hooks 避免了命名沖突和來(lái)源不明的問(wèn)題。
- 代碼組織更清晰:按“邏輯關(guān)注點(diǎn)”而非“選項(xiàng)類型”組織代碼。例如,將一個(gè)功能相關(guān)的狀態(tài)、方法、生命周期鉤子放在一起,而不是分散在 data、methods、mounted 中。
- 更好的 TypeScript 支持:基于函數(shù)的組合天然適合類型推導(dǎo),無(wú)需額外配置即可獲得精準(zhǔn)的類型提示。
- 簡(jiǎn)化復(fù)雜組件:大型組件可拆分為多個(gè)小的 Hook,每個(gè) Hook 負(fù)責(zé)單一職責(zé),提升可維護(hù)性。
二、基礎(chǔ) Hooks 分類
Vue 3 內(nèi)置了一系列基礎(chǔ) Hooks,用于實(shí)現(xiàn)響應(yīng)式、生命周期管理等核心功能。
2.1 響應(yīng)式狀態(tài)
用于創(chuàng)建和管理響應(yīng)式數(shù)據(jù),如下表所示。
| Hook | 作用 |
|---|---|
| ref | 創(chuàng)建基本類型(或?qū)ο螅┑捻憫?yīng)式數(shù)據(jù)(通過(guò).value訪問(wèn)) |
| reactive | 創(chuàng)建對(duì)象類型的響應(yīng)式數(shù)據(jù)(直接訪問(wèn)屬性) |
| toRef | 將響應(yīng)式對(duì)象的屬性轉(zhuǎn)為ref(保持響應(yīng)式關(guān)聯(lián)) |
| toRefs | 將響應(yīng)式對(duì)象的所有屬性轉(zhuǎn)為ref對(duì)象(用于解構(gòu)) |
| watch | 監(jiān)聽(tīng)響應(yīng)式數(shù)據(jù)變化(顯式指定監(jiān)聽(tīng)源) |
| watchEffect | 自動(dòng)追蹤響應(yīng)式依賴,依賴變化時(shí)執(zhí)行(無(wú)需顯式指定源) |
<script setup lang="ts">
import { ref, reactive, toRef, toRefs } from 'vue'
const count = ref(0)
const user = reactive({ name: '張三', age: 20 })
const nameRef = toRef(user, 'name')
const { name, age } = toRefs(user) // 解構(gòu)后仍保持響應(yīng)式
</script>2.2 計(jì)算與監(jiān)聽(tīng)
| Hook | 作用 |
|---|---|
| computed | 創(chuàng)建計(jì)算屬性(依賴響應(yīng)式數(shù)據(jù),自動(dòng)緩存結(jié)果) |
| watch | 監(jiān)聽(tīng)響應(yīng)式數(shù)據(jù)變化(顯式指定監(jiān)聽(tīng)源) |
| watchEffect | 自動(dòng)追蹤響應(yīng)式依賴,依賴變化時(shí)執(zhí)行(無(wú)需顯式指定源) |
<script setup lang="ts">
import { ref, computed, watchEffect } from 'vue'
const count = ref(0)
const doubleCount = computed(() => count.value * 2)
watchEffect(() => {
console.log(`count當(dāng)前值:${count.value}`)
})
</script>2.3 生命周期Hooks
在 Composition API 中以函數(shù)形式存在,需在 setup 或 <script setup> 中使用。
| Hook | 對(duì)應(yīng)Vue 2生命周期 | 作用 |
|---|---|---|
| onMounted | mounted | 組件掛載后執(zhí)行 |
| onUpdated | updated | 組件更新后執(zhí)行 |
| onUnmounted | unmounted | 組件卸載后執(zhí)行 |
| onBeforeMount | beforeMount | 組件掛載前執(zhí)行 |
| onBeforeUpdate | beforeUpdate | 組件更新前執(zhí)行 |
| onBeforeUnmount | beforeDestroy | 組件卸載前執(zhí)行 |
| onErrorCaptured | 捕獲子組件錯(cuò)誤時(shí)執(zhí)行 | |
| onActivated | 緩存組件(KeepAlive)激活時(shí)執(zhí)行 | |
| onDeactivated | 緩存組件失活時(shí)執(zhí)行 |
<script setup lang="ts">
import { onMounted, onUnmounted } from 'vue'
onMounted(() => {
console.log('組件掛載完成')
// 例如:初始化定時(shí)器、事件監(jiān)聽(tīng)
})
onUnmounted(() => {
console.log('組件卸載完成')
// 例如:清除定時(shí)器、事件監(jiān)聽(tīng)
})
</script>2.4 其他基礎(chǔ)Hooks
| Hook | 作用 |
|---|---|
| shallowRef | 創(chuàng)建"淺響應(yīng)式"數(shù)據(jù)(僅頂層響應(yīng)式) |
| shallowReactive | 創(chuàng)建"淺響應(yīng)式"對(duì)象(僅頂層屬性響應(yīng)式) |
| readonly | 創(chuàng)建只讀響應(yīng)式數(shù)據(jù)(禁止修改) |
<script setup lang="ts">
import { reactive, toRef, toRefs, shallowRef, readonly } from 'vue'
const user = reactive({ name: '張三', age: 20 })
const nameRef = toRef(user, 'name')
const { name, age } = toRefs(user) // 解構(gòu)后仍保持響應(yīng)式
const obj = shallowRef({ a: 1 }) // 修改obj.value.a不會(huì)觸發(fā)更新,需重新賦值obj.value才會(huì)更新
const readOnlyUser = readonly(user) // 修改readOnlyUser.name會(huì)報(bào)錯(cuò)
</script>三、Hooks 的基本使用
在 Vue3 中,自定義 Hooks 函數(shù)是提升代碼復(fù)用性和組織性的重要手段,可以將狀態(tài)管理、業(yè)務(wù)邏輯等封裝在自定義 Hook 中。這些函數(shù)是使用 Composition API 創(chuàng)建的,可以包含任意的組合邏輯,并且可以在多個(gè)組件之間共享。通過(guò)封裝可復(fù)用的邏輯代碼,開(kāi)發(fā)者可以更加高效地構(gòu)建和維護(hù)大型應(yīng)用。
3.1 創(chuàng)建 Hooks 函數(shù)
一般我們會(huì)在 src 文件夾下新建一個(gè) hooks 文件夾,用于統(tǒng)一存放程序中用到的 hooks 代碼。下面結(jié)合實(shí)例來(lái)寫(xiě)一個(gè)簡(jiǎn)單的 hooks,如下圖所示。

自定義 Hook 是一個(gè)普通的 JavaScript 函數(shù),通常以 use 開(kāi)頭命名,它可以使用 Composition API 提供的函數(shù)來(lái)管理狀態(tài)和副作用。我們?cè)?src 文件夾下新建 hooks 文件夾后,在里面新建一個(gè) useCounter.js 文件,代碼如下:
import { ref } from 'vue'
// 定義一個(gè)名為useCounter的Hook
export function useCounter(initVal = 0) {
// 定義一個(gè)響應(yīng)式狀態(tài)
const count = ref(initVal);
// 定義一個(gè)增加狀態(tài)的方法
const increment = () => {
count.value++;
};
// 定義一個(gè)減少狀態(tài)的方法
const decrement = () => {
count.value--;
};
// 定義一個(gè)重置狀態(tài)的方法
const reset = () => {
count.value = initVal;
};
// 返回狀態(tài)和方法供外部調(diào)用
return { count, increment, decrement, reset };
}
3.2 使用自定義 Hook
在上面的示例中,我們定義了一個(gè)名為 useCounter 的 Hook,它封裝了一個(gè)響應(yīng)式狀態(tài)和三個(gè)操作狀態(tài)的方法。使用自定義 Hooks 非常簡(jiǎn)單,只需在組件的 <script setup> 中引入并調(diào)用,解構(gòu)出所需的屬性和方法即可直接在模板中使用:
<script setup>
import { useCounter } from '@/hooks/useCounter'
// 直接解構(gòu)即用,無(wú)需重復(fù)定義變量
const { count, increment, reset } = useCounter(10)
</script>
<template>
<div>當(dāng)前計(jì)數(shù): {{ count }}</div>
<button @click="increment">+</button>
<button @click="reset">重置</button>
</template>
在上面的示例中,在組件的 setup 函數(shù)中,調(diào)用useCounter Hook 獲取狀態(tài)和方法,并將其暴露給模板使用。這樣,我們就成功地實(shí)現(xiàn)了狀態(tài)的封裝和復(fù)用。
四、Hooks 的最佳實(shí)踐
4.1 設(shè)計(jì)原則
自定義 Hooks 是為了處理組件邏輯的一種模式,它可以讓我們?cè)诓皇褂媒M件之間復(fù)制粘貼代碼的情況下重用狀態(tài)邏輯。自定義 hooks 是簡(jiǎn)單的 JavaScript 函數(shù),但是在使用時(shí),需要遵循以下:
- 命名規(guī)范:使用 use 前綴來(lái)命名 Hooks 函數(shù),以區(qū)別于普通的 JavaScript 函數(shù),例如 useCounter、useFetch 等。
- 單一職責(zé)原則:每個(gè) Hooks 函數(shù)應(yīng)該只負(fù)責(zé)一項(xiàng)功能,例如 useLocalStorage 負(fù)責(zé)本地存儲(chǔ)操作,這有助于保持代碼的可讀性和可維護(hù)性,避免將多個(gè)不相關(guān)邏輯混入同一 Hooks。
- 避免副作用:盡量將副作用(如 DOM 操作、網(wǎng)絡(luò)請(qǐng)求等)放在生命周期鉤子中處理,而不是直接在 Hooks 函數(shù)內(nèi)部進(jìn)行。
- 參數(shù)化:為了使 Hooks 函數(shù)更加通用,可以通過(guò)參數(shù)來(lái)傳遞不同的配置或初始值。
- 組合與嵌套:Hooks 函數(shù)之間可以相互調(diào)用和組合,從而構(gòu)建出更復(fù)雜的功能,但需要注意避免循環(huán)依賴和無(wú)限遞歸。
- 文檔與注釋:為 Hooks 函數(shù)添加適當(dāng)?shù)奈臋n和注釋,說(shuō)明其用途、參數(shù)和返回值,這將有助于其他開(kāi)發(fā)者理解和使用 Hooks 函數(shù)。
五、總結(jié)
Hooks 作為 Vue 3 中引入的一種新的狀態(tài)邏輯封裝與復(fù)用機(jī)制,為我們提供了一種更加靈活和高效的方式來(lái)組織和復(fù)用代碼。通過(guò)學(xué)習(xí)和掌握 Hooks 的使用,我們可以更好地應(yīng)對(duì)復(fù)雜的 Vue 項(xiàng)目開(kāi)發(fā)需求,提高代碼的可維護(hù)性和可讀性。同時(shí),Hooks 也為我們提供了一種全新的函數(shù)式編程思維方式,有助于我們更好地理解和掌握 Vue 的開(kāi)發(fā)精髓。
到此這篇關(guān)于Vue3 Hooks使用實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Vue3 Hooks使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue3封裝Hooks實(shí)現(xiàn)圖片懶加載指南
- Vue3官方Hooks的用法與實(shí)現(xiàn)原理
- Vue3使用hooks解決字典數(shù)據(jù)的顯示問(wèn)題
- Vue3通過(guò)hooks方式封裝節(jié)流和防抖的代碼詳解
- Vue3封裝hooks實(shí)現(xiàn)實(shí)時(shí)獲取麥克風(fēng)音量
- Vue3中Hooks封裝的技巧詳解
- Vue3自定義Hooks函數(shù)的使用詳解
- 詳解hooks在vue3中的使用方法及示例
- vue3的hooks用法總結(jié)
- vue3中hooks的概述及用法小結(jié)
- Vue3通過(guò)ref操作Dom元素及hooks的使用方法
相關(guān)文章
詳解Vue開(kāi)發(fā)網(wǎng)站seo優(yōu)化方法
這篇文章主要介紹了Vue開(kāi)發(fā)網(wǎng)站seo優(yōu)化方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
vue項(xiàng)目npm?run?build打包dist文件及打包后空白解決辦法
npm run build 這個(gè)命令會(huì)執(zhí)行Vue CLI中預(yù)定義的打包配置,并將打包后的文件存放在"dist"文件夾中,這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目npm?run?build打包dist文件及打包后空白的解決辦法,需要的朋友可以參考下2023-10-10
vue數(shù)組中不滿足條件跳出循環(huán)問(wèn)題
這篇文章主要介紹了vue數(shù)組中不滿足條件跳出循環(huán)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Vue實(shí)現(xiàn)星級(jí)評(píng)價(jià)效果實(shí)例詳解
這篇文章主要介紹了Vue實(shí)現(xiàn)星級(jí)評(píng)價(jià)效果的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
Vue之elementUI下拉菜單dropdown組件中command方法添加額外參數(shù)方式
這篇文章主要介紹了Vue之elementUI下拉菜單dropdown組件中command方法添加額外參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06
Vue v2.5 調(diào)整和更新不完全問(wèn)題
這篇文章主要介紹了Vue v2.5 調(diào)整和更新不完全問(wèn)題的相關(guān)資料,需要的朋友可以參考下2017-10-10

