uni-app 微信小程序 uni.switchTab 后触发不相关页面的 onShow 生命周期的 bug
uni-app 微信小程序 uni.switchTab 后触发不相关页面的 onShow 生命周期的 bug
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Mac | macOS12.3 | CLI |
HBuilderX | 3.3.13.20220314 | Vue CLI v4.5.15 |
产品分类:
uniapp/小程序/微信
操作步骤:
下载附件demo,npm i
,用HBuilder打开项目,运行到微信小程序,真机调试,点击”购物车",然后再点击"登录"页的返回按钮
预期结果:
点击"登录"页的返回按钮后,返回到"首页",且不会再次跳出"登录"页除非点击"购物车"
实际结果:
点击"登录"页的返回按钮后,又跳一次登录页,要再次点击登录页的返回按钮才会回到首页
bug描述:
在购物车页面onShow进行判断,如果用户未登录则跳登录(C)页面,在C点击返回按钮,调用uni.switchTab(首页),此时购物车页面的onShow被再次触发(在APP或小程序模拟器上不会再次触发),导致重复跳转到C,要再点一次C的返回才能回到首页
这个问题只会在小程序真机上出现,微信模拟器正常,APP上正常
具体请结合附件查看
解决了吗?
在 uni-app 开发微信小程序时,使用 uni.switchTab
切换页面后,可能会遇到不相关页面的 onShow
生命周期被触发的问题。这通常是由于微信小程序的页面栈管理机制和 uni-app 框架的某些特性导致的。
问题原因
-
页面栈管理:微信小程序的页面栈管理机制在切换 Tab 页面时,可能会触发其他页面的
onShow
生命周期。这是因为 Tab 页面的切换会涉及到页面栈的调整,可能会导致其他页面的状态发生变化。 -
uni-app 框架特性:uni-app 在编译到微信小程序时,可能会对页面生命周期进行一些封装和处理,导致在某些情况下,
onShow
生命周期被错误地触发。
解决方案
-
检查页面栈:在
onShow
生命周期中,可以通过getCurrentPages()
方法获取当前页面栈,判断当前页面是否确实需要执行onShow
中的逻辑。如果当前页面不在页面栈中,可以避免执行不必要的逻辑。onShow() { const pages = getCurrentPages(); const currentPage = pages[pages.length - 1]; if (currentPage.route === 'your-page-path') { // 执行你的逻辑 } }
-
使用
onTabItemTap
生命周期:如果你需要在切换 Tab 页面时执行某些逻辑,可以使用onTabItemTap
生命周期,而不是依赖onShow
。onTabItemTap
是专门用于处理 Tab 页面切换的生命周期。onTabItemTap(item) { console.log(item.index); console.log(item.pagePath); console.log(item.text); // 执行你的逻辑 }