onLaunch 是应用生命周期,初始化完成时触发(全局只触发一次),
onload是页面生命周期,理论上应该先执行onLaunch 后执行页面生命周期onLoad,实际上在执行onlaunch的同时,也会执行onLoad生命周期,可能会导致一些数据加载问题。
一、main.js
// 让页面的 onLoad 在 onLaunch 之后执行
Vue.prototype.$onLaunched = new Promise(resolve => {
Vue.prototype.$isResolve = resolve
})
二、在 App.vue 的 onLaunch 中增加代码 this.$isResolve();
//app.vue生命周期中,onlaunch执行时,执行this.$isResolve()
onLaunch () {
//发送请求
uni.request({
success: loginRes => {
// 当执行完业务逻辑,需要同步onload时,调用一下
this.$isResolve()
}
})
}
三、在页面 onLoad 中增加代码 await this.$onLaunched;
//onLoad 生命周期函数前,加async/await,用此方法同步执行顺序
async onLoad() {
//async/await,当执行完APP生命周期中的onlaunch,再执行页面中的业务
await this.$onLaunched;
//执行页面中的业务代码
},