學(xué)習(xí)微信小程序(5)——微信小程序的生命周期和運(yùn)行原理以及路由跳轉(zhuǎn)

一墓陈、生命周期和運(yùn)行原理

image.png

寫微信小程序宪塔,他的生命周期不能不知道,不知道小程序就會(huì)出現(xiàn)各種bug而無法解決狐援。小助君公眾號(hào)帶你學(xué)習(xí)小程序的生命周期和運(yùn)行原理钢坦。

小程序由兩大線程組成:負(fù)責(zé)界面的線程(view thread)和服務(wù)線程(appservice thread),各司其職由互相配合

小程序的生命周期借鑒了Android的生命周期啥酱,如果你了解過Android的APP開發(fā)爹凹,那么理解小程序的就會(huì)很簡(jiǎn)單。

界面線程有四大狀態(tài):
1. 初始化狀態(tài):初始化界面線程所需要的工作镶殷,包括工作機(jī)制禾酱,基本和我們開發(fā)者沒有關(guān)系,等初始化完畢就向 “服務(wù)線程”發(fā)送初始化完畢信號(hào)绘趋,然后進(jìn)入等待傳回初始化數(shù)據(jù)狀態(tài)颤陶。

2.首次渲染狀態(tài):收到“服務(wù)線程”發(fā)來的初始化數(shù)據(jù)后(就是 json和js中的data數(shù)據(jù)),就開始渲染小程序界面陷遮,渲染完畢后滓走,發(fā)送“首次渲染完畢信號(hào)”給服務(wù)線程,并將頁(yè)面展示給用戶帽馋。

3.持續(xù)渲染狀態(tài):此時(shí)界面線程繼續(xù)一直等待“服務(wù)線程”通過this.setdata()函數(shù)發(fā)送來的界面數(shù)據(jù)搅方,只要收到就重新局部渲染,也因此只要更新數(shù)據(jù)并發(fā)送信號(hào)绽族,界面就自動(dòng)更新腰懂。

4.結(jié)束狀態(tài):你懂得。

服務(wù)線程五大狀態(tài):
1 初始化狀態(tài):無需和其他模塊交流项秉,跟小程序開發(fā)也沒多大關(guān)聯(lián),此階段就是啟動(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ā)送來的“首次渲染完成”信號(hào)后,就進(jìn)入激活狀態(tài)既程序的正常運(yùn)行狀態(tài)只搁,并調(diào)用自定義的onReady()函數(shù)音比。
此狀態(tài)下就可以通過 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),從目前的官方解讀來說焰望,這個(gè)狀態(tài)挺奇怪的骚亿,和激活狀態(tài)是相同的,也可以通過setdata函數(shù)更新界面的熊赖。

二来屠、路由跳轉(zhuǎn)

先說下getCurrentPages():

getCurrentPages() 函數(shù)用于獲取當(dāng)前頁(yè)面棧的實(shí)例,以數(shù)組形式按棧的順序給出秫舌,最后一個(gè)元素為當(dāng)前頁(yè)面的妖。

這是打印的getCurrentPages()

Clipboard Image.png

包括了整個(gè)page對(duì)象;

微信小程序關(guān)于路由跳轉(zhuǎn)的給出5個(gè)API文檔傳送門 足陨,結(jié)合文檔一下示意圖更加理解深刻:

1嫂粟、wx.navigateTo接口與頁(yè)面棧示意圖(不會(huì)將舊頁(yè)面出棧)

Clipboard Image.png

疑問:該圖為去年的,有五層限制墨缘。我自己試了一下getCurrentPages()最多會(huì)放10層星虹?

Clipboard Image.png

當(dāng)棧滿了(10層)之后,再調(diào)用wx.navigateTo()跳轉(zhuǎn)任何頁(yè)面镊讼,都不會(huì)成功宽涌。

特別注意的是,調(diào)用兩次wx.navigateTo('頁(yè)面B');wx.navigateTo('頁(yè)面B');蝶棋,那么棧里存在兩個(gè)頁(yè)面B(或者說兩個(gè)頁(yè)面B的實(shí)例)卸亮,如下圖。

image.png
Clipboard Image.png

2玩裙、wx.redirectTo接口與頁(yè)面棧示意圖(會(huì)將舊頁(yè)面出棧兼贸,再將需要跳轉(zhuǎn)到的頁(yè)面入棧)

image.png

