Vue3中使用Axios构建高效的请求处理机制

一、为什么选择Axios

        Axios的优势不必多说,但是对于在vue项目中使用,它有以下优势:

  1. 支持请求和响应拦截器,便于集中处理错误和认证。

  2. 简化请求配置,支持自定义实例。

  3. 良好的 TypeScript 支持,方便定义接口的类型。

二、配置 Axios 实例

        首先,创建一个axios.ts文件,用于配置 Axios 实例。这样可以确保所有 HTTP 请求共享统一的全局配置。

import axios, { type AxiosInstance, type InternalAxiosRequestConfig, type AxiosResponse } from 'axios';const apiClient: AxiosInstance = axios.create({baseURL:  //根据项目需求配置对应的基地址timeout:  //根据项目需求配置对应的请求超时时间headers: {'Content-Type': 'application/json',},
});// 添加请求拦截器
apiClient.interceptors.request.use((config: InternalAxiosRequestConfig) => {// 根据存储token的方式获取const token = localStorage.getItem('token');if (token && config.headers) {// 添加到请求头上config.headers.token = token;}return config;},(error) => {return Promise.reject(error);}
);// 添加响应拦截器
apiClient.interceptors.response.use((response: AxiosResponse) => {return response.data;},(error) => {// 全局错误处理if (error.response && error.response.status === 401) {// 跳转登录页的逻辑,例如使用router}// 还可以有其他类型的错误处理    return Promise.reject(error);}
);export default apiClient;

三、封装通用的请求 Hook:useRequsst

        为了在组件中更优雅地、方便快捷地发起请求,我们封装了一个通用的 Hook,支持灵活的请求方法、数据处理和错误管理。

import { shallowRef, type Ref } from "vue";
//从刚才创建的axios.ts中获取实例
import apiClient from "../api/axios";// 定义 HTTP 方法的类型
type HttpMethod = "get" | "post" | "put" | "delete";interface RequestOptions {url: string;method?: HttpMethod;requestData?: Record<string, unknown>;
}// 定义 useRequest 返回的类型,包括有 请求成功返回的数据、错误信息、加载信息、发送请求的函数
interface UseRequestResult<T> {data: Ref<T | null>;error: Ref<Error | null>;loading: Ref<boolean>;executeRequest: (options: RequestOptions) => Promise<void>;
}export function useRequest<T = unknown>(): UseRequestResult<T> {const data = shallowRef<T | null>(null);const error = shallowRef<Error | null>(null);const loading = shallowRef<boolean>(false);const executeRequest = async ({url,// 设置默认值method = "get",requestData,}: RequestOptions): Promise<void> => {loading.value = true;error.value = null;try {const response = await apiClient.request<T>({url,method,...(method !== "get" ? { data: requestData } : {}),});data.value = response;} catch (err) {error.value = err instanceof Error ? err : new Error(String(err));} finally {loading.value = false;}};return {data,error,loading,executeRequest,};
}

封装成hook的优势:

1、参数化请求

  • 通过参数动态指定发送请求的url和method

2、状态管理

  • loading :请求状态(true表示在请求中,false表示未在请求中)
  • error:储存请求返回的错误信息
  • data:储存请求返回的数据

 3、类型管理

  • 使用ts限定了请求数据、响应数据以及状态数据的格式,规避了类型冲突问题

四、使用实例:

 使用封装的hook创建用户:

<script setup lang="ts">
import { useRequest } from '@/hooks/useRequest';const { data, error, loading, executeRequest } = useRequest<{ id: number; name: string }>();const createUser = () => {executeRequest({// 传入调用请求函数必须的参数 url: '/users',method: 'post', // 不传方法默认getrequestData: { name: 'New User' },});
};
</script><template><!-- 使用状态信息灵活改变页面呈现的内容 --><button @click="createUser" :disabled="loading">创建用户</button><div v-if="loading">创建中...</div><div v-else-if="error">发生错误:{{ error.message }}</div><div v-else-if="data">创建成功!用户 ID:{{ data.id }}</div>
</template>

五、总结

        以上的内容成功实现了Axios实例的配置、封装请求hook、请求的状态管,这样不仅提升了代码的复用性和可维护性,也使得 Vue 组件中的逻辑更加清晰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/474569.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KF UKF

我需要Kalman 现在&#xff0c;主要是用来处理检测问题情况里的漏检&#xff0c;因为模拟了一段2D&#xff0c; &#xff08;x&#xff0c;y&#xff09;的数据&#xff0c;为了看效果&#xff0c;画的线尽量简单一点&#xff1a; import numpy as np import matplotlib.pyplo…

多品牌摄像机视频平台EasyCVR视频融合平台+应急布控球:打造城市安全监控新体系

在当今快速发展的智慧城市和数字化转型浪潮中&#xff0c;视频监控技术已成为提升公共安全、优化城市管理、增强应急响应能力的重要工具。EasyCVR视频监控平台以其强大的多协议接入能力和多样化的视频流格式分发功能&#xff0c;为用户提供了一个全面、灵活、高效的视频监控解决…

第8章硬件维护-8.2 可维护性和可靠性验收

8.2 可维护性和可靠性验收 可维护性和可靠性验收非常重要&#xff0c;硬件维护工程师在后端发现问题后&#xff0c;总结成可维护性和可靠性需求&#xff0c;在产品立项的时候与新特性一起进行需求分析&#xff0c;然后经过设计、开发和测试环节&#xff0c;在产品中落地。这些需…

医学图像语义分割:前列腺肿瘤、颅脑肿瘤、腹部多脏器 MRI、肝脏 CT、3D肝脏、心室

医学图像语义分割&#xff1a;前列腺肿瘤、颅脑肿瘤、腹部多脏器 MRI、肝脏 CT、3D肝脏、心室 语义分割网络FCN&#xff1a;通过将全连接层替换为卷积层并使用反卷积上采样&#xff0c;实现了第一个端到端的像素级分割网络U-Net&#xff1a;采用对称的U形编解码器结构&#xff…

如何解决多系统数据重复与冲突问题?

多系统并行运作已成为现代企业的常态。企业通常同时使用ERP、CRM、HR等多个业务系统来管理不同的功能模块。然而&#xff0c;这种多系统环境也带来了一个常见且棘手的问题&#xff1a;数据重复与矛盾。由于各系统独立运行且缺乏有效的集成机制&#xff0c;不同系统间的数据容易…

麒麟时间同步搭建chrony服务器

搭建chrony服务器 在本例中&#xff0c;kyserver01&#xff08;172.16.200.10&#xff09;作为客户端&#xff0c;同步服务端时间&#xff1b;kyserver02&#xff08;172.16.200.11&#xff09;作为服务端&#xff0c;提供时间同步服务。 配置服务端&#xff0c;修改以下内容…

【GPTs】Ai-Ming:AI命理助手,个人运势与未来发展剖析

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;GPTs指令&#x1f4af;前言&#x1f4af;Ai-Ming主要功能适用场景优点缺点 &#x1f4af;小结 &#x1f4af;GPTs指令 中文翻译&#xff1a; defcomplete_sexagenary&#xff08;年&a…

Chainlit快速实现AI对话应用将聊天记录的持久化到MySql关系数据库中

概述 默认情况下&#xff0c;Chainlit 应用不会保留其生成的聊天和元素。即网页一刷新&#xff0c;所有的聊天记录&#xff0c;页面上的所有聊天记录都会消失。但是&#xff0c;存储和利用这些数据的能力可能是您的项目或组织的重要组成部分。 之前写过一篇文章《Chainlit快速…

【动手学深度学习Pytorch】6. LeNet实现代码

LeNet&#xff08;LeNet-5&#xff09;由两个部分组成&#xff1a;卷积编码器和全连接层密集块 x.view(): 对tensor进行reshape import torch from torch import nn from d2l import torch as d2lclass Reshape(torch.nn.Module):def forward(self, x):return x.view(-1, 1, 28…

AI工具百宝箱|任意选择与Chatgpt、gemini、Claude等主流模型聊天的Anychat,等你来体验!

文章推荐 AI工具百宝箱&#xff5c;使用Deep Live Cam&#xff0c;上传一张照片就可以实现实时视频换脸...简直太逆天&#xff01; Anychat 这是一款可以与任何模型聊天 &#xff08;chatgpt、gemini、perplexity、claude、metal llama、grok 等&#xff09;的应用。 在页面…

Excel数据动态获取与映射

处理代码 动态映射 动态读取 excel 中的数据&#xff0c;并通过 json 配置 指定对应列的值映射到模板中的什么字段上 private void GetFreightFeeByExcel(string filePath) {// 文件名需要以快递公司命名 便于映射查询string fileName Path.GetFileNameWithoutExtension(fi…

SRP 实现 Cook-Torrance BRDF

写的很乱&#xff01; BRDF&#xff08;Bidirectional Reflectance Distribution Function&#xff09;全称双向反射分布函数。辐射量单位非常多&#xff0c;这里为方便直观理解&#xff0c;会用非常不严谨的光照强度来解释说明。 BRDF光照模型&#xff0c;上反射率公式&#…

[代码随想录Day16打卡] 找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树

找树左下角的值 定义&#xff1a;二叉树中最后一行最靠左侧的值。 前序&#xff0c;中序&#xff0c;后序遍历都是先遍历左然后遍历右。 因为优先遍历左节点&#xff0c;所以递归中因为深度增加更新result的时候&#xff0c;更新的值是当前深度最左侧的值&#xff0c;到最后就…

【第七节】在RadAsm中使用OllyDBG调试器

前言 接着本专栏上一节&#xff0c;我们虽然已经用上RadAsm进行编写x86汇编代码并编译运行&#xff0c;但是想进行断点调试怎么办。RadAsm里面找不到断点调试&#xff0c;下面我们来介绍如何在RadAsm上联合调试器OllyDBG进行调试代码。 OllyDBG的介绍与下载 OllyDBG 是一款功能…

WPF MVVM框架

一、MVVM简介 MVC Model View Control MVP MVVM即Model-View-ViewModel&#xff0c;MVVM模式与MVP&#xff08;Model-View-Presenter&#xff09;模式相似&#xff0c;主要目的是分离视图&#xff08;View&#xff09;和模型&#xff08;Model&#xff09;&#xff0c;具有低…

PH热榜 | 2024-11-19

DevNow 是一个精简的开源技术博客项目模版&#xff0c;支持 Vercel 一键部署&#xff0c;支持评论、搜索等功能&#xff0c;欢迎大家体验。 在线预览 1. Layer 标语&#xff1a;受大脑启发的规划器 介绍&#xff1a;体验一下这款新一代的任务和项目管理系统吧&#xff01;它…

【ArcGISPro】使用AI模型提取要素-提取车辆(目标识别)

示例数据下载 栅格数据从网上随便找一个带有车辆的栅格数据 f094a6b1e205cd4d30a2e0f816f0c6af.jpg (1200799) (588ku.com) 添加数据

联通光猫(烽火通信设备)改桥接教程

一、获得超级密码 1.打开telnet连接权限 http://192.168.1.1/telnet?enable1&key9070D3BECD70&#xff08;MAC地址&#xff09;2.连接光猫获取密码 telnet 192.168.1.1 用户名&#xff1a;admin 密码&#xff1a;Fh9070D3BECD70连接成功后 load_cli factory show admin_…

掌握SEO提升网站流量的关键在于长尾关键词的有效运用

内容概要 在现代数字营销中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;被广泛视为提升网站流量的核心策略之一&#xff0c;而其中长尾关键词的运用显得尤为重要。长尾关键词通常由三个或更多个词组成&#xff0c;具有更高的针对性和精确度&#xff0c;可以更好地满足…

【期权懂|个股期权中的备兑开仓策略是如何进行的?

期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 个股期权中的备兑开仓策略是如何进行的&#xff1f; 个股期权备兑开仓的优点和风险‌&#xff1a; ‌&#xff08;1&#xff09;优点‌&#xff1a;备兑开仓可以增强持股收益&…