Vue3请求后端接口实现方式

 更新时间:2025年09月29日 08:45:27   作者:Rysxt  
本文详解Vue3中使用Fetch和Axios与后端交互的方法,涵盖请求发起、状态管理、错误处理及跨域等解决方案,推荐优先使用Axios,其拦截器、自动转换等特性提升开发效率,建议封装实例与API函数以统一配置

在Vue3应用中,与后端API交互是实现动态数据展示的核心环节。

本文将通过​​原生Fetch API​​和​​Axios库​​两种常用方式,详细讲解如何在Vue3组件中发起请求、处理响应、管理状态及解决常见问题,帮助你构建高效、可维护的前后端交互逻辑。

一、准备工作

在开始之前,请确保你的开发环境已安装以下工具:

  • ​Node.js​​(≥16.0):用于运行Vue项目;
  • ​Vue CLI​​:用于创建和管理Vue3项目(若未安装,可通过npm install -g @vue/cli全局安装)。

创建一个新的Vue3项目:

vue create vue3-api-tutorial
cd vue3-api-tutorial

选择“Vue 3”配置即可完成项目初始化。

二、使用原生Fetch API请求后端

Fetch API是现代浏览器内置的HTTP请求工具,无需额外安装依赖,适合简单的GET/POST请求。

1. 基础GET请求示例

src/components目录下创建FetchExample.vue组件,代码如下:

<template>
  <div>
    <h1>用户列表(Fetch API)</h1>
    <!-- 加载状态提示 -->
    <div v-if="loading">加载中...</div>
    <!-- 错误信息提示 -->
    <div v-if="errorMsg" style="color: red;">{{ errorMsg }}</div>
    <!-- 数据展示 -->
    <ul v-if="users.length && !loading">
      <li v-for="user in users" :key="user.id">{{ user.name }} ({{ user.email }})</li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      users: [],       // 存储用户数据
      loading: false,  // 加载状态
      errorMsg: ''     // 错误信息
    }
  },
  mounted() {
    this.fetchUsers(); // 组件挂载后自动发起请求
  },
  methods: {
    async fetchUsers() {
      this.loading = true; // 开启加载状态
      this.errorMsg = '';  // 清空错误信息
      try {
        // 发起GET请求(使用JSONPlaceholder测试API)
        const response = await fetch('https://jsonplaceholder.typicode.com/users');
        if (!response.ok) { // 检查响应状态(非200-299视为错误)
          throw new Error(`网络响应异常:${response.status}`);
        }
        const data = await response.json(); // 解析JSON数据
        this.users = data; // 更新组件数据
      } catch (error) {
        this.errorMsg = `获取数据失败:${error.message}`; // 捕获并显示错误
        console.error('Fetch请求错误:', error);
      } finally {
        this.loading = false; // 关闭加载状态
      }
    }
  }
}
</script>

2. POST请求示例(提交表单数据)

若需要向后台提交数据(如用户登录),可使用Fetch API的POST方法:

methods: {
  async loginUser() {
    const userData = { username: 'admin', password: '123456' };
    try {
      const response = await fetch('https://jsonplaceholder.typicode.com/posts', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json' // 声明请求体格式为JSON
        },
        body: JSON.stringify(userData) // 将JavaScript对象转为JSON字符串
      });
      const result = await response.json();
      console.log('登录成功:', result);
    } catch (error) {
      console.error('登录失败:', error);
    }
  }
}

