问题描述:
当多次路由到同一个页面时,该页面上的变量会相互污染,而不是每次打开都是一个全新的初始状态
仔细研究了这个问题,可以分成两个问题。
- 全局污染
在 xxx.js 中定义的全局变量(即和Page({...})
同级),多次打开同一个页面会共用一个。
例如页面如果这样打开 A?id=1 => B => A?id=2, 在 A 页面定义了全局变量const a = []
, 并且在 Page 的 onLoad 生命周期中 a.add(this),当打开 A?id=1 时,变量 a 的值是 [A?id=1],接着在 A?id=1 中跳到页面 B,然后在页面 B 跳到 A?id=2(注意这里不是回退,而是 wx.navigateTo 新打开),变量 a 的值是 [A?id=1, A?id=2], 而不是期望的 [A?id=2]
这个是原生小程序的bug,wepy自然也有,先不用管 - PageData污染
即Page({data: {...})
中的data数据污染。还拿上面的例子,当到了页面 A?id=2 后,开始点小程序左上角返回按钮往回退。先退到页面 B,再退到页面 A?id=1。注意诡异的事情发生了,页面 A?id=1 的PageData已经变成了A?id=2 的数据,此时并不会在视图上反映出来,因为视图并没有更新(回退并不会触发视图更新),但是 console.log 出来页面 A?id=1 的PageData就能看到是 A?id=2 的数据(可以把 A?id=1 和 A?id=2 看成两个不同用户的个人信息页面)。
这种最简单的场景我用原生小程序和wepy做了完全相同的测试,原生小程序回退并不会出现这种情况,页面 A?id=1 仍是离开它跳转到其它页面时的样子。而wepy出现了这种情况,看来是wepy的bug。
我看了wepy构建后生成的文件,看到生成了 _wepy,_default 这些全局变量(会发生上面说的全局污染),会不会是这些影响了呢
2条答案
按热度按时间41ik7eoe1#
我目前用onHide 和 onShow来处理这个问题
onHide把数据保存到global,onShow来还原数据
bkkx9g8r2#
我目前用onHide 和 onShow来处理这个问题
onHide把数据保存到global,onShow来还原数据
我现在大致也是这样处理的,可解燃煤之际,仍有隐晦bug,期待官方fix