Vue3.0中Hook最常出現(xiàn)的使用實(shí)例
前言
Vue 3 的 Hook(Composition API)相比 Options API 最大的“好用”在于:把“邏輯”從“組件”里解耦出來,變成可復(fù)用、可組合、可測試的獨(dú)立函數(shù)。
下面給出 4 個(gè)在真實(shí)業(yè)務(wù)里最常出現(xiàn)、最能體現(xiàn)“爽點(diǎn)”的實(shí)例,每個(gè)都只有 30 行左右,復(fù)制即可運(yùn)行。
1. 鼠標(biāo)軌跡 —— 任意組件想跟鼠標(biāo),只需 1 行
// useMouse.ts
import { ref, onMounted, onUnmounted } from 'vue'
export function useMouse() {
const x = ref(0), y = ref(0)
const move = (e: MouseEvent) => { x.value = e.pageX; y.value = e.pageY }
onMounted(() => window.addEventListener('mousemove', move))
onUnmounted(() => window.removeEventListener('mousemove', move))
return { x, y }
}
<!-- AnyComponent.vue -->
<script setup>
import { useMouse } from '@/hooks/useMouse'
const { x, y } = useMouse()
</script>
<template>鼠標(biāo)實(shí)時(shí)位置 {{ x }}, {{ y }}</template>
爽點(diǎn):以前要在每個(gè)組件寫 mounted/beforeDestroy + 事件監(jiān)聽,現(xiàn)在 1 行搞定,且任意組件都能復(fù)用 。
2. 倒計(jì)時(shí)按鈕 —— 驗(yàn)證碼/發(fā)送短信最常用
// useCountDown.ts
import { ref, watchEffect } from 'vue'
export function useCountDown(start = 60) {
const count = ref(0)
const startCount = () => { count.value = start }
watchEffect(() => {
if (count.value <= 0) return
const t = setTimeout(() => { count.value-- }, 1000)
return () => clearTimeout(t) // 自動(dòng)清理
})
return { count, startCount, disabled: () => count.value > 0 }
}
<script setup>
import { useCountDown } from '@/hooks/useCountDown'
const { count, startCount, disabled } = useCountDown()
</script>
<template>
<button :disabled="disabled()" @click="startCount">
{{ count ? `${count}s后重試` : '發(fā)送驗(yàn)證碼' }}
</button>
</template>
爽點(diǎn):把“計(jì)時(shí)器+按鈕狀態(tài)”這一坨邏輯徹底抽走,頁面只剩模板語義 。
3. 異步表格 —— 分頁/搜索/加載一把梭
// useTable.ts
import { ref, watchEffect } from 'vue'
import axios from 'axios'
export function useTable(api: string) {
const loading = ref(false), data = ref([]), total = ref(0)
const page = ref(1), size = ref(10), search = ref('')
const refresh = () => {
loading.value = true
axios.get(api, { params: { page: page.value, size: size.value, search: search.value }})
.then((res) => { data.value = res.data.list; total.value = res.data.total })
.finally(() => { loading.value = false })
}
watchEffect(refresh) // 任意條件變化自動(dòng)重新拉數(shù)據(jù)
return { loading, data, total, page, size, search, refresh }
}
<script setup>
import { useTable } from '@/hooks/useTable'
const { loading, data, total, page, size, search } = useTable('/api/user')
</script>
<template>
<input v-model="search" placeholder="回車搜索"/>
<el-table v-loading="loading" :data="data"> ... </el-table>
<el-pagination v-model:current-page="page" v-model:page-size="size" :total="total"/>
</template>
爽點(diǎn):組件里再也看不到 loading/page/search 的膠水代碼,換任何業(yè)務(wù)字段只需改 api 即可 。
4. 全局狀態(tài) —— 不用 Pinia 也能輕量級共享
// useGlobalCount.ts
import { ref, computed } from 'vue'
const globalCount = ref(0)
export function useGlobalCount() {
const double = computed(() => globalCount.value * 2)
const inc = () => globalCount.value++
return { count: globalCount, double, inc }
}
<!-- A.vue -->
<script setup>
import { useGlobalCount } from '@/hooks/useGlobalCount'
const { count, double, inc } = useGlobalCount()
</script>
<template>
<p>{{ count }} / {{ double }}</p>
<button @click="inc">+1</button>
</template>
爽點(diǎn):多組件同時(shí)引入 useGlobalCount,數(shù)據(jù)天然同步,不用 provide/inject 也不依賴外部庫 。
一句話總結(jié)
Options API 是“把邏輯寫在組件里”,Hook 是“把邏輯寫成函數(shù)再插到組件里”。
上面 4 個(gè)例子覆蓋了事件、計(jì)時(shí)、異步、狀態(tài)四大高頻場景,基本能覆蓋 80 % 的日常需求;寫完一次,后續(xù)任意組件 import 即可,真正做到“寫好即用、用壞不改”。
到此這篇關(guān)于Vue3.0中Hook最常出現(xiàn)的使用實(shí)例的文章就介紹到這了,更多相關(guān)Vue3.0 Hook使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解vue-cli之webpack3構(gòu)建全面提速優(yōu)化
這篇文章主要介紹了詳解vue-cli之webpack3構(gòu)建全面提速優(yōu)化,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
vue-cli和v-charts實(shí)現(xiàn)可視化圖表過程解析
這篇文章主要介紹了vue-cli和v-charts實(shí)現(xiàn)可視化圖表過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
vue Element UI 解決表格數(shù)據(jù)不更新問題及解決方案
在使用Vue和ElementUI開發(fā)后臺管理系統(tǒng)時(shí),可能會遇到表格數(shù)據(jù)不更新的問題,這通常是因?yàn)閂ue的響應(yīng)式系統(tǒng)未檢測到數(shù)據(jù)變化或數(shù)據(jù)更新后未正確觸發(fā)視圖的重新渲染,本文給大家介紹vue Element UI 解決表格數(shù)據(jù)不更新問題,感興趣的朋友一起看看吧2024-10-10
Vue3如何對內(nèi)嵌Iframe組件進(jìn)行緩存
這篇文章主要介紹了Vue3如何對內(nèi)嵌Iframe組件進(jìn)行緩存問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
vue利用v-for嵌套輸出多層對象,分別輸出到個(gè)表的方法
今天小編就為大家分享一篇vue利用v-for嵌套輸出多層對象,分別輸出到個(gè)表的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09
vue3使用html2canvas實(shí)現(xiàn)網(wǎng)頁截圖并下載功能的全過程
html2canvas是一個(gè)JavaScript庫,用于將HTML元素轉(zhuǎn)換為Canvas圖像,保留CSS樣式和布局,支持多種瀏覽器和圖片格式,在Vue等項(xiàng)目中應(yīng)用廣泛,盡管有跨域、模糊等問題,通過配置優(yōu)化可有效解決2025-10-10
解決打包后出現(xiàn)錯(cuò)誤y.a.addRoute is not a function的
這篇文章主要介紹了解決打包后出現(xiàn)y.a.addRoute is not a function的問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
el-date-picker默認(rèn)結(jié)束為當(dāng)前時(shí)分秒的操作方法
在element?ui中的日期時(shí)間選擇組件中默認(rèn)是00:00,現(xiàn)在需求是點(diǎn)擊默認(rèn)結(jié)束時(shí)間為當(dāng)前時(shí)分秒,查了很多資料寫的都不準(zhǔn)確?,今天給大家分享el-date-picker默認(rèn)結(jié)束為當(dāng)前時(shí)分秒的操作方法,感興趣的朋友一起看看吧2024-01-01

