实际的项目开发中,页面的初始化几乎是统一的,在某些场景下还需要扩展小程序页面的生命周期钩子。
1. 场景和需求描述
- 页面加载时,首先调用
onLoad
,此时需要解码页面路由中的参数。
- 在
onLoad
中可能要请求页面的初始化数据,此时得同步获取access token后才能发起http请求。
- 从其他页面返回时,调用
onShow
,可能要刷新页面数据,此时得同步检查access token有效后才能发起http请求,
- 第一次进入页面时,onLoad和onShow均会被调用,要避免重复检查access token。
- 一些操作(例如埋点统计PV)需要在检查access token有效后,每次进入页面都被执行。经过上述改造后第一次进入页面时,onShow将不会被执行,因此新增
onAfterAuth
钩子。
2. 源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| import wxUtil from '../utils/wxUtil'
const page = function (config) { config.global = config.global || {} Page({ ...config,
onLoad (options) { const urlParams = JSON.parse(JSON.stringify(options)) for (const prop in urlParams) { if (urlParams.hasOwnProperty(prop)) { urlParams[prop] = decodeURIComponent(urlParams[prop]) } } if (config.needReadyInOnLoad === 'close') { typeof config.onLoad === 'function' && config.onLoad.call(this, urlParams) return } wxUtil.ready().then(() => { this.global._firstReadyCompleted = true typeof config.onAfterAuth === 'function' && config.onAfterAuth.call(this) typeof config.onLoad === 'function' && config.onLoad.call(this, urlParams) }) },
onShow () { if (config.needReadyInOnShow === 'close') { typeof config.onShow === 'function' && config.onShow.call(this) return } if (!this.global._firstReadyCompleted && config.needReadyInOnLoad !== 'close') { this.global._firstReadyCompleted = true return } wxUtil.ready().then(() => { typeof config.onAfterAuth === 'function' && config.onAfterAuth.call(this) typeof config.onShow === 'function' && config.onShow.call(this) }) } }) }
export default page
|
3. 其他说明