vue3 axios数据请求封装

准备工作

vue3+js+vite
首先确认package.json中有axios

如果没有 运行 npm install axios 安装axios
成功后在package.json文件会显示。

第一步 创建app.js、request.js

两个文件在同级目录下即可

api.js

import instance from "./request";
const api_name = "";

export default {
	getData(url, params) {
		return instance({
			url: api_name + url,
			method: 'get',
			params
		})
	},
	postData(url, params) {
		return instance({
			url: api_name + url,
			method: 'post',
			data: params,
		})
	}
}

request.js

import axios from 'axios'

const request = axios.create({
	baseURL: '  ', //请求地址
	timeout: 60000, // 请求超时时间
	withCredentials: true, // 异步请求携带cookie
	headers: {
		//设置后端需要的传参类型
		'Content-Type': 'application/json',
	},
})
// 添加请求拦截器
request.interceptors.request.use(config => {
	// 如果你要去localStor获取token,(如果你有)
	// let token = localStorage.getItem("x-auth-token");
	// if (token) {
	//添加请求头
	//config.headers["Authorization"]="Bearer "+ token
	// }
	return config
}, err => {
	return Promise.reject(err)
});
// 添加响应拦截器
request.interceptors.response.use(response => {
	return response.data
}, err => {
	return Promise.reject(err)
});
export default request

使用

### Vue3Axios 请求封装的最佳实践 #### 创建 Axios 实例并配置默认选项 为了提高代码的可维护性和复用性,通常会创建一个独立的文件来初始化和配置 Axios 实例。这一步骤可以集中管理所有的 HTTP 配置。 ```javascript // src/utils/axios.js import axios from &#39;axios&#39;; const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 设置基础URL timeout: 5000 // 超时时间 (毫秒) }); ``` #### 添加请求拦截器 在发送请求之前可以通过请求拦截器对请求做预处理,比如添加认证令牌或修改请求头信息: ```javascript service.interceptors.request.use( config => { const token = localStorage.getItem(&#39;token&#39;); if (token) { config.headers[&#39;Authorization&#39;] = `Bearer ${token}`; } return config; }, error => Promise.reject(error) ); ``` #### 添加响应拦截器 当接收到服务器端返回的数据后,可以在响应拦截器中统一处理错误逻辑或其他通用操作: ```javascript service.interceptors.response.use( response => response.data, error => { console.error(`Error occurred during API call:`, error.message); return Promise.reject(error); } )[^1]; ``` #### 定义API服务层 为了让业务逻辑更加清晰分离,建议定义专门的服务模块导出具体的 API 函数供页面调用: ```javascript // src/api/user.js import request from &#39;@/utils/axios&#39;; export function login(data) { return request.post(&#39;/auth/login&#39;, data); } export function getUserInfo() { return request.get(&#39;/user/profile&#39;); } ``` #### 使用 getCurrentInstance 获取组件实例 考虑到 Vue 3 组合式 API 的特性,在 setup 函数内部不再能直接访问 this 关键字指向的上下文对象。此时应该借助 Composition API 提供的方法来获取当前组件实例的相关属性和服务[^2]。 ```javascript <script> import { ref } from &#39;vue&#39;; import { useRoute, useRouter } from &#39;vue-router&#39;; import { login } from &#39;../api/user&#39;; import { getCurrentInstance } from "vue"; export default { name: &#39;LoginView&#39;, setup() { let loading = ref(false); const instance = getCurrentInstance(); async function handleLogin(form) { try { loading.value = true; await login({ username: form.username, password: form.password }); router.push(&#39;/&#39;); } catch (err) { alert(err?.message || &#39;登录失败!&#39;); } finally { loading.value = false; } } return { handleLogin }; } }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值