当前位置: 首页 > article >正文

VUE3封装一个Hook

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

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

示例:封装 API 请求 Hook
// 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 = true
    error.value = null
    try {
      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
// 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,而无需重复编写相同的请求和状态管理逻辑。

另一个组件复用

// 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.kler.cn/a/473332.html

相关文章:

  • HTML5 动画效果:淡入淡出(Fade In/Out)详解
  • OpenAI 故障复盘 - 阿里云容器服务与可观测产品如何保障大规模 K8s 集群稳定性
  • HTMLElement、customElements及元素拓展
  • Java语言的语法
  • TensorRT-LLM中的MoE并行推理
  • 5.1 数据库:INSERT 插入语句
  • C#Struct堆栈
  • MYSQL重置密码
  • Rakuten 乐天积分系统从 Cassandra 到 TiDB 的选型与实战
  • Mysql连接报错排查解决记录
  • docker学习记录:创建mongodb副本集
  • RAG应用在得物开放平台的智能答疑的探索
  • linux 服务器清理
  • Go语言的数据库编程
  • selenium在Linux环境下截屏(save_screenshot)中文乱码的问题
  • Go语言的 的垃圾回收(Garbage Collection)核心知识
  • 新版2024AndroidStudio项目目录结构拆分
  • vue3 + ts + element-plus(el-upload + vuedraggable实现上传OSS并排序)
  • Nginx入门笔记
  • 数据结构:LinkedList与链表—面试题(三)
  • DATACOM-广域网技术(ATM、PPP、PPPoE)-复习-实验
  • 【单片机】实现一个简单的ADC滤波器
  • 数据结构(1~10)
  • Flutter Web 中文字体显示异常问题
  • C++之闭散列哈希表
  • 使用 Python 的 pyttsx3 库进行文本转语音