Uni-App + Vue onLoad與onLaunch執行順序問題完整解決方案 – 3種實用方法詳解

導讀:在 Uni-app +?Vue?小程序應用開發中,你是否遇到過頁面加載時全局數據還未準備好的問題?本文將深入分析onLoad生命周期鉤子在onLaunch未完成時就執行的常見問題,并提供三種實用的解決方案。


📋 問題描述

在 Vue 應用開發中,特別是在小程序或某些特定場景下,我們經常會遇到?onLoad?生命周期鉤子在?onLaunch?還未完成時就執行的問題。這會導致:

??應用初始化數據未準備好
??全局配置未加載完成
??用戶信息未獲取到
??其他依賴?onLaunch?的資源無法使用


🔍 問題分析

生命周期執行順序

應用啟動 → onLaunch → 頁面加載 → onLoad

正常情況下,onLaunch?應該先執行完成,然后才是頁面的?onLoad。但在某些情況下:

問題類型具體表現
網絡延遲onLaunch?中的異步操作(如網絡請求)還未完成
資源加載某些資源還在加載中
權限檢查用戶權限驗證未完成
配置初始化應用配置未完全加載

常見場景示例

// app.js
App({onLaunch() {// 異步獲取用戶信息wx.getUserInfo({success: (res) => {this.globalData.userInfo = res.userInfo;},});// 異步獲取配置wx.request({url: "https://api.example.com/config",success: (res) => {this.globalData.config = res.data;},});},
});// page.js
Page({onLoad() {// 這里可能 userInfo 和 config 還未獲取到console.log(getApp().globalData.userInfo); // undefinedconsole.log(getApp().globalData.config); // undefined},
});

💡?小貼士:上面的代碼中,onLoad?執行時,異步請求可能還在進行中,導致全局數據無法正常獲取。


🛠? 解決方案

方案一:Promise 狀態管理(? 推薦)

對于 Vue 應用,可以在 Vue 原型上添加方法來管理啟動狀態。

// main.js
import Vue from "vue";// 創建啟動完成的 Promise
Vue.prototype.$onLaunched = new Promise((resolve) => {Vue.prototype.$isResolve = resolve;
});// 在應用啟動完成后調用
Vue.prototype.$isResolve();// 在組件中使用
export default {name: "MyComponent",async onLoad() {// 等待應用啟動完成await this.$onLaunched;// 現在可以安全地訪問全局數據console.log("應用啟動完成,組件已掛載");},
};

優點:簡單直接,易于理解和維護
適用場景:中小型 Vue 項目


方案二:事件總線模式

使用事件總線來通知各個組件應用啟動完成。

// eventBus.js
import Vue from "vue";
export default new Vue();// app.js
import eventBus from "./eventBus";App({onLaunch() {// 執行初始化邏輯this.initApp().then(() => {// 發送啟動完成事件eventBus.$emit("appLaunched");});},async initApp() {// 初始化邏輯await this.getUserInfo();await this.getConfig();},
});// page.js
import eventBus from "./eventBus";Page({onLoad() {// 監聽啟動完成事件eventBus.$once("appLaunched", () => {this.onAppReady();});},onAppReady() {// 應用啟動完成后的邏輯console.log("應用啟動完成");},
});

優點:解耦性好,組件間通信清晰
適用場景:需要組件解耦的中大型項目


方案三:狀態機模式

使用狀態機來管理應用的不同狀態。

// appState.js
class AppState {constructor() {this.state = "initializing"; // initializing, ready, errorthis.listeners = [];}setState(newState) {this.state = newState;this.notifyListeners();}addListener(listener) {this.listeners.push(listener);}notifyListeners() {this.listeners.forEach((listener) => listener(this.state));}isReady() {return this.state === "ready";}
}export default new AppState();// app.js
import appState from "./appState";App({onLaunch() {this.initApp().then(() => {appState.setState("ready");}).catch(() => {appState.setState("error");});},
});// page.js
import appState from "./appState";Page({onLoad() {if (appState.isReady()) {this.onAppReady();} else {appState.addListener((state) => {if (state === "ready") {this.onAppReady();}});}},onAppReady() {// 應用準備就緒后的邏輯},
});

優點:狀態管理清晰,擴展性強
適用場景:復雜的狀態管理需求


📊 方案對比總結

方案復雜度維護性擴展性推薦指數
Promise 狀態管理???????????????
事件總線模式???????????????
狀態機模式???????????????

🎯 最佳實踐建議

  1. 簡單項目:直接使用 Promise 狀態管理方案
  2. 中型項目:考慮事件總線模式,提高代碼解耦性
  3. 大型項目:使用狀態機模式,便于復雜狀態管理

寫在最后:通過以上方案,我們可以有效解決?onLoad?在?onLaunch?未完成時就執行的問題。選擇哪種方案取決于你的具體需求和項目架構。對于大多數情況,推薦使用?Promise 狀態管理?方案,它簡單、可靠且易于維護。


關注我們,獲取更多前端開發技術前沿干貨!?🚀

?Uni-App + Vue onLoad與onLaunch執行順序問題完整解決方案 - 3種實用方法詳解 - 高質量源碼分享平臺-免費下載各類網站源碼與模板及前沿技術分享

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95819.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95819.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95819.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

25、SSH遠程部署到另一臺機器

25、SSH遠程部署到另一臺機器 因為不是每一臺服務器都有jenkins的,一般都是一臺jenkins,部署很多機器 1、安裝插件 Publish Over SSH2、配置另一臺機器 # 生成秘鑰 ssh-keygen -t dsa# 把公鑰復制到要訪問的機器 ssh-copy-id root目標機器的ip# 第一次要…

2025年金融專業人士職業認證發展路徑分析

在金融行業數字化轉型的背景下,專業認證作為提升個人能力的一種方式,受到越來越多從業者的關注。本文基于行業發展趨勢,分析6個金融相關領域的專業資格認證,為職業發展提供參考。一、CDA數據分析師認證含金量CDA數據分析師是數據領…

日用百貨新零售小程序設計與開發(代碼+數據庫+LW)

摘要 本文設計并開發了一款基于Java、Spring Boot和MySQL的日用百貨新零售小程序,旨在通過數字化手段優化日用百貨的銷售與配送流程,滿足用戶便捷購物的需求。系統采用前后端分離架構,前端通過微信小程序實現用戶交互,后端基于Sp…

【Git】查看差異 刪除文件 忽略文件

- 第 122 篇 - Date: 2025 - 09 - 07 Author: 鄭龍浩(仟墨) 文章目錄查看差異 && 刪除文件 && 忽略文件1 git diff 可以查看哪些?基本用法比較不同提交比較分支文件比較其他2 徹底刪除文件3 忽略文件「1」應該忽略哪些文件&a…

HarmonyOS應用開發:三層工程架構

引言 在HarmonyOS應用開發過程中,隨著項目規模的增長,代碼的組織結構顯得尤為重要。 DevEco Studio創建出的默認工程僅包含一個entry類型的模塊,如果直接使用平級目錄進行模塊管理,工程邏輯結構較混亂且模塊間的一欄關系不夠清晰&…

phpMyAdmin文件包含漏洞復現:原理詳解+環境搭建+滲透實戰(windows CVE-2018-12613)

目錄 一、CVE-2018-12613漏洞 1、漏洞簡介 2、漏洞原理 (1)漏洞觸發點與正常邏輯 (2)過濾邏輯缺陷與繞過方式 二、滲透準備 1、訪問phpmyadmin靶場 2、登錄phpmyadmin 3、獲取session文件位置 三、滲透準備 1、讀取敏感…

Jakarta EE(基于 JPA)在 IntelliJ IDEA 中開發簡單留言板應用的實驗指導

Jakarta EE(基于 JPA)在 IntelliJ IDEA 中開發簡單留言板應用的實驗指導摘要:Jakarta EE 并不僅限于使用 H2 數據庫,它支持任何符合 JDBC 或 JPA 標準的數據庫,例如 MySQL、PostgreSQL、Oracle 等。H2 通常用于開發測試…

Gitea:輕量級的自托管Git服務

歡迎光臨我的個人博客查看最新文章:rivers blog 在當今的軟件開發世界中,代碼托管平臺是必不可少的工具。而對于尋求自主控制和數據隱私的團隊與開發者來說,Gitea提供了一個完美的解決方案。 1、 Gitea簡介 Gitea(發音為ɡ??ti…

深度學習-----簡單入門卷積神經網絡CNN的全流程

(一)卷積神經網絡(CNN)的核心思想傳統全連接網絡的缺陷圖像平鋪展開后,旋轉或位置變化會導致輸入差異大,難以識別舉例:手寫數字“8”在不同位置或旋轉后的識別困難(圖像在計算機中是…

Scikit-learn Python機器學習 - 特征降維 壓縮數據 - 特征選擇 - 單變量特征選擇 SelectKBest - 選擇Top K個特征

鋒哥原創的Scikit-learn Python機器學習視頻教程: 2026版 Scikit-learn Python機器學習 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程主要講解基于Scikit-learn的Python機器學習知識,包括機器學習概述,特征工程(數據…

Datawhale AI夏令營復盤[特殊字符]:我如何用一個Prompt,在Coze Space上“畫”出一個商業級網頁?

文章摘要 本文詳細記錄了我在Datawhale AI夏令營期間,如何另辟蹊徑,使用Coze(扣子空間)和精心設計的Prompt,從零開始構建一個專業的“智能SEO Agent”產品網頁的完整過程。文章將完整展示我編寫的“萬字”級Prompt&…

SVN和Git兩種版本管理系統對比

一、SVN(Subversion)簡介SVN是一種集中式版本控制系統。它有一個中心倉庫(repository),所有的代碼變更都記錄在這個中心倉庫中。每個開發者從中心倉庫檢出(checkout)代碼到本地工作副本&#xf…

【機器學習】綜合實訓(一)

項目一 鳶尾花分類該項目需要下載scikit-learn庫,下載指令如下:pip install scikit-learn快速入門示例:鳶尾花分類# 導入必要模塊 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklea…

vulhub通關筆記1—docker unauthorized-rce

1.docker unauthorized-rce 基本情況 docker swarm是一個將docker集群變成單一虛擬的docker host工具,使用標準的Docker API,能夠方便docker集群的管理和擴展,由docker官方提供: 需要在每臺機器上安裝docker,并且運行…

zotero擴容

最近出差,想要把本地的主機上的文件同步到筆記本,發現zotero不夠用,然后尋找了一些zotero擴容的方法,這里記錄一下,方便以后查閱。 zotero擴容創建賬戶登錄賬戶進一步擴容設置Apps Connection設置zoterozotero自帶同步…

Kafka基礎理論

Kafka概述 kafka是一個分布式的基于發布/訂閱模式的消息隊列,主要用于大數據實時處理領域。kafka采取了發布/訂閱模式,消息的發布者不會將消息直接發送給特定的訂閱者,而是將發布的消息分為不同的類別,訂閱者只接受感興趣的消息。…

蒼穹外賣項目實戰(day-5完整版)-記錄實戰教程及問題的解決方法

Redis基本操作及下載安裝包(Redis及可視化工具),都在我的上一篇文章:Redis基本知識及簡單操作,這里不再贅述 店鋪營業狀態修改功能 (1)需求分析與設計 (2)SpringDataRe…

第R8周:RNN實現阿爾茲海默病診斷

數據集包含2149名患者的廣泛健康信息,每名緩則的ID范圍從4751到6900不等,該數據集包含人口統計詳細信息,生活方式因素、病史、臨床測量、認知和功能評估、癥狀以及阿爾茲海默癥的診斷。 一、準備工作 1、硬件準備 import numpy as np import …

MySQL復制技術的發展歷程

在互聯網應用不斷發展的二十多年里,MySQL 一直是最廣泛使用的開源關系型數據庫之一。它憑借開源、輕量、靈活的優勢,支撐了無數網站、移動應用和企業系統。支撐 MySQL 長期發展的關鍵之一,就是 復制(Replication)技術。…

C++從字符串中移除前導零

該程序用于去除字符串開頭的零字符。當輸入"0000123456"時,程序會輸出"123456"。核心函數removeZero()通過while循環找到第一個非零字符的位置,然后使用erase()方法刪除前面的所有零。主函數讀取輸入字符串并調用該函數處理。程序簡…