UniApp全局弹窗

news2024/11/18 23:24:53

一、设计思路

1、创建一个弹窗页面组件

2、配置page.json,使页面跳转是在当前界面展示

3、定义uni全局全局属性

4、解决多个弹窗同时使用的冲突问题

 注意:此方案不支持多个弹窗并存,有且仅有一个会展示,当前弹窗展示并关闭上一个弹窗

二、代码

1、index.vue---弹窗组件

<template>
	<view>
		<!-- 提示信息弹窗 2秒后消失-->
		<!-- msgType:top、center、bottom、left、right、message、dialog、share -->
		<view @click="itemClick('mask')" class="mask-content">
			<uni-popup ref="message" type="message">
				<uni-popup-message :type="info.msgType" :message="info.messageText"
					:duration="info.duration"></uni-popup-message>
			</uni-popup>
		</view>
		<!-- 加载弹窗 -->
		<uni-popup ref="popupLoading" :is-mask-click="false">
			<view class="popup-content"><text
					class="cu-load load-cuIcon loading text-white">{{info.popupContent}}</text>
			</view>
		</uni-popup>
		<!-- 提示信息弹窗 -->
		<uni-popup ref="alertDialog" type="dialog">
			<uni-popup-dialog :type="info.msgType" :cancelText="info.cancelText" :confirmText="info.confirmText"
				:title="info.title" :content="info.content" @confirm="itemClick('confirm')" @close="itemClick('cancel')"
				:duration="info.duration"></uni-popup-dialog>
		</uni-popup>
		<!-- 自定义提示框 -->
		<view @click="itemClick('mask')" class="mask-content" v-if="info.isShow">
			<view class="dialog-content" @click.stop="">
				<view class="head-content " v-if="info.title" :style="info.content?'':'min-height:90rpx;padding:30rpx'">
					<text>{{info.title}}</text>
				</view>
				<scroll-view class="main-content" scroll-y v-if="info.content">
					<view class="info-content">
						<text>{{info.content}}</text>
					</view>
				</scroll-view>
				<view class="foot-content alert" v-if="'alert'==info.dialogType">
					<view class="btn active" @click.stop="itemClick('confirm')">
						{{info.confirmText}}
					</view>
				</view>
				<view class="foot-content confirm" v-if="'confirm'==info.dialogType">
					<view class="btn cancel" @click="itemClick('cancel')">
						{{info.cancelText}}
					</view>
					<view class="btn active" @click.stop="itemClick('confirm')">
						{{info.confirmText}}
					</view>
				</view>
			</view>
		</view>
	</view>
</template>

<script>
	export default {
		name: 'Dialog',
		data() {
			return {
				info: {
					//消息提示
					msgType: 'success', //error、warn、info
					messageText: '',
					//确认框
					content: "",
					title: "提示",
					duration: 2000,
					cancelText: "取消",
					confirmText: "确定",
					dialogType: "", //弹窗类型 0:确认框  1:消息提示  2: 加载框
					popupContent: "加载中....",
					isShow: false,
					isMaskClose: "1", //1点击遮罩层关闭弹窗
				}
			}
		},
		onLoad(info = {}) {
			this.info = {
				...this.info,
				...info
			};
			this.getParams(this.info);
		},
		onUnload() {
			this.popupLoadingClose();
			this.info.dialogType = "";
		},
		methods: {
			getParams(options) {
				switch (options.dialogType) {
					case "dialogOpen":
						this.dialogOpen();
						break;
					case "messageOpen":
						this.messageOpen();
						break;
					case "popupLoadingOpen":
						this.popupContent = options.popupContent;
						this.popupLoadingOpen();
						break;
					case "popupLoadingClose":
						this.popupContent = options.popupContent;
						this.popupLoadingClose();
						break;
					default:
						break;
				}
			},
			/**
			 * 确认框方法
			 */
			dialogOpen() {
				this.$nextTick(() => {
					this.$refs.alertDialog.open();
				})
			},
			/**
			 * 消息提示框方法
			 */
			messageOpen() {
				if (this.info.dialogType == "messageOpen") {
					this.$nextTick(() => {
						if(this.$refs.message){
							this.$refs.message.open();
							this.setTimeOut = setTimeout(() => {
								uni.navigateBack()
							}, this.info.duration)
						}
					});
				}
			},
			/**
			 * 加载框方法
			 */
			popupLoadingOpen() {
				this.$nextTick(() => {
					this.$refs.popupLoading.open('center');
				});
			},
			/**
			 * 废弃,页面路由使用不上
			 * 直接使用uni.navigateBack()
			 */
			popupLoadingClose() {
				this.$refs.popupLoading.close();
			},
			itemClick(type) {
				if (type == "mask" && this.info.isMaskClose != '1') {
					return;
				}
				//解决消息提示的自动消失返回的bug
				if (this.setTimeOut)
					clearTimeout(this.setTimeOut);
				uni.navigateBack();
				uni.$emit("zy_common_dialog", type);
			}
		}
	};
