微信小程序之生命周期(四)

微信小程序之入門(mén)篇(一)
微信小程序之注冊(cè)篇(二)
微信小程序之開(kāi)發(fā)初體驗(yàn)(三)——開(kāi)發(fā)工具使用和目錄結(jié)構(gòu)
微信小程序之生命周期(四)
微信小程序之?dāng)?shù)據(jù)綁定(五)
微信小程序之觸控事件(六)
微信小程序之基礎(chǔ)組件篇——視圖容器(七)
微信小程序之基礎(chǔ)組件篇——基礎(chǔ)內(nèi)容(八)
微信小程序之基礎(chǔ)組件篇——表單組件(九)
微信小程序之基礎(chǔ)組件篇——導(dǎo)航組件(十)
微信小程序之基礎(chǔ)組件篇——媒體組件(十一)
微信小程序之API篇——豆瓣圖書(shū)搜索(十二)
微信小程序之拓展篇——weui-wxss(十三)

本篇文章介紹小程序的生命周期,由于小程序分為應(yīng)用和頁(yè)面兩個(gè)部分,所以小程序的生命周期就涉及到三個(gè)部分契耿,分別是:

  • 應(yīng)用的生命周期
  • 頁(yè)面的生命周期
  • 應(yīng)用的生命周期對(duì)頁(yè)面生命周期的影響

一邻悬、應(yīng)用的生命周期

App() 函數(shù)用來(lái)注冊(cè)一個(gè)小程序姐赡。接受一個(gè) object 參數(shù)盛霎,其指定小程序的生命周期函數(shù)等绞绒。

object參數(shù)說(shuō)明:

屬性 類型 描述 觸發(fā)時(shí)機(jī)
onLaunch Function 生命周期函數(shù)--監(jiān)聽(tīng)小程序初始化 當(dāng)小程序初始化完成時(shí),會(huì)觸發(fā) onLaunch(全局只觸發(fā)一次)
onShow Function 生命周期函數(shù)--監(jiān)聽(tīng)小程序顯示 當(dāng)小程序啟動(dòng)十籍,或從后臺(tái)進(jìn)入前臺(tái)顯示,會(huì)觸發(fā) onShow
onHide Function 生命周期函數(shù)--監(jiān)聽(tīng)小程序隱藏 當(dāng)小程序從前臺(tái)進(jìn)入后臺(tái)唇礁,會(huì)觸發(fā) onHide

前臺(tái)勾栗、后臺(tái)定義: 當(dāng)用戶點(diǎn)擊左上角關(guān)閉,或者按了設(shè)備 Home 鍵離開(kāi)微信盏筐,小程序并沒(méi)有直接銷毀围俘,而是進(jìn)入了后臺(tái);當(dāng)再次進(jìn)入微信或再次打開(kāi)小程序琢融,又會(huì)從后臺(tái)進(jìn)入前臺(tái)界牡。

應(yīng)用的生命周期
  • 用戶首次打開(kāi)小程序,觸發(fā) onLaunch(全局只觸發(fā)一次)漾抬。
  • 小程序初始化完成后宿亡,觸發(fā)onShow方法,監(jiān)聽(tīng)小程序顯示纳令。
  • 小程序從前臺(tái)進(jìn)入后臺(tái)她混,觸發(fā) onHide方法烈钞。
  • 小程序從后臺(tái)進(jìn)入前臺(tái)顯示,觸發(fā) onShow方法坤按。
  • 小程序后臺(tái)運(yùn)行一定時(shí)間,或系統(tǒng)資源占用過(guò)高臭脓,會(huì)被銷毀酗钞。

示例代碼:

App({
  onLaunch: function() { 
    // Do something initial when launch.
  },
  onShow: function() {
      // Do something when show.
  },
  onHide: function() {
      // Do something when hide.
  },
  onError: function(msg) {
    console.log(msg)
  },
  globalData: 'I am global data'
})

小程序提供了全局的 getApp()函數(shù),可以獲取到小程序?qū)嵗?/p>

// other.js
var appInstance = getApp()
console.log(appInstance.globalData) // I am global data

注意:
App() 必須在 app.js 中注冊(cè)来累,且不能注冊(cè)多個(gè)砚作。

不要在定義于 App() 內(nèi)的函數(shù)中調(diào)用 getApp() ,使用 this 就可以拿到 app 實(shí)例嘹锁。

不要在 onLaunch 的時(shí)候調(diào)用 getCurrentPage()葫录,此時(shí) page 還沒(méi)有生成。

通過(guò) getApp() 獲取實(shí)例之后领猾,不要私自調(diào)用生命周期函數(shù)米同。

頁(yè)面的生命周期

Page()函數(shù)用來(lái)注冊(cè)一個(gè)頁(yè)面。接受一個(gè) object 參數(shù)摔竿,其指定頁(yè)面的初始數(shù)據(jù)面粮、生命周期函數(shù)、事件處理函數(shù)等继低。
object 參數(shù)說(shuō)明:

