日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

小程序onload_小程序生命周期-基础篇

發(fā)布時間:2025/3/21 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小程序onload_小程序生命周期-基础篇 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

小程序App生命周期

  • 小程序App生命周期是在app.js里面調(diào)用的,App(Object)函數(shù)用來注冊一個小程序,接受一個 Object 參數(shù),指定其小程序的生命周期回調(diào)
  • App() 必須在 app.js 中調(diào)用,必須調(diào)用且只能調(diào)用一次,不然會出現(xiàn)無法預(yù)期的后果

以上應(yīng)該一眼就能看明白,以下主要講講前臺、后臺定義和運行機制等

1 . 前臺、后臺定義

  • 當(dāng)用戶點擊左上角關(guān)閉,或者按了設(shè)備 Home 鍵離開微信,小程序并沒有直接銷毀,而是進(jìn)入了后臺onHide;當(dāng)再次進(jìn)入微信或再次打開小程序,又會從后臺進(jìn)入前臺onShow。需要注意的是:只有當(dāng)小程序進(jìn)入后臺一定時間,或者系統(tǒng)資源占用過高,才會被真正的銷毀。

2 . 運行機制

  • 小程序啟動會有兩種情況,一種是「冷啟動」,一種是「熱啟動」。 假如用戶已經(jīng)打開過某小程序,然后在一定時間內(nèi)再次打開該小程序,此時無需重新啟動,只需將后臺態(tài)的小程序切換到前臺onShow,這個過程就是熱啟動;冷啟動指的是用戶首次打開或小程序被微信主動銷毀后再次打開的情況,此時小程序需要重新加載啟動onLauch
  • 小程序沒有重啟的概念
  • 當(dāng)小程序進(jìn)入后臺,客戶端會維持一段時間的運行狀態(tài),超過一定時間后(目前是5分鐘)會被微信主動銷毀
  • 在 iOS 上,當(dāng)微信客戶端在一定時間間隔內(nèi)(目前是 5 秒)連續(xù)收到兩次及以上系統(tǒng)內(nèi)存告警時,會主動進(jìn)行小程序的銷毀,并提示用戶 「該小程序可能導(dǎo)致微信響應(yīng)變慢被終止」。建議小程序在必要時使用 wx.onMemoryWarning 監(jiān)聽內(nèi)存告警事件,進(jìn)行必要的內(nèi)存清理。

3 . 更新機制

  • 小程序冷啟動時如果發(fā)現(xiàn)有新版本,將會異步下載新版本的代碼包,并同時用客戶端本地的包進(jìn)行啟動,即新版本的小程序需要等下一次冷啟動才會應(yīng)用上。 如果需要馬上應(yīng)用最新版本,可以使用 wx.getUpdateManager API 進(jìn)行處理
  • 小程序強制更新
//注意,小程序的更新的api需要基礎(chǔ)庫在1.9.90以上

3 . 再次打開邏輯

  • 用戶打開小程序的預(yù)期有以下兩類場景:1、打開首頁 2、打開指定頁面
  • 現(xiàn)在要打開的是首頁,如果上一次退出的時候是首頁,則保留狀態(tài);否則,清空原來的頁面棧,打開首頁(相當(dāng)于執(zhí)行 wx.reLaunch 到首頁)
  • 現(xiàn)在要打開的是指定頁面,不管上次在什么頁面,清空原來的頁面棧,打開指定頁面(相當(dāng)于執(zhí)行 wx.reLaunch 到指定頁)

小程序Page生命周期

  • Page(Object) 函數(shù)用來注冊一個頁面。接受一個 Object 類型參數(shù),其指定頁面的初始數(shù)據(jù)、生命周期回調(diào)、事件處理函數(shù)等

引用一張不錯的圖片來讓你一目了然,圖片來源于網(wǎng)絡(luò)

補充:app.onPageNotFound(Object)

基礎(chǔ)庫 1.9.90 開始支持,低版本需做兼容處理。
  • 小程序要打開的頁面不存在時觸發(fā),也可以使用 wx.onPageNotFound 綁定監(jiān)聽
  • 開發(fā)者可以在回調(diào)中進(jìn)行頁面重定向,但必須在回調(diào)中同步處理,異步處理(例如 setTimeout 異步執(zhí)行)無效
  • 主要用于輪播、魔方等動態(tài)指定跳轉(zhuǎn)頁面的場景,避免出現(xiàn)頁面不存在的情況
