Vue3 Ajax(axios)(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在现代 Web 开发中,Vue3 和 Axios 的组合已成为前端开发者构建动态交互应用的核心工具之一。Vue3 通过其 Composition API 和响应式系统提供了高效灵活的组件化开发体验,而 Axios 则凭借其简洁的 API 设计和强大的功能,成为处理 HTTP 请求的首选库。本文将从基础概念到实战案例,系统性地讲解如何在 Vue3 项目中使用 Axios 实现 Ajax 请求,帮助开发者快速掌握这一技能,同时通过形象比喻和代码示例降低学习门槛。


一、Vue3 与 Axios 的基础概念

1.1 什么是 Ajax?

Ajax(Asynchronous JavaScript and XML)是一种通过 JavaScript 在后台与服务器交换数据的技术,允许网页在不重新加载的情况下更新部分内容。可以将其想象为“快递服务”:当用户在网页上提交表单时,数据像包裹一样被发送到服务器(GET 或 POST 请求),服务器处理后返回结果(响应数据),而用户无需等待整个页面刷新即可看到结果。

1.2 为什么选择 Axios?

Axios 是基于 Promise 的 HTTP 客户端,具有以下优势:

  • 支持浏览器端和 Node.js 环境
  • 自动转换 JSON 数据
  • 支持请求/响应拦截
  • 可取消请求
  • 客户端支持防御 XSRF(跨站请求伪造)

与原生 XMLHttpRequest 相比,Axios 的链式调用和 Promise 语法让代码更简洁易读。

1.3 Vue3 的响应式系统与 Ajax 的结合

Vue3 的响应式系统通过 refreactive 等 API 实现数据驱动视图更新。当 Ajax 请求成功获取数据后,直接更新响应式变量即可触发视图渲染,这一特性使得 Vue3 与 Ajax 的协作变得自然流畅。


二、环境搭建与基本配置

2.1 创建 Vue3 项目

使用 Vue CLI 快速初始化项目:

npm init vue@latest  
cd your-project-name  
npm install  

2.2 安装 Axios

通过 npm 或 yarn 安装:

npm install axios  
yarn add axios  

2.3 全局引入与配置(可选)

main.js 中全局引入 Axios 并设置默认配置:

import { createApp } from 'vue';  
import App from './App.vue';  
import axios from 'axios';  

const app = createApp(App);  

// 全局配置  
axios.defaults.baseURL = 'https://api.example.com';  
axios.defaults.timeout = 5000;  

// 拦截器(添加请求头或统一错误处理)  
axios.interceptors.request.use(  
  (config) => {  
    config.headers['Authorization'] = 'Bearer ' + getToken();  
    return config;  
  },  
  (error) => {  
    return Promise.reject(error);  
  }  
);  

app.config.globalProperties.$axios = axios;  
app.mount('#app');  

三、Axios 在 Vue3 中的基本用法

3.1 GET 请求:获取公开数据

在 Vue3 组件中使用 Composition API 发送 GET 请求:

<template>  
  <div v-if="loading">正在加载...</div>  
  <div v-else>  
    <ul>  
      <li v-for="item in data" :key="item.id">{{ item.title }}</li>  
    </ul>  
  </div>  
</template>  

<script setup>  
import { ref } from 'vue';  
import axios from 'axios';  

const data = ref([]);  
const loading = ref(true);  

axios.get('/api/items')  
  .then(response => {  
    data.value = response.data;  
    loading.value = false;  
  })  
  .catch(error => {  
    console.error('请求失败:', error);  
    loading.value = false;  
  });  
</script>  

3.2 POST 请求:提交表单数据

<template>  
  <form @submit.prevent="handleSubmit">  
    <input v-model="formData.name" placeholder="姓名" />  
    <button type="submit">提交</button>  
  </form>  
</template>  

<script setup>  
import { ref } from 'vue';  
import axios from 'axios';  

const formData = ref({ name: '' });  

const handleSubmit = () => {  
  axios.post('/api/submit', formData.value)  
    .then(response => {  
      alert('提交成功!');  
      formData.value.name = '';  
    })  
    .catch(error => {  
      console.error('提交失败:', error);  
    });  
};  
</script>  

四、进阶技巧与问题处理

4.1 使用 async/await 简化代码

通过 asyncawait 可以让异步代码更接近同步逻辑,避免嵌套的 .then()

const fetchData = async () => {  
  try {  
    const response = await axios.get('/api/data');  
    data.value = response.data;  
  } catch (error) {  
    console.error('获取数据失败:', error);  
  } finally {  
    loading.value = false;  
  }  
};  

4.2 请求参数与查询字符串

Axios 自动将对象参数转换为查询字符串:

// GET 请求附加参数  
axios.get('/api/search', {  
  params: {  
    keyword: 'vue3',  
    page: 1  
  }  
});  
// URL 自动变为:/api/search?keyword=vue3&page=1  

4.3 错误处理与状态码判断

HTTP 状态码 2xx 表示成功,4xx/5xx 表示客户端或服务器错误:

axios.get('/api/error')  
  .then(response => {  
    if (response.status === 200) {  
      // 正常处理  
    }  
  })  
  .catch(error => {  
    if (error.response) {  
      // 服务器响应错误(4xx/5xx)  
      console.log('状态码:', error.response.status);  
    } else {  
      // 网络错误或超时  
    }  
  });  

五、实战案例:构建一个简单的天气查询应用

5.1 需求分析

用户输入城市名称,点击按钮后显示该城市的天气信息,包括温度、天气状况等。

5.2 接口设计

假设使用第三方天气 API(如 OpenWeatherMap):

GET https://api.openweathermap.org/data/2.5/weather?q={city}&appid={API_KEY}  

5.3 实现步骤

5.3.1 安装依赖

已安装 Vue3 和 Axios。

5.3.2 创建组件

src/components/Weather.vue 中编写代码:

<template>  
  <div class="weather-container">  
    <input v-model="city" placeholder="输入城市名称" />  
    <button @click="getWeather">查询</button>  
    <div v-if="weatherData.weather">  
      <h3>{{ city }} 的天气:</h3>  
      <p>温度:{{ Math.round(weatherData.main.temp - 273.15) }}℃</p>  
      <p>天气状况:{{ weatherData.weather[0].description }}</p>  
    </div>  
    <div v-if="error">{{ error }}</div>  
  </div>  
</template>  

<script setup>  
import { ref } from 'vue';  
import axios from 'axios';  

const city = ref('');  
const weatherData = ref({});  
const error = ref('');  

const getWeather = async () => {  
  if (!city.value) {  
    error.value = '请输入城市名称';  
    return;  
  }  

  try {  
    const response = await axios.get(  
      `https://api.openweathermap.org/data/2.5/weather`,  
      {  
        params: {  
          q: city.value,  
          appid: 'YOUR_API_KEY',  // 替换为你的 API 密钥  
          units: 'metric'  
        }  
      }  
    );  
    weatherData.value = response.data;  
    error.value = '';  
  } catch (err) {  
    if (err.response?.status === 404) {  
      error.value = '城市名称无效,请重新输入';  
    } else {  
      error.value = '请求失败,请检查网络';  
    }  
  }  
};  
</script>  

<style scoped>  
.weather-container {  
  padding: 20px;  
  border: 1px solid #ccc;  
  border-radius: 8px;  
}  
</style>  

5.3.3 在 App.vue 中引入组件

<template>  
  <div id="app">  
    <Weather />  
  </div>  
</template>  

<script setup>  
import Weather from './components/Weather.vue';  
</script>  

六、性能优化与最佳实践

6.1 防止重复请求:使用防抖(Debounce)

在搜索框输入时频繁触发请求会导致性能问题,可通过防抖延迟请求:

import { debounce } from 'lodash';  // 或自行实现防抖函数  

const handleSearch = debounce(() => {  
  axios.get('/api/search', { params: { query: searchQuery.value } });  
}, 300);  

6.2 缓存常用数据

对于不频繁变化的数据(如城市列表),可缓存响应结果:

const cachedData = ref({});  

const fetchData = async (url) => {  
  if (cachedData.value[url]) {  
    return cachedData.value[url];  
  }  

  const response = await axios.get(url);  
  cachedData.value[url] = response.data;  
  return response.data;  
};  

6.3 并发请求控制

使用 Promise.all() 同时发送多个请求:

const [user, orders] = await Promise.all([  
  axios.get('/api/user'),  
  axios.get('/api/orders')  
]);  

七、常见问题与解决方案

7.1 跨域问题(CORS)

当前端与后端不在同一域名时,浏览器会阻止请求。解决方案包括:

  • 后端配置 CORS 头(推荐)
  • 使用代理服务器
  • 开发环境配置 Vue CLI 代理:
    // vue.config.js  
    module.exports = {  
      devServer: {  
        proxy: {  
          '/api': {  
            target: 'http://localhost:3000',  
            changeOrigin: true,  
          },  
        },  
      },  
    };  
    

7.2 请求超时

通过 timeout 参数设置超时时间:

axios.get('/api/slow', { timeout: 3000 });  

八、结论

通过本文的讲解,读者应已掌握在 Vue3 项目中使用 Axios 完成 Ajax 请求的核心方法,并能解决常见问题。Vue3 的响应式系统与 Axios 的结合,使得数据驱动视图更新的流程变得直观高效。无论是基础的 GET/POST 请求,还是进阶的错误处理、性能优化,均可以通过本文提供的代码示例和逻辑框架快速实现。

随着实践的深入,建议开发者进一步探索以下方向:

  1. 使用 TypeScript 增强代码类型安全
  2. 结合 Vue3 的 Suspense 组件处理异步加载状态
  3. 研究 Axios 的拦截器实现全局错误处理和日志记录

掌握 Vue3 Ajax(axios) 的核心技能后,开发者可以更专注于业务逻辑的实现,为用户提供流畅的交互体验。

最新发布