uni-app 微信小程序 uni.switchTab 后触发不相关页面的 onShow 生命周期的 bug

发布于 1周前 作者 wuwangju 来自 Uni-App

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上正常  
具体请结合附件查看  

2 回复

解决了吗?


在 uni-app 开发微信小程序时,使用 uni.switchTab 切换页面后,可能会遇到不相关页面的 onShow 生命周期被触发的问题。这通常是由于微信小程序的页面栈管理机制和 uni-app 框架的某些特性导致的。

问题原因

  1. 页面栈管理:微信小程序的页面栈管理机制在切换 Tab 页面时,可能会触发其他页面的 onShow 生命周期。这是因为 Tab 页面的切换会涉及到页面栈的调整,可能会导致其他页面的状态发生变化。

  2. uni-app 框架特性:uni-app 在编译到微信小程序时,可能会对页面生命周期进行一些封装和处理,导致在某些情况下,onShow 生命周期被错误地触发。

解决方案

  1. 检查页面栈:在 onShow 生命周期中,可以通过 getCurrentPages() 方法获取当前页面栈,判断当前页面是否确实需要执行 onShow 中的逻辑。如果当前页面不在页面栈中,可以避免执行不必要的逻辑。

    onShow() {
      const pages = getCurrentPages();
      const currentPage = pages[pages.length - 1];
      if (currentPage.route === 'your-page-path') {
        // 执行你的逻辑
      }
    }
  2. 使用 onTabItemTap 生命周期:如果你需要在切换 Tab 页面时执行某些逻辑,可以使用 onTabItemTap 生命周期,而不是依赖 onShowonTabItemTap 是专门用于处理 Tab 页面切换的生命周期。

    onTabItemTap(item) {
      console.log(item.index);
      console.log(item.pagePath);
      console.log(item.text);
      // 执行你的逻辑
    }
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!