3、wx.navigateBack

這就是棧里的頁(yè)面一個(gè)一個(gè)出棧吃溅。當(dāng)最后一個(gè)頁(yè)面(首頁(yè)A)出棧后溶诞,也就退出了小程序。給wx.navigateBack添加了一個(gè)參數(shù)delta决侈,用于決定需要返回幾層頁(yè)面螺垢;如果delta大于等于現(xiàn)有頁(yè)面數(shù)(也就是棧里的頁(yè)面數(shù)),則返回到首頁(yè)。

image.png

Clipboard Image.png

4枉圃、wx.switchTab(跳轉(zhuǎn)到 tabBar 頁(yè)面功茴,并關(guān)閉其他所有非 tabBar 頁(yè)面);

5、****wx.reLaunch(關(guān)閉所有頁(yè)面讯蒲,打開到應(yīng)用內(nèi)的某個(gè)頁(yè)面痊土。)

這個(gè)就是將所有頁(yè)面棧中的頁(yè)面清空,添加當(dāng)前頁(yè)面墨林;

應(yīng)用

1赁酝,比如我們?cè)谧鲰?xiàng)目的時(shí)候自定義了返回按鈕,其實(shí)我們直接操作getCurrentPages()

中返回的數(shù)組配合wx.navigateBack決定跳到哪個(gè)頁(yè)面旭等;

2酌呆,刷新當(dāng)前頁(yè):

(1)小程序不會(huì)像js中那樣有l(wèi)ocation.reload()這種dom操作;

(2)如果用this.onLoad();this.onShow();刷新搔耕,data中的數(shù)據(jù)不會(huì)得到有效的更新隙袁;還需要重新setdata一次;操作麻煩弃榨;

(3)我們還是直接操作getCurrentPages()菩收;取最后一個(gè)元素及為當(dāng)前元素,拿到route,和options鲸睛。刷新動(dòng)作就是去掉最后一個(gè)元素再重新根據(jù)拿到的數(shù)據(jù)跳轉(zhuǎn)當(dāng)前頁(yè)娜饵;

Clipboard Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市官辈,隨后出現(xiàn)的幾起案子箱舞,更是在濱河造成了極大的恐慌,老刑警劉巖拳亿,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晴股,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡肺魁,警方通過查閱死者的電腦和手機(jī)电湘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹅经,“玉大人胡桨,你說我怎么就攤上這事∷脖ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵刽虹,是天一觀的道長(zhǎng)酗捌。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么胖缤? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任尚镰,我火速辦了婚禮,結(jié)果婚禮上哪廓,老公的妹妹穿的比我還像新娘狗唉。我一直安慰自己,他們只是感情好涡真,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布分俯。 她就那樣靜靜地躺著,像睡著了一般哆料。 火紅的嫁衣襯著肌膚如雪缸剪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天东亦,我揣著相機(jī)與錄音杏节,去河邊找鬼。 笑死典阵,一個(gè)胖子當(dāng)著我的面吹牛奋渔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播壮啊,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼嫉鲸,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了他巨?” 一聲冷哼從身側(cè)響起充坑,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎染突,沒想到半個(gè)月后捻爷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡份企,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年也榄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片司志。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甜紫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骂远,到底是詐尸還是另有隱情囚霸,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布激才,位于F島的核電站拓型,受9級(jí)特大地震影響和泌,放射性物質(zhì)發(fā)生泄漏限嫌。R本人自食惡果不足惜奥吩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一傲绣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧压固,春花似錦球拦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至焚刚,卻和暖如春点弯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矿咕。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工抢肛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碳柱。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓捡絮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親莲镣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子福稳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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

  • 微信小程序之入門篇(一)[http://www.reibang.com/p/a0770e6ebc0c]微信小程序...
    愛情小傻蛋閱讀 41,018評(píng)論 4 51
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,336評(píng)論 8 265
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)瑞侮,斷路器的圆,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 插件開發(fā) 創(chuàng)建插件工程 AndroidManifest.xml文件application下添加插件配置和入口 必須...
    吳彥輝閱讀 3,424評(píng)論 0 0
  • 文征明,明代畫家半火、書法家越妈、文學(xué)家。與祝允明钮糖、唐寅梅掠、徐禎卿 并稱“吳中四才子”。在畫史上與沈周店归、唐寅阎抒、仇英合稱“吳門...
    李清心1314閱讀 844評(píng)論 6 10