App({onPageNotFound(res) {// 可以封裝一個小程序跳轉(zhuǎn)函數(shù),智能解決tabbar頁面跳轉(zhuǎn)的問題wx.redirectTo({url: 'pages/...'})} })

生命周期執(zhí)行順序

生命周期執(zhí)行順序
分別了解了App和Page的生命周期函數(shù),那他們之間有何關(guān)聯(lián)

吐槽一句,好多文章說什么app的生命周期函數(shù)onLauch可能會在page的onLoad之后觸發(fā),搞得我一臉懵逼,說話這么不嚴(yán)謹(jǐn),真的好嗎???

先看看正常的生命周期

App

控制臺輸出

應(yīng)該說永遠(yuǎn)是這個順序,現(xiàn)在再加點代碼,就用官方的例子

App

控制臺輸出

  • 可以看出小程序生命周期函數(shù)并沒有錯亂,只是加了異步操作
  • 你永遠(yuǎn)不知道異步操作會排在正常周期的哪一個位置
解決方案
例子中已經(jīng)給出了callback的方案,現(xiàn)在也可以使用promise來解決

1 . callback

  • 解釋一波:Page頁面判斷當(dāng)前app.globalData.userInfo是否有值
  • 如果有,說明異步操作很順利,當(dāng)做同步往下操作即可
  • 如果沒有,則定義一個app方法(回調(diào)函數(shù))app.userInfoReadyCallback = res => {...}
  • 因為Page.onLoad沒有順利拿到app.globalData.userInfo,說明App頁面請求success異步操作滯后了
  • 此時APP頁面不僅會給globalData.userInfo賦值,還會執(zhí)行Page頁面定義的回調(diào)方法,完成業(yè)務(wù)邏輯

以上例子是官方對于授權(quán)之后的操作流程示例,實際使用替換自己的初始化函數(shù)和業(yè)務(wù)邏輯

注意事項
app.onLaunch全局只觸發(fā)一次,也就是打開的第一個頁面會有異步問題,打開第二個頁面肯定是可以拿到初始化數(shù)據(jù)的,但是小程序可以從不同場景進(jìn)入,可能打開的并非是首頁,這時就需要給每一個可能被第一次就打開的頁面,寫回調(diào)函數(shù),暫時沒想到類似vue那種設(shè)置全局路由回調(diào)的方案

2 . promise

  • 最終效果應(yīng)該和回調(diào)一樣,之前小程序不支持promise,一直沒有好好用過,等以后單獨研究~

Page實例生命周期

先來看一張很熟悉的圖
官方原話(以下內(nèi)容你不需要立馬完全弄明白,不過以后它會有幫助)

咋一看,什么鬼,好吧~我聽你的,以后再說~

  • 轉(zhuǎn)眼間,以后就到啦!好在有大佬解釋過了,借花獻(xiàn)佛,誰讓我是搬運工呢(最后會貼上參考文章鏈接)

Page實例由兩大線程組成

  • 負(fù)責(zé)界面的線程(view thread)和服務(wù)線程(appservice thread),各司其職又互相配合
  • 界面線程有四大狀態(tài):
  • 初始化狀態(tài):初始化界面線程所需要的工作,包括工作機制,基本和我們開發(fā)者沒有關(guān)系,等初始化完畢就向 “服務(wù)線程”發(fā)送初始化完畢信號,然后進(jìn)入等待傳回初始化數(shù)據(jù)狀態(tài)
  • 首次渲染狀態(tài):收到“服務(wù)線程”發(fā)來的初始化數(shù)據(jù)后(就是 json和js中的data數(shù)據(jù)),就開始渲染小程序界面,渲染完畢后,發(fā)送“首次渲染完畢信號”給服務(wù)線程,并將頁面展示給用戶
  • 持續(xù)渲染狀態(tài):此時界面線程繼續(xù)一直等待“服務(wù)線程”通過this.setdata()函數(shù)發(fā)送來的界面數(shù)據(jù),只要收到就重新局部渲染,也因此只要更新數(shù)據(jù)并發(fā)送信號,界面就自動更新
  • 結(jié)束狀態(tài):你懂得
    • 服務(wù)線程五大狀態(tài):
  • 初始化狀態(tài):無需和其他模塊交流,跟小程序開發(fā)也沒多大關(guān)聯(lián),此階段就是啟動服務(wù)線程所需的基本功能,比如信號發(fā)送模塊。系統(tǒng)的初始化工作完畢,就調(diào)用自定義的onload和onshow,
  • 然后等待界面線程的“界面線程初始化完成”信號。
    onload是只會首次渲染的時候執(zhí)行一次,onshow是每次界面切換都會執(zhí)行,簡單理解,這就是唯一差別

  • 等待激活狀態(tài):接收到“界面線程初始化完成”信號后,將初始化數(shù)據(jù)發(fā)送給“界面線程”,等待界面線程完成初次渲染
  • 激活狀態(tài):收到界面線程發(fā)送來的“首次渲染完成”信號后,就進(jìn)入激活狀態(tài)既程序的正常運行狀態(tài),并調(diào)用自定義的onReady()函數(shù)。
  • 此狀態(tài)下就可以通過 this.setData 函數(shù)發(fā)送界面數(shù)據(jù)給界面線程進(jìn)行局部渲染,更新頁面

  • 后臺運行狀態(tài):如果界面進(jìn)入后臺,服務(wù)線程就進(jìn)入后臺運行狀態(tài),從目前的官方解讀來說,這個狀態(tài)挺奇怪的,和激活狀態(tài)是相同的,也可以通過setdata函數(shù)更新界面的
  • 總結(jié)一下

    小程序的一生

    • 打開小程序 -> app.onLaunch -> app.onShow -> Page.onLoad -> Page.onShow -> Page.onReady
    • 進(jìn)入下一個頁面 -> Page.onHide -> Next.onLoad -> Next.onShow -> Next.onReady
    • 返回上一個頁面 -> Next.onUnload -> Page.onShow
    • 離開小程序 -> app.onHide
    • 再次進(jìn)入 -> app未銷毀 ->app.onShow 否則從頭開始(銷毀判斷看上文運行機制)

    注意:Tabbar頁面初始化之后不會被銷毀,也就是只會執(zhí)行一次 onLoad 函數(shù)

    只觸發(fā)一次的,一般都是用來初始化操作

    • onLaunch:初始化全局?jǐn)?shù)據(jù),注意異步問題
    • onLoad:初始化頁面數(shù)據(jù)
    • onReady:代表頁面已經(jīng)準(zhǔn)備妥當(dāng),界面內(nèi)容的修改,最好放在這里,如wx.setNavigationBarTitle
    • onUnload:清除定時器,因為所有頁面的腳本邏輯都跑在同一個JsCore線程

    觸發(fā)多次的,一般用來改變狀態(tài)

    • onShow:刷新
    • onHide:重置

    總結(jié)

    以上是生活随笔為你收集整理的小程序onload_小程序生命周期-基础篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。