屬性 類型 描述
data Object 頁(yè)面的初始數(shù)據(jù)
onLoad Function 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面加載
onReady Function 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面初次渲染完成
onShow Function 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面顯示
onHide Function 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面隱藏
onUnload Function 生命周期函數(shù)--監(jiān)聽(tīng)頁(yè)面卸載
頁(yè)面的生命周期
  • 小程序注冊(cè)完成后熬苍,加載頁(yè)面,觸發(fā)onLoad方法袁翁。
  • 頁(yè)面載入后觸發(fā)onShow方法柴底,顯示頁(yè)面。
  • 首次顯示頁(yè)面粱胜,會(huì)觸發(fā)onReady方法柄驻,渲染頁(yè)面元素和樣式,一個(gè)頁(yè)面只會(huì)調(diào)用一次年柠。
  • 當(dāng)小程序后臺(tái)運(yùn)行或跳轉(zhuǎn)到其他頁(yè)面時(shí)凿歼,觸發(fā)onHide方法。
  • 當(dāng)小程序有后臺(tái)進(jìn)入到前臺(tái)運(yùn)行或重新進(jìn)入頁(yè)面時(shí)冗恨,觸發(fā)onShow方法答憔。
  • 當(dāng)使用重定向方法wx.redirectTo(OBJECT)或關(guān)閉當(dāng)前頁(yè)返回上一頁(yè)wx.navigateBack(),觸發(fā)onUnload掀抹。

總結(jié):

  • onLoad: 頁(yè)面加載虐拓。
    1)一個(gè)頁(yè)面只會(huì)調(diào)用一次。
    2)參數(shù)可以獲取wx.navigateTo和wx.redirectTo及<navigator/>中的 query傲武。
  • onShow: 頁(yè)面顯示
    1)每次打開(kāi)頁(yè)面都會(huì)調(diào)用一次蓉驹。
  • onReady: 頁(yè)面初次渲染完成
    1)一個(gè)頁(yè)面只會(huì)調(diào)用一次城榛,代表頁(yè)面已經(jīng)準(zhǔn)備妥當(dāng),可以和視圖層進(jìn)行交互态兴。
    2)對(duì)界面的設(shè)置如wx.setNavigationBarTitle請(qǐng)?jiān)趏nReady之后設(shè)置狠持。詳見(jiàn)生命周期
  • onHide: 頁(yè)面隱藏
    1)當(dāng)navigateTo或底部tab切換時(shí)調(diào)用。
  • onUnload: 頁(yè)面卸載
    1)當(dāng)redirectTo或navigateBack的時(shí)候調(diào)用瞻润。

示例代碼:

//index.js
Page({
  data: {
    text: "This is page data."
  },
  onLoad: function(options) {
    // Do some initialize when page load.
  },
  onReady: function() {
    // Do something when page ready.
  },
  onShow: function() {
    // Do something when page show.
  },
  onHide: function() {
    // Do something when page hide.
  },
  onUnload: function() {
    // Do something when page close.
  },
  onPullDownRefresh: function() {
    // Do something when pull down.
  },
  onReachBottom: function() {
    // Do something when page reach bottom.
  },
  onShareAppMessage: function () {
   // return custom share data when user share.
  },
  // Event handler.
  viewTap: function() {
    this.setData({
      text: 'Set some data for updating view.'
    })
  },
  customData: {
    hi: 'MINA'
  }
})

三喘垂、用Page 實(shí)例說(shuō)明的頁(yè)面的生命周期

頁(yè)面的生命周期

由上圖可知,小程序由兩大線程組成:負(fù)責(zé)界面的視圖線程(view thread)和負(fù)責(zé)數(shù)據(jù)绍撞、服務(wù)處理的服務(wù)線程(appservice thread)正勒,兩者協(xié)同工作,完成小程序頁(yè)面生命周期的調(diào)用傻铣。

視圖線程有四大狀態(tài):

  1. 初始化狀態(tài):初始化視圖線程所需要的工作章贞,初始化完成后向 “服務(wù)線程”發(fā)送初始化完成信號(hào),然后進(jìn)入等待狀態(tài)非洲,等待服務(wù)線程提供初始化數(shù)據(jù)鸭限。
  2. 首次渲染狀態(tài):當(dāng)收到服務(wù)線程提供的初始化數(shù)據(jù)后(json和js中的data數(shù)據(jù)),渲染小程序界面怪蔑,渲染完畢后里覆,發(fā)送“首次渲染完成信號(hào)”給服務(wù)線程丧荐,并將頁(yè)面展示給用戶缆瓣。
  3. 持續(xù)渲染狀態(tài):此時(shí)界面線程繼續(xù)一直等待“服務(wù)線程”通過(guò)this.setdata()函數(shù)發(fā)送來(lái)的界面數(shù)據(jù),只要收到就重新局部渲染虹统,也因此只要更新數(shù)據(jù)并發(fā)送信號(hào)弓坞,界面就自動(dòng)更新。
  4. 結(jié)束狀態(tài):頁(yè)面被回收或者銷毀车荔、應(yīng)用被系統(tǒng)回收渡冻、銷毀時(shí)觸發(fā)。