3. 注意事项

  • ​跨域问题​​:若前端(http://localhost:8080)与后端(http://localhost:5000)不在同一端口,需在后端配置CORS(如Flask中使用flask-cors库)或在Vue项目中配置代理(见下文“常见问题解决”);
  • ​错误处理​​:务必捕获fetchcatch错误,并提示用户友好的错误信息;
  • ​加载状态​​:通过loading属性控制加载提示,提升用户体验。

三、使用Axios库请求后端

Axios是基于Promise的HTTP客户端,支持请求/响应拦截、自动JSON转换、取消请求等功能,更适合复杂项目。

1. 安装Axios

npm install axios

2. 封装Axios实例(推荐)

为统一管理请求配置(如baseURL、超时时间、拦截器),建议创建一个src/utils/request.js文件:

import axios from 'axios';

// 创建Axios实例
const request = axios.create({
  baseURL: '/api', // 基础路径(可根据环境变量动态设置)
  timeout: 5000    // 请求超时时间(毫秒)
});

// 请求拦截器:在发送请求前处理(如添加token)
request.interceptors.request.use(
  config => {
    const token = localStorage.getItem('token');
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`; // 添加认证头
    }
    return config;
  },
  error => Promise.reject(error) // 拦截请求错误
);

// 响应拦截器:统一处理响应(如判断状态码)
request.interceptors.response.use(
  response => {
    // 假设后端返回格式为 { code: 0, data: {}, message: '' }
    if (response.data.code !== 0) {
      return Promise.reject(response.data.message); // 非0状态码视为错误
    }
    return response.data.data; // 返回实际数据
  },
  error => {
    console.error('请求错误:', error);
    return Promise.reject(error.message || '网络异常'); // 统一错误提示
  }
);

export default request;

3. 在组件中使用Axios

创建src/components/AxiosExample.vue组件:

<template>
  <div>
    <h1>用户列表(Axios)</h1>
    <div v-if="loading">加载中...</div>
    <div v-if="errorMsg" style="color: red;">{{ errorMsg }}</div>
    <ul v-if="users.length && !loading">
      <li v-for="user in users" :key="user.id">{{ user.name }} ({{ user.email }})</li>
    </ul>
  </div>
</template>

<script>
import request from '@/utils/request'; // 引入封装的Axios实例

export default {
  data() {
    return {
      users: [],
      loading: false,
      errorMsg: ''
    }
  },
  mounted() {
    this.fetchUsers();
  },
  methods: {
    async fetchUsers() {
      this.loading = true;
      this.errorMsg = '';
      try {
        // 发起GET请求(自动拼接baseURL:/api/users)
        const response = await request.get('/users');
        this.users = response; // 直接使用拦截器处理后的数据
      } catch (error) {
        this.errorMsg = `获取数据失败:${error}`;
      } finally {
        this.loading = false;
      }
    }
  }
}
</script>

4. 封装通用API函数(可选)

为提高代码复用性,可将不同接口封装为独立函数,存放在src/api/user.js中:

import request from '@/utils/request';

// 登录接口
export function login(data) {
  return request.post('/user/login', data);
}

// 获取用户信息接口
export function getUserInfo() {
  return request.get('/user/info');
}

// 获取用户列表接口
export function getUserList() {
  return request.get('/users');
}

组件中调用时,只需引入对应函数即可:

import { getUserList } from '@/api/user';

async fetchUsers() {
  this.loading = true;
  try {
    this.users = await getUserList();
  } catch (error) {
    this.errorMsg = error;
  } finally {
    this.loading = false;
  }
}

5. Axios的优势

  • ​拦截器​​:统一处理token、错误提示、请求loading;
  • ​自动转换​​:自动将JSON响应转为JavaScript对象;
  • ​取消请求​​:支持通过CancelToken取消未完成的请求;
  • ​并发请求​​:通过axios.all同时发起多个请求。

四、常见问题解决

1. 跨域问题

若前端与后端不在同一域名/端口,需配置代理(以Vite为例):

  • vite.config.js中添加代理配置:
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';

export default defineConfig({
  plugins: [vue()],
  server: {
    proxy: {
      '/api': { // 匹配以/api开头的请求
        target: 'http://localhost:5000', // 后端服务器地址
        changeOrigin: true, // 改变请求头中的origin为目标URL
        rewrite: path => path.replace(/^\/api/, '') // 去除请求路径中的/api前缀
      }
    }
  }
});
  • 修改Axios实例的baseURL/api,即可通过/api/users访问后端的http://localhost:5000/users

2. 响应数据格式处理

若后端返回的数据格式与拦截器预设不一致(如{ status: 200, data: {}, msg: '' }),需调整拦截器逻辑:

request.interceptors.response.use(
  response => {
    if (response.data.status !== 200) {
      return Promise.reject(response.data.msg);
    }
    return response.data.data; // 返回实际数据
  }
);

3. Token失效处理

在响应拦截器中判断token失效(如状态码401),并跳转至登录页:

request.interceptors.response.use(
  response => response.data.data,
  error => {
    if (error.response && error.response.status === 401) {
      window.location.href = '/login'; // 跳转登录页
    }
    return Promise.reject(error.message);
  }
);

五、总结

本文通过Fetch API和Axios两种方式,详细讲解了Vue3中请求后端接口的完整流程,包括基础请求、状态管理、错误处理及常见问题解决。​

推荐优先使用Axios​​,其丰富的功能和良好的可维护性更适合复杂项目。在实际开发中,建议通过封装Axios实例和API函数,统一管理请求配置,提升团队协作效率。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决echarts数据二次渲染不成功的问题

    解决echarts数据二次渲染不成功的问题

    这篇文章主要介绍了解决echarts数据二次渲染不成功的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • vue-router 控制路由权限的实现

    vue-router 控制路由权限的实现

    这篇文章主要介绍了vue-router 控制路由权限的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Vue过滤器filters如何使用

    Vue过滤器filters如何使用

    Vue过滤器filters用于一些常见的文本格式化,通过过滤器可以进行处理成自己想要展示出来的格式,由“管道”符号指示,本文给大家介绍Vue过滤器filters使用方式,感兴趣的朋友一起看看吧
    2023-10-10
  • vue使用自定义icon图标的方法

    vue使用自定义icon图标的方法

    这篇文章主要介绍了vue使用自定义的icon图标的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • until封装watch常用逻辑简化代码写法

    until封装watch常用逻辑简化代码写法

    这篇文章主要介绍了until将watch最常用的逻辑进行封装简化代码写法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • vue 开发之路由配置方法详解

    vue 开发之路由配置方法详解

    这篇文章主要介绍了vue 开发之路由配置方法,结合实例形式详细分析了了vue.js路由原理、配置方法及相关操作注意事项,需要的朋友可以参考下
    2019-12-12
  • Vue中常用rules校验规则(实例代码)

    Vue中常用rules校验规则(实例代码)

    这篇文章主要介绍了Vue中常用rules校验规则,本文通过实例代码个大家介绍了一些校验方法,需要的朋友可以参考下
    2019-11-11
  • vue如何使用element ui表格el-table-column在里面做判断

    vue如何使用element ui表格el-table-column在里面做判断

    这篇文章主要介绍了vue如何使用element ui表格el-table-column在里面做判断问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • VUE签字组件vue-esign安装使用教程

    VUE签字组件vue-esign安装使用教程

    在我们开发项目中,特别是流程审批类的项目,最后一步会提交审核,审核员看完相应信息以后,没问题就会签字通过审批,这篇文章主要给大家介绍了关于VUE签字组件vue-esign安装使用的相关资料,需要的朋友可以参考下
    2023-09-09
  • 解决vue初始化项目时,一直卡在Project description上的问题

    解决vue初始化项目时,一直卡在Project description上的问题

    今天小编就为大家分享一篇解决vue初始化项目时,一直卡在Project description上的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10

最新评论