</script>

<style lang="scss">
	$btncolor: #0081ff;

	page {
		background: transparent;
	}

	.mask-content {
		position: fixed;
		left: 0;
		top: 0;
		right: 0;
		bottom: 0;
		display: flex;
		justify-content: center;
		align-items: center;
		background-color: rgba(0, 0, 0, 0.4);

		.dialog-content {
			background-color: #FFFFFF;
			width: 580rpx;
			border-radius: 10rpx;

			.head-content {
				display: flex;
				align-items: center;
				justify-content: center;
				color: #343434;
				font-weight: bold;
				font-size: 32rpx;
				padding: 20rpx 30rpx;
			}

			.main-content {
				max-height: 330rpx;

				.info-content {
					min-height: 80rpx;
					padding: 10rpx 30rpx;
					color: #636463;
					font-size: 30rpx;
					display: flex;
					justify-content: center;
					align-items: center;
				}
			}

			.foot-content {
				display: flex;
				justify-content: center;
				align-items: center;
				height: 110rpx;

				.btn {
					font-size: 28rpx;
					border-radius: 66rpx;
					height: 66rpx;
					display: flex;
					justify-content: center;
					align-items: center;
				}

				&.alert {
					.btn {
						background-color: $btncolor;
						color: #FFFFFF;
						font-size: 28rpx;
						border-radius: 60rpx;
						height: 66rpx;
						width: 300rpx;
						padding: 0 40rpx;
						display: flex;
						justify-content: center;
						align-items: center;
					}
				}

				&.confirm {
					justify-content: space-around;

					.btn {
						min-width: 230rpx;

						&.active {
							background-color: $btncolor;
							color: #FFFFFF;
						}

						&.cancel {
							border: 1rpx solid $btncolor;
							color: $btncolor;
							border-radius: 66rpx;
						}
					}
				}

			}
		}
	}
</style>

 2、工具类

2.1、dialog.js

export default {
	/* 链接处理 */
	getLink(params) {
		let url = "/components/dialog/index";
		if (params) {
			let paramStr = "";
			for (let name in params) {
				paramStr += `&${name}=${params[name]}`
			}
			if (paramStr) {
				url += `?${paramStr.substr(1)}`
			}
		}
		return url;
	},
	// 将URL参数分割为对象键值对
	getParam(curParam){
	  // 拼接参数
	  let param = ''
	  for (let key in curParam) {
	    param += '&' + key + '=' + curParam[key]
	  }
	                
	  // 把参数保存为对像
	  let obj = {}
	  for (let key in curParam) {
	    obj[key] = curParam[key]
	  }
	  return obj
	},
	/* APP全局弹窗 */
	dialog(params = {}, callback) {
		this.back();
		uni.navigateTo({
			url: this.getLink(params),
			success(e) {
				if (callback != null && typeof callback == "function") {
					uni.$off("zy_common_dialog");
					uni.$on("zy_common_dialog", (type) => {
						callback && callback(type)
					})
				}
			}
		})
	},
	/*弹出提示弹窗  */
	alert(data = {}, callback, close) {
		let params = {
			dialogType: "alert",
			isCloseBtn: '0',
			isMaskClose: '0',
			isShow:true,
			...data
		};
		this.dialog(params, (type) => {
			if ("confirm" == type) {
				callback && callback()
			} else {
				close && close()
			}
		})
	},
	/*确认提示框弹窗 */
	confirm(data = {}, confirm, cancel, close) {
		let params = {
			dialogType: "confirm",
			isCloseBtn: '0',
			isMaskClose: '0',
			isShow:true,
			...data
		};
		this.dialog(params, (type) => {
			if ("confirm" == type) {
				confirm && confirm()
			} else if ("cancel" == type) {
				cancel && cancel()
			} else if ("close" == type) {
				close && close()
			}
		})
	},
	/*确认提示框弹窗 */
	dialogConfirm(data = {}, confirm, cancel, close) {
		let params = {
			dialogType: "dialogOpen",
			...data
		};
		this.dialog(params, (type) => {
			if ("confirm" == type) {
				confirm && confirm()
			} else if ("cancel" == type) {
				cancel && cancel()
			} else if ("close" == type) {
				close && close()
			}
		})
	},
	/*消息提示框 */
	showMessage(data = {}) {
		let params = {
			dialogType: "messageOpen",
			isMaskClose: '1',
			...data
		};
		this.dialog(params)
	},
	/**
	 * 加载框
	 */
	popupLoadingOpen(data = {}) {
		let params = {
			dialogType: "popupLoadingOpen",
			...data
		};
		this.dialog(params)
	},
	back(isCheckPopupLoading=false){
		//保证唯一弹窗
		let routes = getCurrentPages(); // 获取当前打开过的页面路由数组
		if(routes.length>1){
			let curRoute = routes[routes.length - 1].route //获取当前页面路由
			if(curRoute=="components/dialog/index"){
				if(isCheckPopupLoading){
					let curParam = routes[routes.length - 1].options; //获取路由参数
					let paramObj=this.getParam(curParam);
					if(paramObj.dialogType=="popupLoadingOpen")
					uni.navigateBack();
				}else{
					uni.navigateBack();
				}
			}
		}
	}
}

 2.2、dialogUtils.js

