vue3-封装自定义 Hooks

ops/2025/2/7 18:35:06/

在 Vue 3 中,setup 函数是 Composition API 的核心部分,它允许你使用响应式状态和其他 Composition API 功能。然而,就像在其他框架中的组件方法或生命周期钩子中一样,setup 函数内定义过多逻辑可能会使代码变得难以阅读和维护。为了解决这个问题,Vue 3 开发者通常会将相关逻辑封装成自定义的 Composition API 函数(有时也称为“自定义 Hooks”,尽管这个术语更多地在 React 社区中使用)。

在 Vue 3 中,这些自定义函数通常被称为“composables”。它们允许你将逻辑从 setup 函数中提取出来,放到单独的、可重用的文件中,从而提高代码的可读性和可维护性。

以下是一个 Vue 3 中使用 composables 的示例:

示例:封装数据获取逻辑到 composable

假设我们有一个组件需要从 API 获取数据并在模板中显示这些数据。

<template><div><h1>Data from API</h1><div v-if="loading">Loading...</div><div v-else-if="error">{{ error }}</div><div v-else>{{ data }}</div></div>
</template><script>
import { ref, onMounted } from 'vue';
import axios from 'axios';export default {setup() {const data = ref(null);const loading = ref(true);const error = ref(null);const fetchData = async () => {try {const response = await axios.get('https://api.example.com/data');data.value = response.data;} catch (err) {error.value = err.message;} finally {loading.value = false;}};onMounted(fetchData);return {data,loading,error,};},
};
</script>
封装成 composable

我们将数据获取逻辑封装到一个名为 useFetchData 的 composable 中:

// useFetchData.js
import { ref, onMounted } from 'vue';
import axios from 'axios';export function useFetchData(url) {const data = ref(null);const loading = ref(true);const error = ref(null);const fetchData = async () => {try {const response = await axios.get(url);data.value = response.data;} catch (err) {error.value = err.message;} finally {loading.value = false;}};onMounted(fetchData);return {data,loading,error,};
}

然后在组件中使用这个 composable:

<template><div><h1>Data from API</h1><div v-if="loading">Loading...</div><div v-else-if="error">{{ error }}</div><div v-else>{{ data }}</div></div>
</template><script>
import { useFetchData } from './useFetchData';export default {setup() {const { data, loading, error } = useFetchData('https://api.example.com/data');return {data,loading,error,};},
};
</script>

通过这种方式,我们将数据获取逻辑从组件的 setup 函数中提取出来,放到了一个可重用的 composable 中。这不仅提高了代码的可读性,还使得这个逻辑可以在其他组件中轻松复用。


http://www.ppmy.cn/ops/156506.html

相关文章

IDEA构建JavaWeb项目,并通过Tomcat成功运行

目录 一、Tomcat简介 二、Tomcat安装步骤 1.选择分支下载 2.点击下载zip安装包 3.解压到没有中文、空格和特殊字符的目录下 4.双击bin目录下的startup.bat脚本启动Tomcat 5.浏览器访问Tomcat 6.关闭Tomcat服务器 三、Tomcat目录介绍 四、WEB项目的标准结构 五、WEB…

1.5 Go切片使用

一、切片简介 切片是相同类型元素的可变长度的集合&#xff0c;通常表示[]type。同一个切片中的元素类型都是一个类型的。它看上去跟数组一样&#xff0c;但是没有长度 二、切片的组成 每一个切片由三个部分组成 底层数组的指针&#xff1a;指向切片实际存储数据的底层数组…

Android_P_Audio_系统(1) — Auido 系统简介

1 音频基础 1.1 声音的三要素 1. 音量&#xff08;Volume&#xff09; 也叫做响度&#xff08;Loudness&#xff09;&#xff0c;人耳对声音强弱的主观感觉就是响度&#xff0c;响度和声波振动的幅度有关。一般说来&#xff0c;声波振动幅度越大则响度也越大。当我们用较大的…

UE5 创建自定义工具上下文的方法

自定义工具管理类上下文 工具管理类&#xff1a;MyToolsManager&#xff0c;管理类依赖类&#xff1a;ContextQueriesAPI、ContextTransactionsAPI // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.…

Spring Boot 实例解析:从概念到代码

SpringBoot 简介&#xff1a; 简化 Spring 应用开发的一个框架整合 Spring 技术栈的一个大整合J2EE 开发的一站式解决方案优点&#xff1a;快速创建独立运行的 Spring 项目以及与主流框架集成使用嵌入式的 Servlet 容器&#xff0c;应用无需打成 war 包&#xff0c;内嵌 Tomcat…

DeepSeek横空出世,AI格局或将改写?

引言 这几天&#xff0c;国产AI大模型DeepSeek R1&#xff0c;一飞冲天&#xff0c;在全球AI圈持续引爆热度&#xff0c;DeepSeek R1 已经是世界上最先进的 AI 模型之一&#xff0c;可与 OpenAI 的新 o1 和 Meta 的 Llama AI 模型相媲美。 DeepSeek-V3模型发布后&#xff0c;在…

Unity VideoPlayer播放视屏不清晰的一种情况

VideoPlayer的Rnder Texture可以设置Size,如果你的视屏是1920*1080那么就设置成1920*1080。 如果设置成其他分辨率比如800*600会导致视屏不清晰。

C# Winform制作一个登录系统

using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 登录 {p…