js中的变量,如果和页面更新相关,我们会在data里定义。但是为了代码结构化和划区块,和页面不相关的变量我们喜欢定义在最外层。
但是页面unload后最外层的变量不会初始化,感觉这样是很不合理的。
比如上拉加载的参数(let page = 1;)在进入页面时初始值是1。当回退页面后unload触发,重新进入时data里的参数page会初始化为1,但是最外层的page不会初始化。具体请在代码片段里查看网络请求的参数
这样我们只能在onUnload钩子里出初始化相关参数,这很蛋疼啊。 微信大大们看下这问题,能不能unload时把最外层变量初始化
页面js文件只会在小程序启动时执行一次,并不是每次构造页面都会执行一次。
Page这个函数只是注册页面,你可以理解为Page函数定义了一个类,每次加载这一页都是用这个类new了一个对象。
只有tabBar中定义的页面是在离开后不会被销毁的,其他页面从路由栈中移除就销毁了。
销毁的是页面实例,而不是页面js文件的执行上下文,你每一个页面实例读取的都是这个执行上下文中的page变量,当然不会有变化。
所以不存在什么初始化、缓存这回事。
与视图层不相关的数据你可以放在当前页面实例中,即this中,如this._page=10,只要不覆盖原有的属性你想放什么都行,这样数据自然会和页面一起销毁,多个页面实例间也不互相干扰。
你想存页面实例间共享的数据,倒是可以放在最外层。
那大大,是在生命周期钩子里定义这些变量吗
然后,如果想要缓存页面的操作,比如上拉加载的滑动状态,重新进入时又不想执行onload里的操作,这是不是最好由微信提供缓存页面实例的功能呢
能拿到当前页面实例就行,生命周期、方法的this指向都是当前页面实例。
重新进入时不想再执行onLoad里的操作,你onLoad中是获取数据吗,可以把数据存在最外层,就像你之前存page一样,若已有数据就直接拿来用,不再获取即可。
行是行,不过这样又得保证定义这些变量要最先执行。
感觉最好还是微信能在退出页面时清除这些变量,或者不清除变量同时把页面实例也给缓存了,这样一个页面才能上下行为统一吗
像这种请求,只需要在onload时执行一次,然后上拉加载时执行。但是想保留页面状态的情况下退出页面,再进来onload还是会触发。
我在vue项目里保留页面上拉加载的状态就是缓存页面,再进入时create(类似于onload)是不会再次触发的,这样才是对的呀。
所以既然退出页面会执行unload那就把参数初始化呀,如果想保留参数那再进来就别onload了吧
说到缓存页面,顺便提一下,小程序能不能提供一个缓存页面的功能(缓存的页面再进入不onload)