Appearance
Vue Hooks Plus
简介
Vue Hooks Plus是一个基于 Vue3 Composition API 的 Hooks 库,提供了丰富的 Hooks 来帮助开发者更好地管理状态和副作用。它包含了请求数据、管理状态、处理副作用等多种功能,可以大大提高开发效率和代码质量。
安装
bash
npm install @vueuse/core vue-hooks-plus
# 或
yarn add @vueuse/core vue-hooks-plus
# 或
pnpm add @vueuse/core vue-hooks-plus基本使用
配置 Vue Hooks Plus
在 Vue 应用中设置 Vue Hooks Plus:
typescript
// main.ts
import { createApp } from 'vue'
import { createVhpConfig } from 'vue-hooks-plus'
import App from './App.vue'
const app = createApp(App)
// 配置 Vue Hooks Plus
createVhpConfig({
// 可选配置
requestConfig: {
// 全局请求配置
manual: false, // 是否手动触发请求
retryCount: 3, // 失败重试次数
timeout: 10000, // 超时时间
pollingInterval: 0, // 轮询间隔时间
},
})
app.mount('#app')基本请求
使用 useRequest 钩子发起请求:
vue
<script setup lang="ts">
import { useRequest } from 'vue-hooks-plus'
// 定义获取数据的函数
const fetchUsers = async () => {
const response = await fetch('https://api.example.com/users')
if (!response.ok) {
throw new Error('网络请求失败')
}
return response.json()
}
// 使用 useRequest 钩子
const {
data: users,
loading,
error,
run,
refresh,
} = useRequest(fetchUsers, {
// 请求配置
manual: false, // 自动发起请求
onSuccess: (result) => {
console.log('请求成功:', result)
},
onError: (error) => {
console.error('请求失败:', error)
},
})
</script>
<template>
<div>
<h1>用户列表</h1>
<button @click="refresh">刷新数据</button>
<div v-if="loading">加载中...</div>
<div v-else-if="error">加载失败: {{ error?.message }}</div>
<div v-else>
<ul>
<li v-for="user in users" :key="user.id">
{{ user.name }}
</li>
</ul>
</div>
</div>
</template>带参数的请求
vue
<script setup lang="ts">
import { ref } from 'vue'
import { useRequest } from 'vue-hooks-plus'
const userId = ref(1)
const fetchUserById = async (id: number) => {
const response = await fetch(`https://api.example.com/users/${id}`)
if (!response.ok) {
throw new Error('网络请求失败')
}
return response.json()
}
// 使用带参数的请求
const {
data: user,
loading,
error,
run: fetchUser,
} = useRequest(fetchUserById, {
defaultParams: [userId.value], // 默认参数
refreshDeps: [userId], // 依赖更新时自动刷新
})
const changeUser = (id: number) => {
userId.value = id
}
</script>高级功能
轮询请求
typescript
const { data, loading, run, cancel } = useRequest(fetchUsers, {
pollingInterval: 3000, // 每 3 秒轮询一次
pollingWhenHidden: false, // 页面隐藏时暂停轮询
})
// 手动取消轮询
cancel()防抖与节流
typescript
// 防抖请求
const { data, loading, run } = useRequest(fetchUsers, {
debounceWait: 300, // 300ms 防抖
})
// 节流请求
const { data, loading, run } = useRequest(fetchUsers, {
throttleWait: 300, // 300ms 节流
})缓存与预加载
typescript
// 启用缓存
const { data, loading } = useRequest(fetchUsers, {
cacheKey: 'users', // 缓存标识
cacheTime: 300000, // 缓存时间 5 分钟
staleTime: 0, // 过期时间
})
// 预加载数据
const { data, loading } = useRequest(fetchUsers, {
cacheKey: 'users',
preload: true, // 开启预加载
})并行请求
typescript
import { useRequests } from 'vue-hooks-plus'
const [userRequest, orderRequest] = useRequests([
{
requestFn: fetchUsers,
defaultParams: [],
},
{
requestFn: fetchOrders,
defaultParams: [],
},
])性能优化
请求配置
typescript
const { data, loading } = useRequest(fetchUsers, {
// 请求配置选项
refreshOnWindowFocus: true, // 窗口获得焦点时刷新
focusTimespan: 5000, // 防止频繁刷新
loadingDelay: 300, // 延迟显示加载状态
retryCount: 3, // 错误重试次数
retryInterval: 1000, // 重试间隔
cacheTime: 300000, // 缓存时间
staleTime: 0, // 过期时间
throttleWait: 300, // 节流等待时间
debounceWait: 300, // 防抖等待时间
})依赖请求
vue
<script setup lang="ts">
import { ref } from 'vue'
import { useRequest } from 'vue-hooks-plus'
const userId = ref(null)
// 获取用户信息
const { data: user } = useRequest(() => fetchUser(userId.value), {
ready: !!userId.value, // 只有当 userId 有值时才发起请求
})
// 获取用户订单
const { data: orders } = useRequest(() => fetchUserOrders(userId.value), {
ready: !!user.value, // 只有当用户信息加载完成后才请求订单
})
</script>错误处理
全局错误处理
typescript
// main.ts
import { createVhpConfig } from 'vue-hooks-plus'
createVhpConfig({
requestConfig: {
// 全局错误处理
onError: (error) => {
console.error('请求错误:', error)
// 可以触发全局错误通知
},
},
})组件级错误处理
vue
<script setup lang="ts">
import { useRequest } from 'vue-hooks-plus'
const { data, loading, error, refresh } = useRequest(fetchUsers, {
onError: (err) => {
// 组件级错误处理
console.error('获取用户失败:', err)
// 可以显示错误通知或执行其他操作
},
})
</script>
<template>
<div>
<div v-if="error" class="error-banner">
<p>{{ error?.message || '发生错误' }}</p>
<button @click="refresh">重试</button>
</div>
<!-- 其他内容 -->
</div>
</template>与其他库集成
与 Axios 集成
typescript
import axios from 'axios'
import { useRequest } from 'vue-hooks-plus'
// 创建 axios 实例
const api = axios.create({
baseURL: 'https://api.example.com',
timeout: 10000,
headers: {
'Content-Type': 'application/json',
},
})
// 在请求中使用 axios
const useUsers = () => {
return useRequest(() => api.get('/users'), {
formatResult: (response) => response.data,
})
}
// 发起 POST 请求
const useCreateUser = () => {
return useRequest((user) => api.post('/users', user), {
manual: true, // 手动触发
})
}与 Pinia 集成
typescript
// stores/request.ts
import { defineStore } from 'pinia'
import { useRequest } from 'vue-hooks-plus'
export const useRequestStore = defineStore('request', () => {
// 封装请求 hook
const useUserRequest = () => {
return useRequest(() => api.get('/users'), {
cacheKey: 'users',
staleTime: 300000, // 5 分钟过期
})
}
// 刷新用户数据
const refreshUsers = () => {
const { refresh } = useUserRequest()
refresh()
}
return {
useUserRequest,
refreshUsers,
}
})