uni-app中App.vue的onLaunch函数和页面的onLoad函数异步问题的解决方案(Vue2/Vue3)

应用生命周期函数 onLaunch 和页面生命周期函数 onLoad 存在同时执行的问题,而在实际开发中往往需要先执行 onLaunch 再执行 onLoad,为了让页面的 onLoad 在 onLaunch 之后执行,可以使用以下解决方案:

Vue2 中的解决方案

1 修改 main.js

Vue.prototype.$onLaunched = new Promise(resolve => {
    Vue.prototype.$isResolve = resolve
})

2 修改 App.vue

在 App.vue 的 onLaunch 所有业务逻辑执行完毕后增加代码 this.$isResolve()

onLaunch: function() {
	this.getConfig().then(res => {
	    // 业务逻辑执行完毕
    	this.$isResolve()
	})
},

或者

async onLaunch: function() {
	await this.getConfig()
	// 业务逻辑执行完毕
    this.$isResolve()
},

3 修改页面

在页面的 onLoad 中增加代码 await this.$onLaunched,注意onload要添加async

async onLoad(option) {
	//等待倒计时	
	await this.$onLaunched;
	// 后续业务逻辑
},

Vue3 的解决方案

// main.js
import App from './App'
import { createSSRApp } from 'vue'
export function createApp() {
  const app = createSSRApp(App)
  app.config.globalProperties.$onLaunched = new Promise(resolve => {
    app.config.globalProperties.$isResolve = resolve
  })
  return {
    app
  }
}
<script setup>
// App.vue
import { onLaunch } from '@dcloudio/uni-app'
import {getCurrentInstance} from 'vue'
const { proxy } = getCurrentInstance();
const {$isResolve} = proxy
onLaunch(() => {
    setTimeout(() => {
        $isResolve()
    }, 3000)
})
</script>
<script setup>
// page 页面中
import {getCurrentInstance} from 'vue'
const {proxy} = getCurrentInstance();
const {$onLaunched} = proxy
import {onLoad} from '@dcloudio/uni-app'
onLoad(async ()=>{
    // 等待倒计时
    await $onLaunched;
    // 后续业务逻辑
})
</script>
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ironprosper

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值