服務(wù)線程五大狀態(tài):

  1. 初始化狀態(tài):此階段僅啟動(dòng)服務(wù)線程所需的基本功能忧便,比如信號(hào)發(fā)送模塊族吻。系統(tǒng)的初始化工作完畢,就調(diào)用自定義的onload和onshow珠增,然后等待視圖線程的“視圖線程初始化完成”號(hào)超歌。onload是只會(huì)首次渲染的時(shí)候執(zhí)行一次,onshow是每次界面切換都會(huì)執(zhí)行蒂教,簡(jiǎn)單理解巍举,這就是唯一差別。
  2. 等待激活狀態(tài):接收到“視圖線程初始化完成”信號(hào)后凝垛,將初始化數(shù)據(jù)發(fā)送給“視圖線程”懊悯,等待視圖線程完成初次渲染蜓谋。
  3. 激活狀態(tài):收到視圖線程發(fā)送來(lái)的“首次渲染完成”信號(hào)后,就進(jìn)入激活狀態(tài)既程序的正常運(yùn)行狀態(tài)炭分,并調(diào)用自定義的onReady()函數(shù)桃焕。此狀態(tài)下就可以通過(guò) this.setData 函數(shù)發(fā)送界面數(shù)據(jù)給界面線程進(jìn)行局部渲染,更新頁(yè)面捧毛。
  4. 后臺(tái)運(yùn)行狀態(tài):如果界面進(jìn)入后臺(tái)覆旭,服務(wù)線程就進(jìn)入后臺(tái)運(yùn)行狀態(tài),從目前的官方解讀來(lái)說(shuō)岖妄,這個(gè)狀態(tài)挺奇怪的型将,和激活狀態(tài)是相同的,也可以通過(guò)setdata函數(shù)更新界面的荐虐。畢竟小程序的框架剛推出七兜,應(yīng)該后續(xù)會(huì)有很大不同吧。
  5. 結(jié)束狀態(tài):頁(yè)面被回收或者銷毀福扬、應(yīng)用被系統(tǒng)回收腕铸、銷毀時(shí)觸發(fā)。

四铛碑、應(yīng)用的生命周期對(duì)頁(yè)面生命周期的影響

應(yīng)用生命周期與頁(yè)面生命周期之間的關(guān)系
  • 小程序初始化完成后狠裹,頁(yè)面首次加載觸發(fā)onLoad,只會(huì)觸發(fā)一次汽烦。
  • 當(dāng)小程序進(jìn)入到后臺(tái)涛菠,先執(zhí)行頁(yè)面onHide方法再執(zhí)行應(yīng)用onHide方法。
  • 當(dāng)小程序從后臺(tái)進(jìn)入到前臺(tái)撇吞,先執(zhí)行應(yīng)用onShow方法再執(zhí)行頁(yè)面onShow方法俗冻。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市牍颈,隨后出現(xiàn)的幾起案子迄薄,更是在濱河造成了極大的恐慌,老刑警劉巖煮岁,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讥蔽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡画机,警方通過(guò)查閱死者的電腦和手機(jī)冶伞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)色罚,“玉大人碰缔,你說(shuō)我怎么就攤上這事〈粱ぃ” “怎么了金抡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵瀑焦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我梗肝,道長(zhǎng)榛瓮,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任巫击,我火速辦了婚禮禀晓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坝锰。我一直安慰自己黔酥,他們只是感情好锭弊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布整以。 她就那樣靜靜地躺著错森,像睡著了一般。 火紅的嫁衣襯著肌膚如雪弓颈。 梳的紋絲不亂的頭發(fā)上帽芽,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音翔冀,去河邊找鬼导街。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纤子,可吹牛的內(nèi)容都是我干的搬瑰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼计福,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼跌捆!你這毒婦竟也來(lái)了徽职?” 一聲冷哼從身側(cè)響起象颖,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姆钉,沒(méi)想到半個(gè)月后说订,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潮瓶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年陶冷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毯辅。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡埂伦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出思恐,到底是詐尸還是另有隱情沾谜,我是刑警寧澤膊毁,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站基跑,受9級(jí)特大地震影響婚温,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜媳否,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一栅螟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧篱竭,春花似錦力图、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至坪圾,卻和暖如春晓折,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兽泄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工漓概, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人病梢。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓胃珍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蜓陌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子觅彰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容