Uniapp + Vue3 封装请求工具挂载全局

文章介绍了如何创建一个uniapp环境下的request.js工具类,包含基础的GET、POST等HTTP请求方法,以及请求拦截、响应拦截和错误处理功能,适用于Vue3中全局使用并支持自定义loading。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新建request.js工具类

const http = {
	// baseUrl 地址
	baseUrl: 'http://localhost:8080',

	// 请求方法
	request(config) {
		// config:请求配置对象,具体参照uniapp文档
		config = beforeRequest(config)
		// 请求地址拼接
		config.url = this.baseUrl + config.url
		// 异步请求
		return new Promise((resolve, reject) => {
			uni.request(config).then(res => {
				// 响应拦截
				const response = beforeResponse(res)
				resolve(response)
			}).catch(err => {
				errorHandle(err)
				reject(err)
			})
		})

	},
	get(url, data, auth, loading) {
		/*
		url:接口地址
		data:查询参数
		auth:请求是否携带token进行认证(true/false)
		method:请求方式
		*/
		return this.request({
			url: url,
			data: data,
			auth: auth,
			timeout: 10000,
			method: 'GET',
			loading: loading
		})
	},
	post(url, data, auth) {
		/*
		url:接口地址
		data:请求体参数
		auth:请求是否携带token进行认证(true/false)
		method:请求方式
		*/
		return this.request({
			url: url,
			data: data,
			auth: auth,
			timeout: 10000,
			method: 'POST'
		})
	},
	put(url, data, auth) {
		/*
		url:接口地址
		data:请求体参数
		auth:请求是否携带token进行认证(true/false)
		method:请求方式
		*/
		return this.request({
			url: url,
			data: data,
			auth: auth,
			timeout: 10000,
			method: 'PUT'
		})
	},
	delete(url, data, auth) {
		/*
		url:接口地址
		auth:请求是否携带token进行认证(true/false)
		method:请求方式
		*/
		return this.request({
			url: url,
			auth: auth,
			timeout: 10000,
			method: 'DELETE'
		})
	}
}

// 请求拦截器
const beforeRequest = (config) => {
	// 请求之前拦截操作
	console.log('请求拦截器', config)
	if (!config.loading) {
		uni.showLoading({
			title: '拼命请求中',
			mask: true,
		})
	} else {
		uni.showLoading({
			title: config.loading,
			mask: true,
		})
	}
	config.header = {}
	if (config.auth && config.auth != undefined) {
		// 请求头中添加token
		if (uni.getStorageSync('token')) {
			// Authorization    Bearer   根据情况修改
			config.header['Authorization'] = 'Bearer ' + uni.getStorageSync('token')
		} else {
			// 为登陆则跳转登陆 重定向
			uni.navigateTo({
				url: '/pages/index/index'
			})
		}
	}
	return config
}

// 响应拦截器
const beforeResponse = (response) => {
	// 请求之后操作
	console.log('响应拦截器', response)
	setTimeout(()=>{
		uni.hideLoading();
	},2000)
	// 判断请求返回的状态码
	if (response.status !== 200 && response.status !== 201 && response.status !== 204) {
		// 给出对应的提示
		if (response.data.error) {
			uni.showToast({
				title: response.data.error.toString(),
				icon: 'none',
				duration: 2000
			})
		}
	}
	return response
}

// 请求异常处理器
const errorHandle = ((err) => {
	console.log('请求异常', err)
})

export default http

在main文件中全局挂载、

// 导入封装的请求对象
import http from '@/util/request.js'
app.config.globalProperties.$http = http

在vue页面中使用

import type { ComponentInternalInstance } from 'vue'
const { proxy } = getCurrentInstance() as ComponentInternalInstance


// 使用默认的loading
const response = await proxy?.$http.get('/auth/tenant/list')
// 自定义的loading
const response1 = await proxy?.$http.get('/auth/tenant/list',null,null,'loading')

备注:Vue3不可以像vue2那样子通过this对象去调用全局挂载对象,需要使用 getCurrentInstance 方法获取proxy 对象。

运行结果:

### 实现 UniApp Vue3 项目中的 Axios 全局封装 #### 安装 Axios 库 为了能够在 UniAppVue3 项目中使用 Axios 进行 HTTP 请求,首先需要安装 Axios。进入项目的根目录,在该位置存在 `package.json` 文件。 ```bash npm install axios ``` 此命令会将 Axios 添加至依赖项列表中[^1]。 #### 创建全局 Axios 配置文件 创建一个新的 JavaScript 或 TypeScript 文件用于定义全局的 Axios 请求配置。通常命名为 `axiosConfig.js` 或者类似的名称: ```javascript import axios from &#39;axios&#39;; // 设置基础 URL 和其他默认参数 const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // 使用环境变量设置 API 基础路径 timeout: 5000, }); // 请求拦截器 service.interceptors.request.use( config => { // 可在此处处理请求前的操作,比如添加 token 到 header 中 return config; }, error => Promise.reject(error) ); // 响应拦截器 service.interceptors.response.use( response => response.data, error => Promise.reject(error) ); export default service; ``` 这段代码设置了 Axios 的基本选项,并实现了简单的请求与响应拦截功能。 #### 将 Axios 方法挂载到应用实例上 为了让所有的页面都能方便地访问 `$get`, `$post` 等方法,可以在 `main.js` 中通过 `globalProperties` 对象来注册这些自定义属性: ```javascript import { createApp } from &#39;vue&#39;; import App from &#39;./App.vue&#39;; import router from &#39;./router&#39;; // 如果有路由的话 import store from &#39;./store&#39;; // 如果有状态管理的话 import axiosInstance from &#39;./utils/axiosConfig&#39;; // 上一步创建的服务实例 const app = createApp(App); app.config.globalProperties.$axios = axiosInstance; // 提供 get/post 方法给模板调用 app.config.globalProperties.$get = (...args) => axiosInstance.get(...args); app.config.globalProperties.$post = (...args) => axiosInstance.post(...args); if (!process.env.IS_WEB) Vue.use(require(&#39;vue-router&#39;)); app.use(router).use(store).mount(&#39;#app&#39;); ``` 这样做的好处是在任何组件内部都可以直接使用 `this.$axios()`, `this.$get()` 或者 `this.$post()` 发起网络请求而无需重复导入 Axios[^2]。 #### 组件内发起请求的例子 一旦完成了上述步骤之后,在任何一个 Vue 组件里就可以像下面这样做来进行数据获取操作了: ```html <template> <div>{{ message }}</div> </template> <script setup lang="ts"> import { ref, onMounted } from &#39;vue&#39; let message = ref(&#39;&#39;); onMounted(() => { this.$get(&#39;/api/hello&#39;) .then(response => { message.value = response.message || &#39;&#39;; }) }); </script> ``` 以上就是在 UniApp Vue3 项目中实现 Axios 全局封装方法[^3]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值