第17篇:网络请求与Axios集成

目标:掌握在Vue3中规范地发起HTTP请求


1. 安装与基础配置
bash 复制代码
npm install axios  
javascript 复制代码
// src/utils/request.js  
import axios from 'axios'  

const service = axios.create({  
  baseURL: 'https://api.example.com',  
  timeout: 10000  
})  

export default service  

2. 基础请求示例
html 复制代码
<script setup>  
import request from '@/utils/request'  
import { ref } from 'vue'  

const data = ref(null)  

// GET请求  
const fetchData = async () => {  
  try {  
    const res = await request.get('/posts')  
    data.value = res.data  
  } catch (error) {  
    console.error('请求失败:', error)  
  }  
}  

// POST请求  
const submitForm = async (formData) => {  
  await request.post('/submit', formData)  
}  
</script>  

3. 请求/响应拦截器
javascript 复制代码
// 请求拦截(添加Token)  
service.interceptors.request.use(config => {  
  const token = localStorage.getItem('token')  
  if (token) {  
    config.headers.Authorization = `Bearer ${token}`  
  }  
  return config  
})  

// 响应拦截(统一错误处理)  
service.interceptors.response.use(  
  response => response.data,  
  error => {  
    if (error.response.status === 401) {  
      router.push('/login')  
    }  
    return Promise.reject(error)  
  }  
)  

4. 请求封装优化
javascript 复制代码
// src/api/user.js  
import request from '@/utils/request'  

export const login = (data) => {  
  return request({  
    url: '/user/login',  
    method: 'POST',  
    data  
  })  
}  

export const getUserInfo = () => {  
  return request.get('/user/info')  
}  

5. 与Pinia结合使用
javascript 复制代码
// stores/user.js  
import { defineStore } from 'pinia'  
import { login, getUserInfo } from '@/api/user'  

export const useUserStore = defineStore('user', {  
  state: () => ({  
    token: '',  
    userInfo: null  
  }),  
  actions: {  
    async loginAction(credentials) {  
      const res = await login(credentials)  
      this.token = res.token  
    },  
    async loadUserInfo() {  
      this.userInfo = await getUserInfo()  
    }  
  }  
})  

6. 跨域处理(开发环境)
javascript 复制代码
// vite.config.js  
export default defineConfig({  
  server: {  
    proxy: {  
      '/api': {  
        target: 'http://localhost:3000',  
        changeOrigin: true,  
        rewrite: (path) => path.replace(/^\/api/, '')  
      }  
    }  
  }  
})  

最佳实践

  1. 统一错误处理
javascript 复制代码
// 在拦截器中全局处理  
const showError = (message) => {  
  ElMessage.error(message || '请求异常')  
}  
  1. 取消重复请求
javascript 复制代码
// 使用axios.CancelToken避免重复请求  
const pendingRequests = new Map()  

const addPending = (config) => {  
  const key = `${config.method}-${config.url}`  
  config.cancelToken = new axios.CancelToken(cancel => {  
    if (!pendingRequests.has(key)) {  
      pendingRequests.set(key, cancel)  
    }  
  })  
}  
  1. Loading状态管理
html 复制代码
<script setup>  
const isLoading = ref(false)  

const fetchData = async () => {  
  isLoading.value = true  
  try {  
    // ...请求逻辑  
  } finally {  
    isLoading.value = false  
  }  
}  
</script>  
相关推荐
疯狂的Alex3 分钟前
【C#避坑实战系列文章16】性能优化(CPU / 内存占用过高问题解决)
开发语言·性能优化·c#
象骑士Hack5 分钟前
dev c++工具下载 dev c++安装包下载 dev c++软件网盘资源分享
开发语言·c++
卓码软件测评8 分钟前
K6的CI/CD集成在云原生应用的性能测试应用
前端·功能测试·测试工具·ci/cd·云原生
JordanHaidee28 分钟前
【Rust GUI开发入门】编写一个本地音乐播放器(11. 支持动态明暗主题切换)
前端·ui kit
爱泡脚的鸡腿29 分钟前
VUE移动端项目跟练2(简洁易懂)
前端·javascript·vue.js
拜晨1 小时前
用 MCP 把自己的接口接入 AI
前端·node.js
古夕1 小时前
技术复盘文档:解决 `watchEffect` 导致的图片闪烁无限循环问题
前端·javascript·vue.js
铍镁钙锶钡镭1 小时前
FFmpeg 解封装简单流程
开发语言·ffmpeg·php
拾缘1 小时前
esm和cmj混用报错分析
前端·javascript
古夕1 小时前
技术复盘文档:`resourceLogoUrl` 数据丢失问题分析与最终解决方案
前端·javascript·vue.js