如何在 Vue 中处理 API 请求?

在 Vue.js 中处理 API 请求是构建动态、交互式 Web 应用程序的核心部分。为了有效地与后端服务器通信,Vue 生态系统提供了多种方式来发起和管理 API 请求。以下是几种常见的方法和最佳实践:

1. 使用 Axios

Axios 是一个基于 Promise 的 HTTP 客户端,它支持浏览器和 Node.js 环境,并且具有以下优点:

  • 支持请求/响应拦截器
  • 转换请求数据和响应数据
  • 取消请求的能力
  • 自动转换 JSON 数据
安装 Axios

首先需要安装 Axios:

npm install axios
# 或者
yarn add axios
创建 Axios 实例

为所有 API 请求创建一个共享的 Axios 实例,以便可以集中配置基础 URL、超时等选项。

// src/api/index.js
import axios from 'axios';const apiClient = axios.create({baseURL: 'https://api.example.com', // 替换为你的API地址timeout: 5000, // 请求超时时间 (毫秒)
});export default apiClient;
添加拦截器

可以通过拦截器对每个请求或响应进行预处理,比如添加认证头信息、统一处理错误等。

// 继续在上面的文件中添加
apiClient.interceptors.request.use(config => {const token = localStorage.getItem('authToken');if (token) {config.headers.Authorization = `Bearer ${token}`;}return config;},error => Promise.reject(error)
);apiClient.interceptors.response.use(response => response,error => {if (error.response) {switch (error.response.status) {case 401:// 处理未授权的情况break;case 403:console.error('Access denied');break;// 其他状态码处理...}} else {console.error('Request failed:', error.message);}return Promise.reject(error);}
);
封装 API 请求

将特定的 API 请求封装成服务函数,这样可以使代码更模块化并且易于维护。

// src/api/services.js
import apiClient from './index';export const fetchItems = async () => {const response = await apiClient.get('/data'); // 假设有一个 /data 端点返回数据return response.data;
};export const addItem = async newItem => {const response = await apiClient.post('/data', newItem);return response.data;
};

2. 在 Vue 组件中使用 API 请求

一旦你有了封装好的 API 请求函数,就可以在 Vue 组件中轻松调用了。通常你会在生命周期钩子(如 createdmounted)中执行这些请求,或者通过用户事件触发它们。

<template><div><ul v-if="items.length"><li v-for="item in items" :key="item.id">{{ item.name }}</li></ul><p v-else>Loading...</p></div>
</template><script>
import { fetchItems } from '@/api/services';export default {data() {return {items: [],};},async created() {try {this.items = await fetchItems();} catch (error) {console.error('Error fetching data:', error);}},
};
</script>

3. Vuex Store

如果你的应用有多个组件依赖于相同的状态,并且这个状态是由 API 请求决定的,那么 Vuex 是一个很好的选择。Vuex 提供了集中式的状态管理,使得全局状态更容易被管理和调试。

// store.js
import { createStore } from 'vuex';
import { fetchItems } from '@/api/services';export default createStore({state: {items: [],},mutations: {SET_ITEMS(state, items) {state.items = items;},},actions: {async fetchItems({ commit }) {try {const items = await fetchItems();commit('SET_ITEMS', items);} catch (error) {console.error('Error fetching items:', error);}},},
});

然后在组件中你可以像这样使用:

import { useStore } from 'vuex';
import { onMounted } from 'vue';export default {setup() {const store = useStore();onMounted(() => {store.dispatch('fetchItems');});return {items: computed(() => store.state.items),};},
};

4. 处理加载状态和错误信息

当执行异步操作时,通常还需要考虑显示加载指示器以及如何向用户展示可能发生的错误。可以通过定义额外的状态变量来实现这一点。

const loading = ref(true);
const error = ref(null);async function loadData() {try {const response = await apiClient.get('/data');items.value = response.data;} catch (err) {error.value = err.message;} finally {loading.value = false;}
}

模板中可以根据这些状态变量来决定渲染的内容:

<template><div v-if="loading">Loading...</div><div v-else-if="error">{{ error }}</div><ul v-else><li v-for="item in items" :key="item.id">{{ item.name }}</li></ul>
</template>

总结

以上就是在 Vue 中处理 API 请求的一些常见模式和技术栈。根据你的项目需求和技术偏好,可以选择最适合的方法。记住,良好的 API 请求管理不仅提高了用户体验,也帮助你写出更清晰、更易于维护的代码。随着 Vue 生态系统的不断发展,新的工具和技术也会不断涌现,因此保持学习和适应最新的最佳实践是非常重要的。

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

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

相关文章

Crawler实现英语单词的翻译

首先声明一点&#xff0c;这种方法仅限于低频次的交互来获取翻译信息&#xff0c;一旦一秒内大量的请求会被重定向&#xff0c;那就直接不能用了 如果希望可以批量查询英语单词翻译&#xff0c;可以查看我的下一篇博客。 接下来的任务就是要把这么一大堆的单词进行翻译&#xf…

QT 学习第十四天 QWidget布局

QT 学习十四天 布局 布局管理Qt Widgets 布局布局管理器简介基本布局管理器栅格布局管理器窗体布局管理器综合使用布局管理器设置部件大小可扩展窗口 布局管理 今天讲 Qt Widgets 和 Qt Quick 中的布局。 前者主要用布局管理器 后者除了布局管理器还有基于锚的布局&#xff08…

jangow靶机

打开靶机&#xff0c;打开kali&#xff0c;有的人会发现扫不到靶机的ip 在网上搜索了半天&#xff0c;发现是靶机的网卡配置有问题 重启靶机&#xff0c;选第二个 进去后再选第二个&#xff0c;按e 找到ro这一行 把ro后面这一行的内容都替换成ro rw signin init/bin/bash ctr…

redis开发与运维-redis0401-补充-redis流水线与Jedis执行流水线

文章目录 【README】【1】redis流水线Pipeline【1.1】redis流水线概念【1.2】redis流水线性能测试【1.2.1】使用流水线与未使用流水线的性能对比【1.2.2】使用流水线与redis原生批量命令的性能对比【1.2.3】流水线缺点 【1.3】Jedis客户端执行流水线【1.3.1】Jedis客户端执行流…

KOI技术-事件驱动编程(Sping后端)

1 “你日渐平庸&#xff0c;甘于平庸&#xff0c;将继续平庸。”——《以自己喜欢的方式过一生》 2. “总是有人要赢的&#xff0c;那为什么不能是我呢?”——科比布莱恩特 3. “你那么憎恨那些人&#xff0c;和他们斗了那么久&#xff0c;最终却要变得和他们一样&#xff0c;…

小程序配置文件 —— 14 全局配置 - tabbar配置

全局配置 - tabBar配置 tabBar 字段&#xff1a;定义小程序顶部、底部 tab 栏&#xff0c;用以实现页面之间的快速切换&#xff1b;可以通过 tabBar 配置项指定 tab 栏的表现&#xff0c;以及 tab 切换时显示的对应页面&#xff1b; 在上面图中&#xff0c;标注了一些 tabBar …

小程序基础 —— 08 文件和目录结构

文件和目录结构 一个完整的小程序项目由两部分组成&#xff1a;主体文件、页面文件&#xff1a; 主体文件&#xff1a;全局文件&#xff0c;能够作用于整个小程序&#xff0c;影响小程序的每个页面&#xff0c;主体文件必须放到项目的根目录下&#xff1b; 主体文件由三部分组…

使用ArcGIS/ArcGIS pro绘制六边形/三角形/菱形渔网图

在做一些尺度分析时&#xff0c;经常会涉及到对研究区构建不同尺度的渔网进行分析&#xff0c;渔网的形状通常为规则四边形。构建渔网的方法也很简单&#xff0c;使用ArcGIS/ArcGIS Pro工具箱中的【创建渔网/CreateFishnet】工具来构建。但如果想构建其他形状渔网进行相关分析&…

【K8S问题系列 | 21 】K8S中如果PV处于Bound状态,如何删除?【已解决】

在Kubernetes&#xff08;K8S&#xff09;的存储管理体系中&#xff0c;持久卷&#xff08;PersistentVolume&#xff0c;PV&#xff09;是一种重要的资源&#xff0c;它为Pod提供了持久化存储能力。当PV处于Bound状态时&#xff0c;意味着它已经与某个持久卷声明&#xff08;P…

旅游管理系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

Qt5 中 QGroupBox 标题下沉问题解决

我们设置了QGroupBox 样式之后,发现标题下沉了,那么如何解决呢? QGroupBox {font: 12pt "微软雅黑";color:white;border:1px solid white;border-radius:6px; } 解决后的效果 下面是解决方法: QGroupBox {font: 12pt "微软雅黑";color:white;bo…

六大基础深度神经网络之CNN

左侧是传统卷积网络输入的是一列像素点&#xff0c;右侧是卷积神经网络&#xff0c;输入的是具有长宽通道数的原始图像 下图为整体架构。卷积层可以认为提取特征&#xff0c;池化层是压缩特征。全连接层是把图像展平然后计算10个类别的概率值 给出一张图像不同区域的特征不同&a…

抽象工厂设计模式的理解和实践

在软件开发中&#xff0c;设计模式是前人通过大量实践总结出的、可复用的、解决特定问题的设计方案。它们为我们提供了一种标准化的解决方案&#xff0c;使得代码更加简洁、灵活和易于维护。在众多设计模式中&#xff0c;抽象工厂模式&#xff08;Abstract Factory Pattern&…

从入门到精通:Vim 高效文本编辑全面指南

文章目录 前言&#x1f9ec;一、Vim 的编辑哲学&#xff1a;模式分离与高效键盘操作&#x1f9ec;二、基础命令与快捷键&#xff1a;从简单到熟悉&#x1f9ec;三、进阶功能&#xff1a;多文件、分屏与可视化模式&#x1f9ec;四、自定义配置与 .vimrc&#xff1a;打造你的专属…

大模型-ChatGLM2-6B模型部署与微调记录

大模型-ChatGLM2-6B模型部署与微调记录 模型权重下载&#xff1a; 登录魔塔社区&#xff1a;https://modelscope.cn/models/ZhipuAI/chatglm2-6b 拷贝以下代码执行后&#xff0c;便可快速权重下载到本地 # 备注&#xff1a;最新模型版本要求modelscope > 1.9.0 # pip insta…

连锁餐饮行业数据可视化分析方案

引言 随着连锁餐饮行业的迅速发展&#xff0c;市场竞争日益激烈。企业需要更加精准地把握运营状况、消费者需求和市场趋势&#xff0c;以制定科学合理的决策&#xff0c;提升竞争力和盈利能力。可视化数据分析可以帮助连锁餐饮企业整合多源数据&#xff0c;通过直观、动态的可…

NiChart 多模态神经影像(structural MRI,functional MRI,and diffusion MRI)处理和分析工具包安装

NiChart多模态神经影像部署 NiChart 本地安装Git clone 问题personal access token PAT 问题 NiChart 云端注册AWS验证问题 NiChart 是UPenn大学&#xff0c;Christos Davatzikos教授开发的一个多模态MRI影像&#xff0c;structural (sMRI), diffusion (dMRI)&#xff0c; and …

人工智能与云计算的结合:如何释放数据的无限潜力?

引言&#xff1a;数据时代的契机 在当今数字化社会&#xff0c;数据已成为推动经济与技术发展的核心资源&#xff0c;被誉为“21世纪的石油”。从个人消费行为到企业运营决策&#xff0c;再到城市管理与国家治理&#xff0c;每个环节都在生成和积累海量数据。然而&#xff0c;数…

【代码分析】Unet-Pytorch

1&#xff1a;unet_parts.py 主要包含&#xff1a; 【1】double conv&#xff0c;双层卷积 【2】down&#xff0c;下采样 【3】up&#xff0c;上采样 【4】out conv&#xff0c;输出卷积 """ Parts of the U-Net model """import torch im…

构建全志 T113 Tina SDK

1、环境配置&#xff1a; 准备一个 Ubuntu 系统&#xff0c;可以是 WSL&#xff0c;虚拟机等&#xff0c;建议版本是 20.04。 1.1、安装必要的软件 进入系统后&#xff0c;输入下方命令安装需要的工具 &#xff1a; sudo apt update -y sudo apt full-upgrade -y sudo apt i…