第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>  
相关推荐
蓝谷芮济2 分钟前
二:前端发送POST请求,后端获取数据
前端
果粒chenl3 分钟前
css+js提问
前端·javascript·css
~kiss~4 分钟前
Rust~二刷异步逻辑
开发语言·后端·rust
memorycx4 分钟前
Vue02
前端·javascript·vue.js
SomeB1oody12 分钟前
【Rust中级教程】2.7. API设计原则之灵活性(flexible) Pt.3:借用 vs. 拥有、`Cow`类型、可失败和阻塞的析构函数及解决办法
开发语言·后端·性能优化·rust
m0_7482402524 分钟前
python轻量级框架-flask
开发语言·python·flask
论迹35 分钟前
【JavaEE】-- 多线程(初阶)2
java·开发语言·java-ee
+7201 小时前
如何在java中用httpclient实现rpc post 请求
java·开发语言·rpc
学习两年半的Javaer1 小时前
Rust语言基础知识详解【一】
开发语言·rust
PyAIGCMaster1 小时前
50周学习go语言:第四周 函数与错误处理深度解析
开发语言·学习·golang