收藏
回答

wx.reLaunch 不会触发其它标签页的 onUnload

框架类型 问题类型 终端类型 微信版本 基础库版本
小程序 Bug 工具 6.6.6 2.0.2

当某个页面调用了 wx.reLaunch(),文档里说的是关闭其它所有页面并打开指定的页面,所以理论上其它所有页面被关闭时应该都会触发 onUnload(),可实际上 reLaunch 关闭他们时并没有调用 onUnload,仅调用了当前页面栈中的 onUnload,因为其它标签页不在 getCurrentPages() 返回的页面栈中,所以就不会被调用。


假如我在一个页面 onLaunch() 中往全局注册了或写入了某些东西,在 onUnload() 卸载这些写入的东西,一旦多个标签页某个页面调用了 wx.reLaunch(),页面逻辑就会出问题。


所以这里是不是应该调整为 wx.reLaunch() 不只是触发打开 getCurrentPages() 返回的页面 onUnload(),也应该在关闭其它标签页时调用他们的 onUnload()


回答关注问题邀请回答
收藏

2 个回答

  • 小程序技术专员-june
    小程序技术专员-june
    2018-05-22

    这里确实是有这问题,reLaunch只对页面栈中的页面进行了unload。后续我们会尝试修复这个bug的,感谢反馈。

    2018-05-22
    有用
    回复 7
    • Pader
      Pader
      2018-11-12

      你好,请问这个问题还没有修复吗?

      2018-11-12
      回复
    • Pader
      Pader
      2018-11-13回复小程序技术专员-june

      我在开发者工具上测试这种情况依旧的,已经更新了最新的开发者工具。

      2018-11-13
      回复
    • 小程序技术专员-june
      小程序技术专员-june
      2018-11-13回复Pader

      请给一下能复现问题的代码片段,并告知一下仍然存在问题的基础库版本。我这边看一下是不是用例没有覆盖全。

      2018-11-13
      回复
    • Pader
      Pader
      2018-11-13回复小程序技术专员-june

      重现很简单,设几个标签页,假设有两个,分别是 /pages/page1 和 /pages/page2。

      page1 没什么,page2 是以下代码:

      Page({
          data: {
          },
          onLoad(options) {
              console.log('page load');
          },
          onUnload() {
              console.log('page unload');
          }
      })

      很简单吧,此时你两个标签页分别点一下,进入page2的时候在控制台输出 page load,再点回 page1,此时 page2 仍然是存活的,所以不会输出 page unload 是正常的。

      这时在控制台输入 wx.reLaunch({url:'/pages/page1'});

      你会发现 page2 被销毁了,但是并不会输出 page unload。

      只有正常的点击返回的时候,页面才会触发 onUnload。

      2018-11-13
      回复
    • 小程序技术专员-june
      小程序技术专员-june
      2018-11-13回复Pader

      问题知道了,前面理解有误。此 bug 会跟近期的 patch 版本修复,预计是 2.4.2。

      2018-11-13
      回复
    查看更多(2)
  • Pader
    Pader
    2018-07-26

    还有问题,wx.reLaunch() 不仅没有调用其它标签页的 onUnload(),而且还没有触发那些页面里所使用组件的 detached()。页面效果稍复杂,就会出现各种问题。

    2018-07-26
    有用
    回复
登录 后发表内容