当某个页面调用了 wx.reLaunch(),文档里说的是关闭其它所有页面并打开指定的页面,所以理论上其它所有页面被关闭时应该都会触发 onUnload(),可实际上 reLaunch 关闭他们时并没有调用 onUnload,仅调用了当前页面栈中的 onUnload,因为其它标签页不在 getCurrentPages() 返回的页面栈中,所以就不会被调用。
假如我在一个页面 onLaunch() 中往全局注册了或写入了某些东西,在 onUnload() 卸载这些写入的东西,一旦多个标签页某个页面调用了 wx.reLaunch(),页面逻辑就会出问题。
所以这里是不是应该调整为 wx.reLaunch() 不只是触发打开 getCurrentPages() 返回的页面 onUnload(),也应该在关闭其它标签页时调用他们的 onUnload()
这里确实是有这问题,reLaunch只对页面栈中的页面进行了unload。后续我们会尝试修复这个bug的,感谢反馈。
你好,请问这个问题还没有修复吗?
我在开发者工具上测试这种情况依旧的,已经更新了最新的开发者工具。
请给一下能复现问题的代码片段,并告知一下仍然存在问题的基础库版本。我这边看一下是不是用例没有覆盖全。
重现很简单,设几个标签页,假设有两个,分别是 /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。
问题知道了,前面理解有误。此 bug 会跟近期的 patch 版本修复,预计是 2.4.2。
还有问题,wx.reLaunch() 不仅没有调用其它标签页的 onUnload(),而且还没有触发那些页面里所使用组件的 detached()。页面效果稍复杂,就会出现各种问题。