import dialog from "@/components/dialog/dialog.js"
module.exports = {
	/**
	 * 弹出提示
	 */
	alert(content = "", title = "提示", callback, confirmText = '确定') {
		// #ifdef APP-PLUS
		dialog.alert({
			content,
			title,
			confirmText
		}, callback)
		// #endif
		// #ifndef APP-PLUS
		uni.showModal({
			title,
			content,
			confirmText,
			showCancel: false,
			confirmColor: "#e03c31",
			success: callback
		})
		// #endif
	},
	/**
	 * 确认提示框
	 */
	confirm(content = "", confirm, cancel, confirmText = '确定', cancelText = '取消', title = "提示") {
		// #ifdef APP-PLUS
		dialog.confirm({
			content,
			title,
			confirmText,
			cancelText,
		}, confirm, cancel)
		// #endif
		// #ifndef APP-PLUS
		uni.showModal({
			title,
			content,
			cancelText,
			confirmText,
			confirmColor: "#e03c31",
			success: (e) => {
				if (e.confirm) {
					confirm && confirm()
				} else if (e.cancel) {
					cancel && cancel()
				}
			},
			fail: (e) => {
				console.log(e)
			}
		})
		// #endif
	},
	/**
	 * 确认提示框
	 * @property {String} content 对话框内容
	 * @property {function} confirm 对话框内容
	 */
	dialogConfirm(content = "", confirm, cancel, confirmText = '确定', cancelText = '取消', msgType ='info', title = "提示") {
		// #ifdef APP-PLUS
		dialog.dialogConfirm({
			content,
			title,
			confirmText,
			cancelText,
			msgType
		}, confirm, cancel)
		// #endif
		// #ifndef APP-PLUS
		uni.showModal({
			title,
			content,
			cancelText,
			confirmText,
			confirmColor: "#e03c31",
			success: (e) => {
				if (e.confirm) {
					confirm && confirm()
				} else if (e.cancel) {
					cancel && cancel()
				}
			},
			fail: (e) => {
				console.log(e)
			}
		})
		// #endif
	},
	showMessage(messageText, msgType="success") {
		// #ifdef APP-PLUS
		dialog.showMessage({
			msgType,
			messageText
		})
		// #endif
		// #ifndef APP-PLUS
		uni.showToast({
			title: content,
			icon: 'none'
		})
		// #endif
	},
	popupLoadingOpen(popupContent = "加载中...") {
		// #ifdef APP-PLUS
		dialog.popupLoadingOpen({
			popupContent
		})
		// #endif
		// #ifndef APP-PLUS
		uni.showToast({
			title: content,
			icon: 'none'
		})
		// #endif
	},
	popupLoadingClose() {
		dialog.back(true);
	}
}

 三、使用方式

1、在uniapp的根目录下的components创建以下三个文件

2、配置page.json文件

 {
            "path": "components/dialog/index",
            "style": {
                "navigationStyle": "custom",
                // #ifdef APP-PLUS
                "backgroundColor": "transparent",
                "backgroundColorTop": "transparent",
                "backgroundColorBottom": "transparent",
                // #endif
                "app-plus": {
                    "animationType": "fade-in",
                    "background": "transparent",
                    "popGesture": "none"
                }
            }
        }

 3、在App.vue中定义全局变量,在原来的基础上添加以下代码

  import dialog from '@/components/dialog/dialogUtils.js'
  export default {
    onLaunch: function() {
        uni['dialog'] = dialog;
      this.initApp()
    }

}

 四、举例

1、提示弹窗

uni.dialog.alert("消息文本","提示",()=>{
                    uni.showToast({ title: '好的', icon:"none" });
                },"好的");

 

 2、确认弹窗

