收藏
回答

小程序每次进入页面时,不会重新计算 Page(options) 中的 options 配置?

小程序非第一次(第二、三、四、五...)次进入页面时,不会重新计算 options 配置,当 options 配置中的某个属性是动态生成的时候,就会产生问题。

如下代码,预期是,每次进入页面,this.handler 都是一个全新的函数,但现状并非如此...

请问小程序每次进入页面时的 js 加载、Page(options) 初始化逻辑细节是如何设计的?

import { useLockCallback } from '../../utils/index'
Page({
  handler: useLockCallback(function() {
    // 只有第一次进入页面时,才会调用 useLockCallback 函数
    // 从 Page2 返回 Page1,再从 Page1 第二次进入 Page2 时,没有调用 useLockCallback 重新生成一个新的 handler 
  })
})
回答关注问题邀请回答
收藏

1 个回答

  • showms
    showms
    07-18

    猜测是当页面或组件被销毁时,相关模块的引用虽然也会被移除,但还没被垃圾回收释放内存

    07-18
    有用
    回复 4
    • 北方
      北方
      07-18
      因为按照微信小程序开发文档的描述,调用 navigateBack 会从栈顶弹出 delta 个页面并销毁,所以按照我的设想,当重新进入页面时它应当重新调用页面的 Page(options) 重新计算options,这时 useLockCallback 便可以重新生成一个新锁,但实际上看来,微信可能是为了提升再次进入页面的加载速度,它内部缓存了页面实例
      07-18
      回复
    • showms
      showms
      07-18回复北方
      嗯,刚才测试了一下,页面栈是有被弹出。但是估计还没被垃圾回收释放内存
      07-18
      回复
    • 北方
      北方
      07-18回复showms
      现在问题是,我封装的这个函数已经被大量应用在项目中了,无论是点击事件发请求的异步操作还是弹窗等待用户操作,一直表现得正常,直到有一天有个人打开弹窗,不小心滑到屏幕边缘触发返回之后,重新进入页面就再也无法点击“提交”按钮了,我现在是想在不改变当前使用方式的情况下,能否在页面销毁时能够自动把闭包里面的锁释放掉
      07-18
      回复
    • showms
      showms
      07-18回复北方
      怀疑是闭包里面持有了页面的this,导致页面没有释放,可以尝试沿着这个思路看能不能解决


      https://developers.weixin.qq.com/miniprogram/dev/framework/performance/tips/runtime_memory.html#5.%20%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%B8%B8%E8%A7%81%E7%9A%84%E5%86%85%E5%AD%98%E6%B3%84%E9%9C%B2%E9%97%AE%E9%A2%98
      07-18
      回复
登录 后发表内容