Enochjdy
Enochjdy
  • 发布:2021-03-02 16:44
  • 更新:2023-06-06 14:24
  • 阅读:2751

关于前端弹窗无法覆盖原生导航栏及tabbar的一个解决方案

分类:uni-app

直接简单的先说一下我的需求, 首页加载的时候有弹窗,可能会多个,但是需求不能一次性全部弹出需要队列弹出,就是关闭一个之后再弹出下一个。这边使用到了vuex来存储全局弹窗队列 最下方附带有效果视频

这边是再App.vue中监听一下vuex > state中的弹窗队列

watch: {  
	ALERT_LIST(newVal, oldVal) {  
		if (newVal.length >= 1 && oldVal.length == 0) { //该条件存在则证明是第一个弹窗,需要先跳转页面  
			this.myRouter({     //这边是跳转一个新页面  
				type: "navigateTo",  
				url: "/pages/public/alert/alert",  
				animationType:"fade-in",  
				animationDuration:300  
			})  
					  
		}  
	}  
}  
  
///pages/public/alert/alert跳转的新页面中的page.json一定要这样设置,这样这个页面就把下面的页面给覆盖住包括tabbar与到导航栏,并且这个页面是透明的你可以再页面的style中自己给背景透明色  
"style": {  
				"navigationStyle": "custom",  
				"app-plus": {  
					"animationType": "fade-in",  
					"animationDuration": "200",  
					"bounce": "none",  
					"backgroundColor": "rgba(0,0,0,0)" // 背景透明  
				}  
			}  
  
在这个新页面中监听(也是这个队列)  
watch: {  
			ALERT_LIST(newVal, oldVal) {  
				if (newVal.length == 0) { //如果是最后一个弹窗的情况下就返回也就是关闭这个弹窗容器  
                                        uni.navigateBack({})  
				}   
			}  
		},  
		

这个就是你要显示的弹窗因为考虑到后期弹窗多的话我就做成了组件形式
说明:ALERT_LIST[0]就是拿这个队列中的第一项 name:就是你在往队列中添加新弹窗的时候定义的要与下面代码中的v-if后面对应的值一致这样在队列往前走的时候他就能显示对应的弹窗

<!-- 隐私的弹出 -->  
<protocol-alert @closeAlert="_closeAlert" v-if="ALERT_LIST[0].name == 'protoco'"></protocol-alert>   
<!-- //版本更新的弹出 -->  
<versionup-date @closeAlert="_closeAlert" v-if="ALERT_LIST[0].name == 'version'" :versionInfo="ALERT_LIST[0].data"></versionup-date>     
<!-- //淘宝客猜你想找的弹出 -->  
<copy-search @closeAlert="_closeAlert" v-if="ALERT_LIST[0].name == 'copysearch'"></copy-search>

注:在弹窗中如果有按钮出发了关闭弹窗要将队列中的这一项删除掉 (代码只是提供了一个大概的思路具体写法看你自己)

1 关注 分享
k***@163.com

要回复文章请先登录注册

梧桐树

梧桐树

在H5中不透明啊
2023-06-06 14:24
阿龙oO

阿龙oO

这个 myRouter 是一个啥样的函数
我这边用 uni.navigateTo 无效啊
2021-07-21 20:24