uni.dialog.confirm("这是一个确认弹窗",()=>{
                    uni.showToast({ title: '确定', icon:"none" });
                },()=>{
                    uni.showToast({ title: '取消', icon:"none" });
                });

 

 3、uniapp自带的确认弹窗

uni.dialog.dialogConfirm("这是一个确认弹窗",()=>{
                                    uni.showToast({ title: '确定', icon:"none" });
                                },()=>{
                                    uni.showToast({ title: '取消', icon:"none" });
                                });

 

4、消息提示框---支持uniapp的组件的消息类型(success、info、error、warn)

 uni.dialog.showMessage("1111");//默认sucess

 uni.dialog.showMessage("1111","info");

 uni.dialog.showMessage("1111","error");

 uni.dialog.showMessage("1111","warn");

 

5、加载提示框

uni.dialog.popupLoadingOpen("正在努力加载中....");//打开加载框

uni.dialog.popupLoadingClose(); //关闭加载框

 

五、案例展示

 1、

uni.dialog.confirm("是否提交?",()=>{
				uni.dialog.popupLoadingOpen();
				cancelForSAP(this.printing).then(res => {
					//清空数据
					this.clearData();
					uni.dialog.alert(res.data,"sap凭证");//显示sap凭证
				}).finally(fi => {
					uni.dialog.popupLoadingClose();
				})
				});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/604161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

连锁药店系统:如何提高效率和客户满意度?

连锁药店系统是一种用于提高效率和客户满意度的软件系统&#xff0c;它能够管理多个药店的日常营运。通过这种系统&#xff0c;药店可以更好地管理库存、员工、销售和客户信息等方面&#xff0c;从而提高整体的经营效率。 首先&#xff0c;连锁药店系统能够帮助药店管理库存。系…

黑马Redis视频教程实战篇(六)

目录 一、附近商户 1.1、GEO数据结构的基本用法 1.2、导入店铺数据到GEO 1.3、实现附近商户功能 二、用户签到 2.1、BitMap功能演示 2.2、实现签到功能 2.3、签到统计 2.4、关于使用bitmap来解决缓存穿透的方案 三、UV统计 3.1、HyperLogLog 3.2、测试百万数据的统…

I.MX6ull 中断 二 (按键驱动蜂鸣器)

按键中断 KEY0 &#xff08;UART1_CTS 引脚&#xff09;触发蜂鸣器 1 修改start.S 添加中断相关定义 中断向量表 .global _start /* 全局标号 *//** 描述&#xff1a; _start函数&#xff0c;首先是中断向量表的创建* 参考文档:ARM Cortex-A(armV7)编程手册V4.0.pdf P…

【花雕学AI】ChatGPT帮我快速优化标题:古老的非洲部落,有一种神奇的超音速烫脚舞

关于非洲烫脚舞&#xff0c;直接看看ChatGPT的许多创意&#xff0c;一般人确实想不到&#xff1a; 部落文化的声动震波 非洲之歌:部落的音速节奏 非洲土著的音速脚掌传奇 古老部落的震人心魂之舞 非洲红土之声:脚掌舞的激情 非洲神秘部落的超音速脚掌舞 仙踪般的部落音乐…

chatgpt赋能python:Python绘制函数曲线:创造出令人惊叹的图形

Python绘制函数曲线&#xff1a;创造出令人惊叹的图形 随着越来越多的人开始关注数据可视化&#xff0c;Python成为了一种被广泛使用的工具&#xff0c;用于创建各种图形&#xff0c;包括函数曲线。Python图形库的灵活性和适用性使得它成为数据科学和工程领域中最受欢迎的编程…

如何用 ChatGPT 一句话生成 Web 应用?

原型系统的开发对很多不会编程的人来说&#xff0c;原本确实是一道门槛&#xff0c;而且看似难以逾越。而现在&#xff0c;障碍突然间就消失了。 插件 ChatGPT 现在有了一个内容比较丰富的插件系统&#xff0c;而且 Plus 用户已经不再需要填表申请后漫长等待&#xff0c;直接就…

英雄算法联盟 | 六月算法集训顺利开始

文章目录 前言一、集训规划二、星友的反馈1、有觉得题目简单重新找回了自信的2、有拿到题不管三七二十一疯狂输出的3、有为了完成当天作业奋斗到凌晨的4、有自己悟出了坚持就是胜利的道理的5、有发现身边人都在跑而跃跃欲试的6、有上班摸鱼刷题只因为了赶进度的7、有看到大家都…

【微信小程序开发】第 2 节 - 注册小程序开发账号

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、注册小程序开发账号 3、总结 1、缘起 开发微信小程序从大的方面来说主要分为三步&#xff1a; ① 注册小程序开发…

【观察】星环科技:布局行业大模型赛道,加速国产化替代进程

以ChatGPT和GPT所代表的大模型&#xff0c;已经在国内形成了“海啸效应”&#xff0c;几乎所有的科技公司都在想方设法进入大模型的赛道。背后的核心驱动力&#xff0c;就在于大模型的最大价值在于普遍提升个人生产力&#xff0c;而各行各业的公司都在积极寻找应用大模型和生成…

黑客使用哪些编程语言

黑客使用哪些编程语言&#xff1f; 使用 Python 分析漏洞利用数据库 克里斯蒂安科赫 迈向数据科学 2021 年&#xff0c;我们与科学家同行一起在德国混沌计算机俱乐部 &#xff08;CCC&#xff09; 进行了一项调查。我们的目标是找出黑客最常使用的编程语言。 本文跟进调查&…

M F C(七)对话框

概念 与用户进行交互的窗口&#xff0c;它的顶级父类为CWND&#xff0c;对话框上面可以有各种控件&#xff0c;控件也是继承自CWND 基本控件功能对应的类静态文本框显示文本&#xff0c;一般不能接收输入信息CStatic图像控件显示图标、方框、和图元文件CStatic编辑器编辑正文…

公网SSH远程连接Termux – 电脑使用安卓Termux 「无需公网IP」

文章目录 1.安装ssh2.安装cpolar内网穿透3.远程ssh连接配置4.公网远程连接5.固定远程连接地址 转载自cpolar极点云的文章&#xff1a;公网SSH远程连接Termux – 电脑使用安卓Termux 「无需公网IP」 使用安卓机跑东西的时候&#xff0c;屏幕太小&#xff0c;有时候操作不习惯。不…

【Linux】crontab 定时任务

当你需要在Linux系统中定期执行某些任务时&#xff0c;crontab&#xff08;cron table&#xff09;是一个非常有用的工具。它允许你根据预定的时间表创建和管理定时任务。 一、从守护进程到crond进程1.1 Linux 守护进程1.2 任务调度进程crond 二、 crontab 详细介绍2.1 crontab…

AI狂飙突进,存力需作先锋

5月30日&#xff0c;在2023中关村论坛成果发布会上&#xff0c;《北京市加快建设具有全球影响力的人工智能创新策源地实施方案&#xff08;2023-2025年&#xff09;》正式发布。《实施方案》要求&#xff0c;支持创新主体重点突破分布式高效深度学习框架、大模型新型基础架构等…

chatgpt赋能python:Python列表数据相加的完全指南

Python列表数据相加的完全指南 Python中的列表是一种非常方便的数据结构&#xff0c;它允许我们存储和处理一组数据。在这篇文章中&#xff0c;我们将介绍如何在Python中使用列表来进行数据相加的操作&#xff0c;并提供一些实用的技巧和建议。如果你正在寻找Python中关于列表…

linux安装docker并设置国内镜像仓库

前置条件 该方案为centos上安装docker&#xff0c;其他版本linux请参照官方文档&#xff1a;https://docs.docker.com/engine/install/centos/该linux系统没有安装过docker&#xff0c;或者已卸载docker #卸载docker yum remove docker \docker-client \docker-client-latest…

springboot整合kafka入门

kafka基本概念 producer&#xff1a; 生产者&#xff0c;负责发布消息到kafka cluster(kafka集群)中。生产者可以是web前端产生的page view&#xff0c;或者是服务器日志&#xff0c;系统CPU、memory等。 consumer&#xff1a; 消费者&#xff0c;每个consumer属于一个特定的c…

Git提交代码报错 Push failed unable to access

目录 场景 环境&#xff1a; Git配置 场景 Push failed unable to access https://github.com/1790753131/remotRepository3.git/: Failed to connect to github.com port 443 after 21114 ms: Couldnt connect to server Push failed unable to ac…

A JavaScript error occurred in the main processUncaught Exception

A JavaScript error occurred in the main processUncaught Exception: Error: getaddrinfo ENOTFOUND rfw.jnsii.com at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:60:26) &#x1f4a7; 记录一下今天遇到的 b u g \color{#FF1493}{记录一下今天遇到的bug} 记录一…

开放接口签名(Signature)实现

开放接口签名(Signature)实现方案 既然是对外开放&#xff0c;那么调用者一定没有我们系统的Token&#xff0c;就需要对调用者进行签名验证&#xff0c;签名验证采用主流的验证方式&#xff0c;采用Signature 的方式。 字段 类型 必传 说明 appid String 是 应用id tim…