VUE3封装一个Hook

news2025/1/10 6:19:17

在 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.coloradmin.cn/o/2274183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Elasticsearch:使用 Playground 与你的 PDF 聊天

LLMs作者&#xff1a;来自 Elastic Toms Mura 了解如何将 PDF 文件上传到 Kibana 并使用 Elastic Playground 与它们交互。本博客展示了在 Playground 中与 PDF 聊天的实用示例。 Elasticsearch 8.16 具有一项新功能&#xff0c;可让你将 PDF 文件直接上传到 Kibana 并使用 Pla…

RabbitMQ 在 Spring Boot 项目中的深度应用与实战解析

RabbitMQ 在 Spring Boot 项目中的深度应用与实战解析 引言 RabbitMQ 作为一款广受欢迎的开源消息队列系统&#xff0c;遵循 AMQP 协议&#xff0c;能够在分布式系统里实现应用程序之间的异步通信、解耦以及流量削峰等关键功能。在 Spring Boot 项目中集成 RabbitMQ&#xff…

简述视觉语言模型(Vision-Language Models, VLMs)

目录 1. 引言 2. 视觉语言模型的基本概念 什么是视觉语言模型 视觉语言模型的工作原理 3. 视觉语言模型的架构 双流神经网络结构 多模态对齐机制 跨模态注意力机制 统一架构&#xff1a;视觉-语言一体化模型 4. 视觉语言模型的关键技术 图像表示学习 文本表示学习 …

分治算法——优选算法

本章我们要学习的是分治算法&#xff0c;顾名思义就是分而治之&#xff0c;把大问题分为多个相同的子问题进行处理&#xff0c;其中我们熟知的快速排序和归并排序用的就是分治算法&#xff0c;所以我们需要重新回顾一下这两个排序。 一、快速排序&#xff08;三路划分&#xf…

迎接2025Power BI日期表创建指南:模板与最佳实践

故事背景 最近&#xff0c;我们收到了一些关于时间表更新的询问。询问的朋友发现&#xff0c;随着2025年的到来&#xff0c;2024年的日期表已不再适用。这是一个在数据分析领域常见的问题&#xff0c;每年都需要对日期表进行更新。 解决方案 鉴于创建和更新日期表是一项年度…

Trilium Notes中文版本地Docker部署与远程访问打造个人云知识库

文章目录 前言1. 安装docker与docker-compose2. 启动容器运行镜像3. 本地访问测试4.安装内网穿透5. 创建公网地址6. 创建固定公网地址 前言 今天和大家分享一款在G站获得了26K的强大的开源在线协作笔记软件&#xff0c;Trilium Notes的中文版如何在Linux环境使用docker本地部署…

【读书与思考】历史是一个好东西

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 导言 以后《AI日记》专栏我想专注于 AI 相关的学习、成长和工作等。而与 AI 无关的一些读书、思考和闲聊&#xff0c;我打算写到这里&#xff0c;我会尽量控制自己少想和少写。 下图的一些感想…

CSS——26. 伪元素2(“::before ,::after”)

::before伪类 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>伪元素</title><style type"text/css">div::before{content: "我最棒";}}</style></head><body><!--…

在macOS上安装MySQL

macOS的MySQL有多种不同的形式&#xff1a; 1、本机包安装程序&#xff0c;它使用本机macOS安装程序&#xff08;DMG&#xff09;引导您完成MySQL的安装。有关详细信息&#xff0c;请参阅第2.4.2节&#xff0c;“使用本机包在macOS上安装MySQL”。您可以将包安装程序与macOS一…

计算机网络 (32)用户数据报协议UDP

前言 用户数据报协议&#xff08;UDP&#xff0c;User Datagram Protocol&#xff09;是计算机网络中的一种重要传输层协议&#xff0c;它提供了无连接的、不可靠的、面向报文的通信服务。 一、基本概念 UDP协议位于传输层&#xff0c;介于应用层和网络层之间。它不像TCP那样提…

易支付二次元网站源码及部署教程

