app.vue 里的 onLaunch 中如果有异步方法,比如登录方法,返回结果可能会在页面的 onLoad 之后,想让页面的 onLoad 在 onLaunch 之后执行。
解决
场景:比如微信小程序在 onLaunch 中进行登录后取得 openid 并获得 token,项目各页面需要带上该 token 请求其他接口。
vue2
main.js
1 2 3
| Vue.prototype.$onLaunched = new Promise((resolve) => { Vue.prototype.$isResolve = resolve })
|
App.vue
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
| <script> export default { onLaunch() {
uni.login({ success: (loginRes) => { login({ appId: 'wx1234567890', code: loginRes.code }).then((res) => { try { console.info(res.object.token) uni.setStorageSync('mcToken', res.object.token) this.$isResolve() } catch (e) { console.error(e) } }) } }) } } </script>
|
页面 onLoad
1 2 3 4 5 6 7 8 9
| <script> export default { async onLoad(option) { await this.$onLaunched } } </script>
|
vue3
main.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import { createSSRApp } from 'vue' import App from './App.vue'
export function createApp() { const app = createSSRApp(App) app.config.globalProperties.$onLaunched = new Promise((resolve) => { app.config.globalProperties.$isResolve = resolve }) return { app } }
|
App.vue
1 2 3 4 5 6 7 8 9 10
| <script> export default { onLaunch: function () { setTimeout(() => { console.log('--App-onLaunch', this) this.$isResolve() }, 2000) } } </script>
|
页面 onLoad
1 2 3 4 5 6 7 8 9 10
| <script> export default { async onLoad() { await this.$onLaunched setTimeout(() => { console.log('--page-onLoad', this) }, 1000) } } </script>
|
相关链接
[1] app.onLaunch 与 page.onLoad 异步问题终极解决方案
[2] vue 官网-app.config.globalProperties