Vue中如何通过函数实现接口调用的具体操作步骤是怎样的?
- 内容介绍
- 文章标签
- 相关推荐
前言这方面,为什么要在 Vue 项目中用函数封装接口调用?
在实际开发中,接口调用散落在各个组件里请求参数难以统一管理错误处理不一致导致代码难以维护、测试困难、复用率低。这些都是前端同学经常抱怨的痛点。
使用者痛点汇总
-
❌ 不知道该把请求代码放在哪儿,随手写在组件的
mounted或methods里。 -
❌ 多个页面需要同一个接口,却要重复写相同的
axios配置。 - ❌ 异步请求报错时页面卡死或报错信息不友好。
- ❌ 项目升级后旧的写法不兼容,需要大幅重构。
- ❌ 单元测试时难以 mock 接口返回值。
一、准备工作:安装并全局挂载 Axios
// terminal
npm install axios --save
// src/plugins/axios.js
import axios from 'axios';const instance = axios.create({
baseURL: process.env.VUE_APP_API_BASE_URL。// 统一的根方法
timeout: 10000,headers: { 'Content-Type': 'application/json' }
});// 可选:添加请求/响应拦截器
instance.interceptors.request.use(config => {
// 如加入 token
const token = localStorage.getItem;话说回来,if config.headers.Authorization = `Bearer ${token}`;怎么说呢,return config;},error => Promise.reject);instance.interceptors.response.use(res => res.data,error => {
// 全局错误提示
console.error;return Promise.reject;}),export default instance;
二、创建统一的 API 服务层
把所有接口函数集中放在一个目录下便于管理和统一修改。
1. 基础请求封装
// src/api/apiClient.js
import axiosInstance from '@/plugins/axios';export const get = =>
axiosInstance.get;export const post = =>
axiosInstance.post;// 根据项目需要可继续
put、delete 等方法
2. 示例业务接口
// src/api/user.js
import { get,post } from './apiClient';/**
* 登录接口
* @param {Object} payload { username: string,password: string }
* @returns {Promise}
*/
export function login {
return post;}
/**
* 获取当前使用者信息
* @returns {Promise}
*/
export function fetchCurrentUser {
return get;}
/**
* 更新使用者资料
* @param {Object} data
* @returns {Promise}
*/
export function updateProfile {
return post;}
三、在组件中调用封装好的函数
1. 使用 async / await
// src/components/Profile.vue
2. 使用 Promise 链式写法
// src/components/OldLogin.vue
四、将 API 调用接入 Vuex进行状态集中管理
// store/modules/user.js
import { fetchCurrentUser } from '@/api/user';const state = => ({
profile: null,});const mutations = {
SET_PROFILE {
state.profile = data;},},const actions = {
async loadProfile {
const data = await fetchCurrentUser;commit,},};老实说,export default { namespaced: true。state,mutations,actions };
*好处*
- 组件只关心展示逻辑,不需要再处理网络细节。
- 状态共享变得简单,多个页面可以直接读取同一份数据。其实,
- 单元测试只需 mock Vuex action。即可验证业务流程,
五、统一的错误处理与使用者反馈机制
Axios 拦截器已经把错误抛出,这里再结合 UI 库提供全局提示:
// src/plugins/errorHandler.js
import Vue from 'vue';import { Message } from 'element-ui';// 或者你使用的 UI 框架
Vue.prototype.$handleError = function {
const msg = err.response?.data,.msg || err.message || '未知错误';Message.error;},
在组件里只需要:
// 示例
try {
await someApi;
} catch {
this.$handleError;
话说回来,}
六、单元测试:如何 Mock API 函数?
// tests/unit/Profile.spec.js
import { shallowMount } from '@vue/test-utils';import Profile from '@/components/Profile.vue';import * as userApi from '@/api/user';jest.mock,// 自动 mock
describe => {
it => {
userApi.fetchCurrentUser.mockResolvedValue;const wrapper = shallowMount;await wrapper.vm.$nextTick;// 等待 created 中的 async 完成
expect.toBeCalled;expect).toContain;}),});
七、完整步骤回顾 & 小结
- 安装并全局挂载 Axios:统一请求配置与拦截器。
- Create API Service Layer:`src/api/` 下按业务划分文件,使用简洁的 `get/post` 包装函数。
- 在组件中调用:`async/await` 为首选;若项目旧版,可保留 Promise 链式写法。
- 接入 Vuex/Pinia:实现数据状态集中管理,提高跨页面共享能力。话说回来,
- 统一错误处理:Axios 拦截器 + 全局提示方法。让使用者始终得到友好反馈。
- 单元测试准备:#Mock API 函数,使业务逻辑可独立验证。
- SOP 文档化:
前言这方面,为什么要在 Vue 项目中用函数封装接口调用?
在实际开发中,接口调用散落在各个组件里请求参数难以统一管理错误处理不一致导致代码难以维护、测试困难、复用率低。这些都是前端同学经常抱怨的痛点。
使用者痛点汇总
-
❌ 不知道该把请求代码放在哪儿,随手写在组件的
mounted或methods里。 -
❌ 多个页面需要同一个接口,却要重复写相同的
axios配置。 - ❌ 异步请求报错时页面卡死或报错信息不友好。
- ❌ 项目升级后旧的写法不兼容,需要大幅重构。
- ❌ 单元测试时难以 mock 接口返回值。
一、准备工作:安装并全局挂载 Axios
// terminal
npm install axios --save
// src/plugins/axios.js
import axios from 'axios';const instance = axios.create({
baseURL: process.env.VUE_APP_API_BASE_URL。// 统一的根方法
timeout: 10000,headers: { 'Content-Type': 'application/json' }
});// 可选:添加请求/响应拦截器
instance.interceptors.request.use(config => {
// 如加入 token
const token = localStorage.getItem;话说回来,if config.headers.Authorization = `Bearer ${token}`;怎么说呢,return config;},error => Promise.reject);instance.interceptors.response.use(res => res.data,error => {
// 全局错误提示
console.error;return Promise.reject;}),export default instance;
二、创建统一的 API 服务层
把所有接口函数集中放在一个目录下便于管理和统一修改。
1. 基础请求封装
// src/api/apiClient.js
import axiosInstance from '@/plugins/axios';export const get = =>
axiosInstance.get;export const post = =>
axiosInstance.post;// 根据项目需要可继续
put、delete 等方法
2. 示例业务接口
// src/api/user.js
import { get,post } from './apiClient';/**
* 登录接口
* @param {Object} payload { username: string,password: string }
* @returns {Promise}
*/
export function login {
return post;}
/**
* 获取当前使用者信息
* @returns {Promise}
*/
export function fetchCurrentUser {
return get;}
/**
* 更新使用者资料
* @param {Object} data
* @returns {Promise}
*/
export function updateProfile {
return post;}
三、在组件中调用封装好的函数
1. 使用 async / await
// src/components/Profile.vue
2. 使用 Promise 链式写法
// src/components/OldLogin.vue
四、将 API 调用接入 Vuex进行状态集中管理
// store/modules/user.js
import { fetchCurrentUser } from '@/api/user';const state = => ({
profile: null,});const mutations = {
SET_PROFILE {
state.profile = data;},},const actions = {
async loadProfile {
const data = await fetchCurrentUser;commit,},};老实说,export default { namespaced: true。state,mutations,actions };
*好处*
- 组件只关心展示逻辑,不需要再处理网络细节。
- 状态共享变得简单,多个页面可以直接读取同一份数据。其实,
- 单元测试只需 mock Vuex action。即可验证业务流程,
五、统一的错误处理与使用者反馈机制
Axios 拦截器已经把错误抛出,这里再结合 UI 库提供全局提示:
// src/plugins/errorHandler.js
import Vue from 'vue';import { Message } from 'element-ui';// 或者你使用的 UI 框架
Vue.prototype.$handleError = function {
const msg = err.response?.data,.msg || err.message || '未知错误';Message.error;},
在组件里只需要:
// 示例
try {
await someApi;
} catch {
this.$handleError;
话说回来,}
六、单元测试:如何 Mock API 函数?
// tests/unit/Profile.spec.js
import { shallowMount } from '@vue/test-utils';import Profile from '@/components/Profile.vue';import * as userApi from '@/api/user';jest.mock,// 自动 mock
describe => {
it => {
userApi.fetchCurrentUser.mockResolvedValue;const wrapper = shallowMount;await wrapper.vm.$nextTick;// 等待 created 中的 async 完成
expect.toBeCalled;expect).toContain;}),});
七、完整步骤回顾 & 小结
- 安装并全局挂载 Axios:统一请求配置与拦截器。
- Create API Service Layer:`src/api/` 下按业务划分文件,使用简洁的 `get/post` 包装函数。
- 在组件中调用:`async/await` 为首选;若项目旧版,可保留 Promise 链式写法。
- 接入 Vuex/Pinia:实现数据状态集中管理,提高跨页面共享能力。话说回来,
- 统一错误处理:Axios 拦截器 + 全局提示方法。让使用者始终得到友好反馈。
- 单元测试准备:#Mock API 函数,使业务逻辑可独立验证。
- SOP 文档化:

