收藏
回答

页面顶层声明的变量在unload后不会初始化的问题

框架类型 问题类型 终端类型 微信版本 基础库版本
小程序 Bug 客户端 0 2.7.0

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

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

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





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


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

2 个回答

  • Maverick
    Maverick
    2019-05-17

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

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

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

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

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


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


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

    2019-05-17
    有用 2
    回复 11
    • 困
      2019-05-17

      那大大,是在生命周期钩子里定义这些变量吗

      2019-05-17
      回复
    • 困
      2019-05-17

      然后,如果想要缓存页面的操作,比如上拉加载的滑动状态,重新进入时又不想执行onload里的操作,这是不是最好由微信提供缓存页面实例的功能呢

      2019-05-17
      回复
    • Maverick
      Maverick
      2019-05-17回复

      能拿到当前页面实例就行,生命周期、方法的this指向都是当前页面实例

      2019-05-17
      回复
    • Maverick
      Maverick
      2019-05-17回复

      重新进入时不想再执行onLoad里的操作,你onLoad中是获取数据吗,可以把数据存在最外层,就像你之前存page一样,若已有数据就直接拿来用,不再获取即可。

      2019-05-17
      回复
    • 困
      2019-05-17

      行是行,不过这样又得保证定义这些变量要最先执行。

      感觉最好还是微信能在退出页面时清除这些变量,或者不清除变量同时把页面实例也给缓存了,这样一个页面才能上下行为统一吗

      2019-05-17
      回复
    查看更多(6)
  • 困
    2019-05-16

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

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


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


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

    2019-05-16
    有用 1
    回复
登录 后发表内容