uniapp在App端定义全局弹窗,当打开关闭弹窗会触发onShow、onHide生命周期怎么解决?

在uniapp(App端)中实现自定义弹框,可以通过创建一个透明页面来实现。点击进入当前页面时,页面背景会变透明,用户可以根据自己的需求进行自定义,最终效果类似于弹框。

遇到问题:当打开弹窗(进入弹窗页面)就会触发当前页面的onHide函数,关闭弹窗(跳出弹窗页面)就会触发上一页的onShow函数。有时候我们在onShow、onHide函数会定义自己的逻辑处理,比如在onShow函数发请求、在onHide销毁定时器,那么当打开关闭弹窗都会触发一遍。当打开关闭弹窗避免不触发自己定义的逻辑处理,这问题怎么解决呢?

解决逻辑:

1、我们可以在vuex定义一个变量,默认为false,当打开弹窗(进入弹窗页面)之前把该变量改成true,关闭弹窗(跳出弹窗页面)之后把该变量改成false。(或者直接使用uni.getStorageSync本地存储和uni.removeStorageSync删除缓存也可以。)

2、在调用弹窗的页面的onShow、onHide函数获取到该变量,判断变量如果为true,直接结束函数。

本码使用uniapp插件的ayy-modal全局弹窗,网址:uniapp 全局弹窗 - DCloud 插件市场

vuex的store 定义一个弹窗状态和改变状态的方法

复制代码
	state: {
		ayyModalFlag: false,
	},
	mutations: {
		setAyyModalFlag(state, flag) {
		    state.ayyModalFlag = flag;
	},

App.vue 把vuex的store定义在全局,方便调用

复制代码
	import store from "@/store"

	globalData: {
		store,
	},

ayy-modal/ayy-modal.js 进入和跳出弹窗页面改变弹窗状态

复制代码
			const store = getApp().globalData.store
			store.commit('setAyyModalFlag', false)


			const store = getApp().globalData.store
			store.commit('setAyyModalFlag', true)

在页面调用弹窗和处理打开关闭弹窗多次触发onShow和onHide函数的问题

复制代码
		onShow() {
			// #ifdef APP
			if (this.$store.state.ayyModalFlag) return
			// #endif
			console.log("onShow---", );
			// 在这里处理你的逻辑
		},
		onHide() {
			// #ifdef APP
			if (this.$store.state.ayyModalFlag) return
			// #endif
			console.log("onHide===", );
			// 在这里处理你的逻辑
		},
		methods: {
			openAyyModel() {
				uni.$ayyModal.show({
					title: "我是标题",
					content: "我是内容",
					confirmFun: () => {

					}
				})
			},
		},
相关推荐
excel1 小时前
如何解决 Nuxt DevTools 中关于 unstorage 包的报错
前端
Rust研习社1 小时前
使用 Axum 构建高性能异步 Web 服务
开发语言·前端·网络·后端·http·rust
C澒2 小时前
AI 生码 - API2Code:接口智能匹配与 API 自动化生码全链路设计
前端·低代码·ai编程
浔川python社2 小时前
HTML头部元信息避坑指南技术文章大纲
前端·html
IT_陈寒2 小时前
SpringBoot配置加载顺序把我坑惨了
前端·人工智能·后端
kyriewen2 小时前
Next.js部署:从本地跑得欢,到线上飞得稳
前端·react.js·next.js
Moment2 小时前
面试官:给 llm 传递上下文,有哪几个身份 role ❓❓❓
前端·后端·面试
跨境数据猎手2 小时前
跨境独立站系统技术拆解(附带源码)
服务器·前端·php
豹哥学前端3 小时前
用猜数字游戏,一口气掌握 JavaScript 核心知识点(附完整代码)
前端·javascript
忆往wu前3 小时前
从0到1一步步拆解搭建,梳理一个 Vue3 简易图书后台全开发流程
前端·javascript·vue.js