当前位置: 首页 > news >正文

uniapp开发:uni.request基于async+await的二次封装,兼容vue2、vue3、及多端

目录

  • 优点
  • 封装request.js
  • 配置文件config.js
  • 接口管理api.js
  • 使用方式
  • 关注我,不迷路

优点

  1. async+await封装,执行效率更高,代码简洁化,更像同步代码。
  2. 基础功能参数化,需要的功能直接用参数配置,更加灵活。
  3. 同时兼容vue2和vue3。
  4. 同时支持uniapp打包的多端。
  5. 各种请求状态的处理。
  6. uni-vue3项目git地址:https://gitee.com/my_dear_li_pan/uni-vue3.git

封装request.js

/**
 * uniapp之请求封装(利用async+await和promise的思想)
 * options {Object} 参数
 * options.url {String} 请求地址
 * options.data {Object} 请求参数
 * options.method {String} 请求方法 默认GET
 * options.host {Boolean} 请求的地址标识 默认api
 * options.successCode {Number} 请求成功后的code 默认200
 * options.loginLoseCode {Number} token失效的code 默认loginLoseCode
 * options.type {String||Number} 提示窗口提示 0请求前后不提示  1请求前提示  2请求后提示 3请求前后提示
 * options.bMsg {String} 请求前提示
 * options.eMsg {String} 请求后提示
 * options.iconType {String} 请求成功后提示icon类型 默认success
 * options.cType {String} Content-Type的类型:一般有application/json、application/x-www-form-urlencoded等
 * options.mask {Boolean} 请求加载是否有遮罩 默认true
 * options.back {Boolean} 请求结束是否返回 默认false
 * options.backTime {Number} 请求结束返回等待的时间  默认500
 * options.failBack 错误数据是否返回 0不返回  1返回  默认0
 * options.notFailMsg {Boolean} 错误信息是否不提示 默认false
 * options.directBack 是否直接返回结果 默认false
 * options.notHideLoading 是否不关闭加载等待 默认false
 */
import config from '@/config.js';
const request = {
	async init(options) {
		// 解构赋值
		let {
			url,
			data,
			method = 'GET',
			host = 'api',
			successCode = 200,
			loginLoseCode = 30000,
			duration = 500,
			type = 0,
			bMsg = '',
			eMsg = '',
			iconType = 'success',
			cType = 'application/json', //application/x-www-form-urlencoded
			mask = true,
			back = false,
			backTime = 200,
			failBack = 0,
			notFailMsg = false,
			directBack = false,
			notHideLoading = false
		} = options;
		let header = {};
		// 请求地址
		host = config.host[host];
		// #ifdef H5
		// 生产环境时/api可去掉
		url = process.env.NODE_ENV == 'development' ? `/api${url}` : url;
		host = process.env.NODE_ENV == 'development' ? '' : host;
		// #endif
		// 根据业务需求添加header参数等...
		header['Content-Type'] = cType;
		// 请求前的加载
		if (type == 1 || type == 3) {
			uni.showLoading({
				title: bMsg,
				mask: mask
			});
		};
		// #ifdef VUE3
		try {
			var res = await uni.request({
				url: `${host}${url}`,
				data,
				method,
				header
			});
		} catch (e) {
			uni.showToast({
				title: '网络出小差了~',
				icon: "none"
			});
			return;
		}
		// #endif
		// #ifndef VUE3
		// 执行请求
		var [error, res] = await uni.request({
			url: `${host}${url}`,
			data,
			method,
			header
		});
		// 网络出错
		if (error) {
			uni.showToast({
				title: '网络出小差了~',
				icon: "none"
			});
			return;
		}
		// #endif
		// 请求成功处理逻辑
		if (!notHideLoading && (type == 1 || type == 3)) uni.hideLoading(); // 关闭请求加载
		const res_data = res.data;
		switch (+res_data.code) {
			case successCode: //请求成功
				if (type == 2 || type == 3) {
					if (back) {
						const backFn = () => {
							return new Promise((resolve, reject) => {
								setTimeout(async () => {
									// #ifdef VUE3
									try {
										var toastRes = await uni.showToast({
											title: eMsg ? eMsg : '请求成功',
											mask: true,
											icon: iconType,
											duration: duration
										});
									} catch (e) {}
									// #endif
									// #ifndef VUE3
									var [toastError, toastRes] = await uni.showToast({
										title: eMsg ? eMsg : '请求成功',
										mask: true,
										icon: iconType,
										duration: duration
									});
									// #endif
									if (toastRes && toastRes.errMsg == 'showToast:ok') {
										setTimeout(() => {
											resolve(true)
										}, duration + backTime);
									}
								}, 100)
							})
						}
						const backRes = await backFn();
						if (backRes) return res_data;
					} else {
						setTimeout(() => {
							uni.showToast({
								title: eMsg ? eMsg : '请求成功',
								mask: true,
								icon: iconType
							})
						}, 100)
						return res_data;
					}
				} else {
					return res_data;
				}
				break;
			case loginLoseCode: //登录过期
				// 处理登录失效的逻辑,比如,可以跳转到登录页
				uni.reLaunch({
					url:'/pages/login/login'
				})
				break;
			default:
				if (failBack == 1) Promise.reject(res_data);
				if (notFailMsg) return;
				const message = res_data.message || res_data.msg || '请求失败';
				if (message && message.length > 20) {
					uni.showModal({
						content: message,
						showCancel: false
					})
					return false;
				}
				setTimeout(() => {
					uni.showToast({
						icon: 'none',
						title: message
					})
				}, 100)
				break;
		}
	}
};
export default request.init;

