微信小程序声明周期
小程序的生命周期,简单来说:就是app.js里的onLaunch和页面里的page.js的onLoad异步执行。
通过回调函数架构起联系,便于获取app.js内的全局数据
代码
app.js
//app.js
App({
onLaunch: async function () {
let openid = null;
if (!wx.cloud) {
console.error('[app.js] [onLaunch] 请使用 2.2.3 或以上的基础库以使用云能力')
} else {
wx.cloud.init({
// env 参数说明:
// env 参数决定接下来小程序发起的云开发调用(wx.cloud.xxx)会默认请求到哪个云环境的资源
// 此处请填入环境 ID, 环境 ID 可打开云控制台查看
// 如不填则使用默认环境(第一个创建的环境)
env: 'test-simorel',
traceUser: true,
});
try {
// 这个是云函数获取用户openid,你也可以用wx.login获取code,再从后台换取openid
let { result } = await wx.cloud.callFunction({
name: 'user',
data: {
$url: 'getOpenid'
}
});
console.info('[app.js] [onLaunch] get openid success', result);
openid = result;
// 由于这里是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
if (this.openidCallback) {
this.openidCallback(result);
}
} catch (err) {
console.error('[app.js] [onLaunch] get openid fail', err);
}
}
this.globalData = {
/** 用户openid */
openid
}
}
})
page.js
const appInstance = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
/** 用户openid */
openid: null
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: async function (options) {
console.log('[onLoad] appInstance.globalData', appInstance.globalData);
if (appInstance.globalData && appInstance.globalData.hasOwnProperty('openid') && appInstance.globalData.openid) {
console.info('[onLoad] appInstance.globalData.openid', appInstance.globalData.openid);
this.setData({
openid: appInstance.globalData.openid
});
} else {
appInstance.openidCallback = openid => {
console.info('[onLoad] [openidCallback] openid', openid);
if (openid) {
this.setData({
openid
});
}
};
}
}
}
控制台
从控制台打印的信息可以明显看出,先执行的页面的onload,后异步执行的onLaunch。但是因为回调函数的存在,我们依然成功拿到了openid。
参考文献
[1] Ning 微信小程序onLaunch异步,首页onLoad先执行?