易支付二次元网站源码及部署教程 引言 在当今数字化时代&#xff0c;二次元文化逐渐成为年轻人生活中不可或缺的一部分。为了满足这一庞大用户群体的需求&#xff0c;搭建一个二次元主题网站显得尤为重要。本文将为您详细介绍易支付二次元网站源码的特点及其部署教程&#xf…

汽车扶手屏里的FPC应用有哪些?【新立电子】

汽车扶手屏作为现代汽车内饰设计的一大亮点&#xff0c;通常被安装在座椅扶手位置&#xff0c;其设计初衷是为了方便乘客在乘车过程中进行各种操作和控制。屏幕不仅具备触控功能&#xff0c;还支持语音控制、手势识别等多种交互方式&#xff0c;使得乘客可以更加轻松、直观地操…

初学stm32 --- DMA直接存储器

目录 DMA介绍 STM32F1 DMA框图 DMA处理过程 DMA通道 DMA优先级 DMA相关寄存器介绍 F1 DMA通道x配置寄存器&#xff08;DMA_CCRx&#xff09; DMA中断状态寄存器&#xff08;DMA_ISR&#xff09; DMA中断标志清除寄存器&#xff08;DMA_IFCR&#xff09; DMA通道x传输…

MT6835天玑6100平台规格参数_MTK联发科安卓核心板方案定制开发

联发科MT6835平台集成了蓝牙、FM、WLAN 和 GPS 模块&#xff0c;是一个高度集成的基带平台。该芯片集成了两个 Arm Cortex-A76 内核&#xff08;运行频率高达 2.2GHz&#xff09;、六个 Arm Cortex-A55 内核&#xff08;运行频率高达 2.0 GHz&#xff09;和强大的多标准视频编解…

认识+安装ElasticSearch

1. 为什么要学习ElasticSearch? 一般的来说,项目中的搜索功能尤其是电商项目,商品的搜索肯定是访问频率最高的页面之一。目前搜索功能是基于数据库的模糊搜索来实现的&#xff0c;存在很多问题。 1.1 数据库搜索所存在的问题 1.1.1 查询效率较低 由于数据库模糊查询不走索引&…

QPS和TPS 的区别是什么?QPS 大了会有什么问题,怎么解决?

QPS 和 TPS 的区别是什么&#xff1f;QPS 大了会有什么问题&#xff0c;怎么解决&#xff1f; QPS&#xff08;Queries Per Second&#xff09;和 TPS&#xff08;Transactions Per Second&#xff09;都是衡量系统性能的重要指标&#xff0c;尤其是在 Web 服务、数据库和分布…

Mac中配置vscode(第一期:python开发)

1、终端中安装 xcode-select --install #mac的终端中安装该开发工具 xcode-select -p #显示当前 Xcode 命令行工具的安装路径注意&#xff1a;xcode-select --install是在 macOS 上安装命令行开发工具(Command Line Tools)的关键命令。安装的主要组件包括&#xff1a;C/C 编…

【网络协议】静态路由详解

网络中的路由器通过以下两种方式之一发现远程网络&#xff1a; 静态配置路由动态路由协议 在本文&#xff0c;我们将学习关于静态路由的各种概念&#xff0c;例如如何配置静态路由、路由表如何进行决策、路由接口等相关知识。 文章目录 引言直连网络静态路由路由表原则原则1原…

【杂记】qt

1、终端下载PySide6以转换文件格式&#xff1a;pip install PySide6 -i https://pypi.tuna.tsinghua.edu.cn/simple 命令提示符下载完毕后&#xff1a;powerShell &#xff1a;cd 跳转到文件对应地址 &#xff08;1、pyside6-uic.exe test.ui -o test.py #将Ui界面文件转换成…

【C#】C# 使用onnxruntime报错记录

1、 C#使用onnxruntime时报CUDA版本错误 Bug信息&#xff1a;The given version [14] is not supported, only version 1 to 10 is supported in this build. 导致这个bug的原因是&#xff0c;在win11系统下的windows/system32文件夹下有一个默认的onnxruntime.dll&#xff0c;…