在病人首页实现弹窗消息功能时,我们遇到了一个用户体验问题:当服务器响应速度较慢时,用户已经导航到其他页面,但弹窗消息仍然会弹出。这是因为异步请求在页面隐藏后仍然会执行其回调函数,导致在不合适的时机显示弹窗。
具体表现为:
问题的根本原因在于异步请求的生命周期管理:
checkAndShowPopupMessages 函数在 onShow 生命周期中被调用setTimeout 延迟1秒显示弹窗,确保页面加载完成这种行为在网络条件较差或服务器负载较高的情况下尤为明显,因为请求响应时间变长,用户更容易在等待期间离开页面。
引入页面活跃状态跟踪机制,在显示弹窗前检查页面是否仍然可见。只有当页面处于活跃状态时才显示弹窗。
isPageActiveonShow)设置状态为活跃onHide)设置状态为非活跃// 添加页面活跃状态标志
const isPageActive = ref(false)
// 在页面显示时设置为活跃
onShow(() => {
isPageActive.value = true
// ... 其他逻辑
checkAndShowPopupMessages()
})
// 在页面隐藏时设置为非活跃
onHide(() => {
isPageActive.value = false
})
// 修改弹窗检查函数
const checkAndShowPopupMessages = async () => {
try {
// 获取消息列表...
if (popupMessages.length > 0) {
const latestMessage = popupMessages[0]
setTimeout(() => {
// 关键检查:页面是否仍然活跃
if (!isPageActive.value) {
return // 页面已隐藏,不显示弹窗
}
uni.showModal({
// 显示弹窗...
})
}, 1000)
}
} catch (error) {
console.error('检查弹窗消息失败:', error)
}
}
通过引入页面活跃状态检查机制,我们成功解决了弹窗消息在页面隐藏后仍然显示的问题。这种解决方案的核心在于理解异步操作的生命周期,并通过状态管理来控制UI更新的时机。
该方案不仅适用于弹窗消息场景,也适用于其他需要在页面特定状态下执行的异步操作,如数据加载、动画播放等。关键在于建立页面状态与异步操作之间的关联,确保UI行为始终符合用户的当前上下文。
这种设计提高了应用的健壮性和用户体验,尤其在网络条件不稳定的环境下能够提供更一致的交互体验。