VUE3封装一个Hook

news/2025/1/11 10:10:38/

在 Vue 3 中,Composition API 让我们能够封装和复用代码逻辑,尤其是通过 setup 函数进行组件间的复用。为了提高代码的可复用性,我们可以把一些常见的 API 请求和状态管理逻辑封装到一个单独的 hook 中。

以下是一个简单的例子,我们将封装一个用于获取用户数据的 API 请求,并提供用于处理请求的状态、错误和数据的逻辑:

示例:封装 API 请求 Hook
javascript">// useUserData.ts
import { ref } from 'vue'
import { getUserData } from '@/api/user'  // 假设这是你定义的API请求export function useUserData() {const userData = ref(null)  // 存储用户数据const isLoading = ref(false)  // 请求加载状态const error = ref(null)  // 错误信息// 获取用户数据的函数const fetchUserData = async () => {isLoading.value = trueerror.value = nulltry {const response = await getUserData()  // 假设这是一个返回用户数据的 API 请求userData.value = response.data} catch (err) {error.value = err.message || '获取数据失败'} finally {isLoading.value = false}}// 返回状态和操作return {userData,isLoading,error,fetchUserData,}
}
组件中使用这个 Hook
javascript">// UserProfile.vue
<template><div><button @click="fetchUserData" :disabled="isLoading">获取用户数据</button><div v-if="isLoading">加载中...</div><div v-if="error">{{ error }}</div><div v-if="userData"><p>用户名:{{ userData.name }}</p><p>年龄:{{ userData.age }}</p><!-- 更多用户信息展示 --></div></div>
</template><script lang="ts" setup>
import { useUserData } from '@/hooks/useUserData'  // 引入封装好的Hook// 使用 Hook
const { userData, isLoading, error, fetchUserData } = useUserData()// 在组件加载时触发获取用户数据
onMounted(() => {fetchUserData()
})
</script>

优化:

通过将 API 请求逻辑和状态管理封装到 useUserData 中,你可以在不同的组件中轻松复用这一逻辑,只需要导入并调用 useUserData 即可。这样,组件的逻辑更加简洁,同时 API 请求逻辑也可以集中管理,增强了代码的可维护性和复用性。

举个例子:

假设你有多个页面或组件需要进行用户数据的请求,你只需要在这些组件中调用 useUserData,而无需重复编写相同的请求和状态管理逻辑。

另一个组件复用

javascript">// UserDetails.vue
<template><div><h3>User Details</h3><button @click="fetchUserData" :disabled="isLoading">获取用户数据</button><div v-if="isLoading">加载中...</div><div v-if="error">{{ error }}</div><div v-if="userData"><p>用户名:{{ userData.name }}</p><p>电子邮件:{{ userData.email }}</p></div></div>
</template><script lang="ts" setup>
import { useUserData } from '@/hooks/useUserData'const { userData, isLoading, error, fetchUserData } = useUserData()onMounted(() => {fetchUserData()
})
</script>

通过这种封装的方式,API 请求和相关的状态管理都得到了有效的抽象。每个需要获取用户数据的组件,只需简单调用 useUserData,使得代码变得更简洁、可维护且易于复用。


http://www.ppmy.cn/news/1561938.html

相关文章

Oracle:ORA-00904: “10“: 标识符无效报错详解

1.报错Oracle语句如下 SELECT YK_CKGY.ID,YK_CKGY.DJH,YK_CKGY.BLRQ,YK_CKGY.ZBRQ,YK_CKGY.SHRQ,YK_CKGY.YT,YK_CKGY.ZDR,YK_CKGY.SHR,YK_CKGY.BZ,YK_CKGY.JZRQ,YK_CKGY.ZT,YK_CKGY.CKLX,(case YK_CKGY.CKLXwhen 09 then药房调借when 02 then科室退药when 03 then损耗出库when…

MySQL使用C语言连接

目录 1. MySQL官方下载2. Connector/C的使用3. MySQL接口介绍3.1 初始化函数3.2 链接数据库函数3.3 下发mysql命令函数3.4 获取执行结果函数3.5 获取结果行、列、列名函数3.6 获取结果内容函数3.7 关闭mysql链接函数 1. MySQL官方下载 &#xff08;1&#xff09;有了mysql的基…

在Windows上 安装使用repo

一、repo简介 一个大型项目通常会有多个仓库构成&#xff0c;比如 Android 项目&#xff0c;通过 manifest 清单&#xff08;xml 文件&#xff09;定义一个项目中各个 git 代码仓库的关联&#xff0c;而 repo 就是在这种项目组织方式下的一个用于多仓库协同开发和代码评审的一…

拥抱时代--AI(8)

前一期博文我们重点分享了kmeans聚类的方法&#xff0c;有了前面的基础我们本期会和大家再就knn&#xff0c; 做点简单分享后&#xff0c;就重点介绍决策树算法。如有问题&#xff0c;欢迎大家随时沟通指教&#xff01; KNN模型 KNN模型&#xff08;K-Nearest Neighbors&…

【机器学习】无监督学习麾下 K-means 聚类如何智能划分,解锁隐藏结构,为市场细分、图像分割、基因聚类精准导航

&#x1f31f;个人主页&#xff1a;落叶 &#x1f31f;当前专栏: 深度学习专栏 目录 1. 引言 2. 聚类算法概述 2.1 聚类算法的定义 2.2 聚类的类型 3. 聚类算法的数学基础 3.1 距离度量 3.2 聚类评估标准 4. 常见的聚类算法 K-means 聚类的深入分析与扩展 1. K-means …

asp.net core webapi 并发请求时 怎么保证实时获取的用户信息是此次请求的?

对于并发请求&#xff0c;每个请求会被分配到一个独立的线程或线程池工作线程上。通过 HttpContext 或 AsyncLocal&#xff0c;每个线程都能独立地获取到它自己的上下文数据。由于这些数据是与当前请求相关的&#xff0c;因此在并发请求时不会互相干扰。 在并发请求时&#xf…

scala代码打包配置(maven)

目录 mavenpom.xml打包配置项&#xff08;非完整版&#xff0c;仅含打包的内容< build>&#xff09;pom.xml完整示例&#xff08;需要修改参数&#xff09;效果说明 maven 最主要的方式还是maven进行打包&#xff0c;也好进行配置项的管理 以下为pom文件&#xff08;不要…