配置文件config.js

独立出来的原因,就是其他地方可能还需要用到接口地址:

// 配置文件
const config = {
	/**
	 * 接口地址
	 */
	host: {
		api: process.env.NODE_ENV == 'development' ? 'https://api.book118.com' : 'https://api.book118.com'
	}
	// 其他自定义配置项
}
export default config;

接口管理api.js

// 接口
import Request from '@/common/js/request.js';
export function demo() {
	return Request({
		url: "/applet/index/getRecommendDocs",
		bMsg: "加载中",
		bMsg: "加载成功",
		back:true,
		type: 3
	})
}

使用方式:

在某个页面引入(引入路径仅供参考):

import { demo } from '@/common/api/demo.js'
onLoad() {
	this.myDemo()
},
methods: {
	async myDemo(){
		let _demo = demo();
		let demoRes = await _demo;
		console.log(demoRes);//返回的就是请求的结果
	}
}

关注我,不迷路

小伙伴,用你可爱的小手,点个赞吧!!!

如果任何疑问的可以在评论区留言或者私聊。

也可以扫下面二维码加我wx,备注‘地区-名字-技术类型’,我会拉进我的微信技术分享群。注意:必须备注清楚哈。

也可以加QQ群交流:568984539,加群备注‘地区-名字-技术类型’。

image

更多前端、uniapp、nodejs等相关知识可关注我个人博客:https://blog.csdn.net/qq_42961150?spm=1011.2124.3001.5343

相关文章:

  • 自定义Property属性动画
  • 阿里iconfont图标ttf转换为base64【非常详细】
  • 浏览器输入url以后所经历的过程
  • linux中DNS原理详解
  • 原型链的简单理解【关系到结论】
  • Qt中实现渐变动画效果
  • DOM树的理解【面试常问】
  • h5适配的解决方案【1】
  • class命名及前端部分规范【解决命名的疑问】
  • 小程序中使用彩色图标(阿里iconfont)
  • 前端新手引导的简单实现【Intro.js插件】
  • javascript闭包的理解及应用场景
  • 数组、链表、Hash(转)
  • 【微信小程序】小程序授权登录偶发性的解密失败原因及解决方案
  • 第一种感想
  • [Vue CLI 3] 配置解析之 css.extract
  • [笔记] php常见简单功能及函数
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【技术性】Search知识
  • canvas 绘制双线技巧
  • Effective Java 笔记(一)
  • ES6 学习笔记(一)let,const和解构赋值
  • FineReport中如何实现自动滚屏效果
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • java第三方包学习之lombok
  • k8s如何管理Pod
  • React-flux杂记
  • TypeScript实现数据结构(一)栈,队列,链表
  • 技术发展面试
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 我感觉这是史上最牛的防sql注入方法类
  • Python 之网络式编程
  • 组复制官方翻译九、Group Replication Technical Details
  • #WEB前端(HTML属性)
  • #单片机(TB6600驱动42步进电机)
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $.ajax中的eval及dataType
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2)MFC+openGL单文档框架glFrame
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (一)Linux+Windows下安装ffmpeg
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • @angular/cli项目构建--Dynamic.Form
  • @基于大模型的旅游路线推荐方案
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [acm算法学习] 后缀数组SA
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
  • [Codeforces] number theory (R1600) Part.11