页面顶层声明的变量在unload后不会初始化的问题
发布于 4 年前 作者 duanping 8653 次浏览 来自 问答

js中的变量,如果和页面更新相关,我们会在data里定义。但是为了代码结构化和划区块,和页面不相关的变量我们喜欢定义在最外层。

但是页面unload后最外层的变量不会初始化,感觉这样是很不合理的。

比如上拉加载的参数(let page = 1;)在进入页面时初始值是1。当回退页面后unload触发,重新进入时data里的参数page会初始化为1,但是最外层的page不会初始化。具体请在代码片段里查看网络请求的参数

这样我们只能在onUnload钩子里出初始化相关参数,这很蛋疼啊。 微信大大们看下这问题,能不能unload时把最外层变量初始化

2 回复

页面js文件只会在小程序启动时执行一次,并不是每次构造页面都会执行一次。

Page这个函数只是注册页面,你可以理解为Page函数定义了一个类,每次加载这一页都是用这个类new了一个对象。

只有tabBar中定义的页面是在离开后不会被销毁的,其他页面从路由栈中移除就销毁了。

销毁的是页面实例,而不是页面js文件的执行上下文,你每一个页面实例读取的都是这个执行上下文中的page变量,当然不会有变化。

所以不存在什么初始化、缓存这回事。


与视图层不相关的数据你可以放在当前页面实例中,即this中,如this._page=10,只要不覆盖原有的属性你想放什么都行,这样数据自然会和页面一起销毁,多个页面实例间也不互相干扰。

你想存页面实例间共享的数据,倒是可以放在最外层。

像这种请求,只需要在onload时执行一次,然后上拉加载时执行。但是想保留页面状态的情况下退出页面,再进来onload还是会触发。

我在vue项目里保留页面上拉加载的状态就是缓存页面,再进入时create(类似于onload)是不会再次触发的,这样才是对的呀。

所以既然退出页面会执行unload那就把参数初始化呀,如果想保留参数那再进来就别onload了吧

说到缓存页面,顺便提一下,小程序能不能提供一个缓存页面的功能(缓存的页面再进入不onload)

回到顶部