微信小程序的頁面跳轉(zhuǎn)和生命周期函數(shù)

文章首發(fā)于個人博客,轉(zhuǎn)載參考請注明來源微信小程序的頁面跳轉(zhuǎn)和生命周期函數(shù)

@TOC

前言

最近在做微信小程序曲横,做頁面跳轉(zhuǎn)的時候遇到了些小坑鹉梨。在不同的場景下需要選擇合適的頁面跳轉(zhuǎn)函數(shù)姊扔,并且由于頁面跳轉(zhuǎn)函數(shù)和頁面的生命周期函數(shù)有莫大的關(guān)聯(lián)疏橄,所以在此一并總結(jié)侧到。

微信小程序的頁面跳轉(zhuǎn)函數(shù)

wx.navigateTo(Object object)

保留當(dāng)前頁面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個頁面私痹。但是不能跳到 tabbar 頁面脐嫂。使用 wx.navigateBack 可以返回到原頁面。當(dāng)調(diào)用該方法時紊遵,會調(diào)用onHide()頁面周期函數(shù)账千。

示例:

wx.navigateTo({
  url: 'test?id=1'
})
// test.js
Page({
  onLoad(option) {
    //console.log(option.query)
    console.log(option.id)
  }
})

wx.redirectTo(Object object)

關(guān)閉當(dāng)前頁面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個頁面癞蚕。但是不允許跳轉(zhuǎn)到 tabbar 頁面蕊爵。

示例:

wx.redirectTo({
  url: 'test?id=1'
})

wx.switchTab(Object object)

跳轉(zhuǎn)到 tabBar 頁面,并關(guān)閉其他所有非 tabBar 頁面桦山。

示例代碼:

{
  "tabBar": {
    "list": [
      {
        "pagePath": "index",
        "text": "首頁"
      },
      {
        "pagePath": "other",
        "text": "其他"
      }
    ]
  }
}
wx.switchTab({
  url: '/index'
})

wx.reLaunch(Object object)

關(guān)閉所有頁面,打開到應(yīng)用內(nèi)的某個頁面醋旦。

示例代碼:

wx.reLaunch({
  url: 'test?id=1'
})
// test Page({ onLoad (option) { console.log(option.query) } })

wx.navigateBack(Object object)

關(guān)閉當(dāng)前頁面恒水,返回上一頁面或多級頁面∷瞧耄可通過 getCurrentPages() 獲取當(dāng)前的頁面棧钉凌,決定需要返回幾層。

示例代碼:

// 注意:調(diào)用 navigateTo 跳轉(zhuǎn)時捂人,調(diào)用該方法的頁面會被加入堆棧御雕,而 redirectTo 方法則不會。見下方示例代碼

// 此處是A頁面
wx.navigateTo({
  url: 'B?id=1'
})

// 此處是B頁面
wx.navigateTo({
  url: 'C?id=1'
})

// 在C頁面內(nèi) navigateBack滥搭,將返回A頁面
wx.navigateBack({
  delta: 2
})

小結(jié):

  • wx.navigateTo 用于保留當(dāng)前頁面酸纲、跳轉(zhuǎn)到應(yīng)用內(nèi)的某個頁面,使用 wx.navigateBack可以返回到原頁面瑟匆。對于頁面不是特別多的小程序闽坡,通常推薦使用 wx.navigateTo進(jìn)行跳轉(zhuǎn), 以便返回原頁面,以提高加載速度疾嗅。當(dāng)頁面特別多時外厂,則不推薦使用。

  • wx.redirectTo 當(dāng)頁面過多時代承,被保留頁面會擠占微信分配給小程序的內(nèi)存汁蝶,或是達(dá)到微信所限制的 5 層頁面棧。這時论悴,我們應(yīng)該考慮選擇 wx.redirectTo掖棉。wx.redirectTo()用于關(guān)閉當(dāng)前頁面,跳轉(zhuǎn)到應(yīng)用內(nèi)的某個頁面意荤。這樣的跳轉(zhuǎn)啊片,可以避免跳轉(zhuǎn)前頁面占據(jù)運行內(nèi)存,但返回時頁面需要重新加載玖像,增加了返回頁面的顯示時間紫谷。

  • wx.switchTab 對于跳轉(zhuǎn)到 tab bar 的頁面,最好選擇 wx.switchTab()捐寥,它會先關(guān)閉所有非 tab bar 的頁面笤昨。其次,也可以選擇 wx.reLaunch()握恳,它也能實現(xiàn)從非 tab bar 跳轉(zhuǎn)到 tab bar瞒窒,或在 tab bar 間跳轉(zhuǎn),效果等同 wx.switchTab()乡洼。使用其他跳轉(zhuǎn) API 來跳轉(zhuǎn)到 tab bar崇裁,則會跳轉(zhuǎn)失敗。

  • wx.reLaunch wx.reLaunch()與 wx.redirectTo()的用途基本相同束昵, 只是 wx.reLaunch()先關(guān)閉了內(nèi)存中所有保留的頁面拔稳,再跳轉(zhuǎn)到目標(biāo)頁面。

  • wx.navigateBack 用于關(guān)閉當(dāng)前頁面锹雏,并返回上一頁面或多級頁面巴比。開發(fā)者可通過 getCurrentPages() 獲取當(dāng)前的頁面棧,決定需要返回幾層礁遵。這個 API 需要填寫的參數(shù)只有 delta轻绞,表示要返回的頁面數(shù)。若 delta 的取值大于現(xiàn)有可返回頁面數(shù)時佣耐,則返回到用戶進(jìn)入小程序的第一個頁面政勃。當(dāng)不填寫 delta 的值時,就默認(rèn)其為 1(注意晰赞,默認(rèn)并非取 0)稼病,即返回上一頁面选侨。


微信小程序的生命周期函數(shù)

屬性 類型 描述
onLoad Function 生命周期回調(diào)—監(jiān)聽頁面加載
onShow Function 生命周期回調(diào)—監(jiān)聽頁面顯示
onReady Function 生命周期回調(diào)—監(jiān)聽頁面初次渲染完成
onHide Function 生命周期回調(diào)—監(jiān)聽頁面隱藏
onUnload Function 生命周期回調(diào)—監(jiān)聽頁面卸載

onLoad(Object query)

頁面加載時觸發(fā)。一個頁面只會調(diào)用一次然走,可以在 onLoad 的參數(shù)中獲取打開當(dāng)前頁面路徑中的參數(shù)援制。

參數(shù)說明

名稱 類型 說明
query Object 打開當(dāng)前頁面路徑中的參數(shù)

onShow()

頁面顯示/切入前臺時觸發(fā)。

onReady()

頁面初次渲染完成時觸發(fā)芍瑞。一個頁面只會調(diào)用一次晨仑,代表頁面已經(jīng)準(zhǔn)備妥當(dāng),可以和視圖層進(jìn)行交互拆檬。

onHide()

頁面隱藏/切入后臺時觸發(fā)洪己。 如 navigateTo 或底部 tab 切換到其他頁面,小程序切入后臺等竟贯。

onUnload()

頁面卸載時觸發(fā)答捕。如redirectTo或navigateBack到其他頁面時。

下圖說明了 Page 實例的生命周期屑那。
[圖片上傳失敗...(image-b9f66c-1549938218169)]


頁面的路由

在小程序中所有頁面的路由全部由框架進(jìn)行管理拱镐,對于路由的觸發(fā)方式以及頁面生命周期函數(shù)如下:

路由方式 觸發(fā)時機 路由后頁面 路由前頁面
初始化 小程序打開的第一個頁面 onLoad,onShow
打開新頁面 調(diào)用 API wx.navigateTo 或使用組件<navigator /> onLoad持际,onShow onHide
頁面重定向 調(diào)用 API wx.redirectTo 或使用組件<navigator /> onLoad沃琅,onShow onUnload
頁面返回 調(diào)用 API wx.navigateBack或用戶按左上角返回按鈕 onShow onUnload
Tab切換 多 Tab 模式下用戶切換 Tab 第一次打開 onLoad,onshow蜘欲;否則 onShow onHide

Tips:

  • navigateTo, redirectTo 只能打開非 tabBar 頁面益眉。
  • switchTab 只能打開 tabBar 頁面。
  • reLaunch 可以打開任意頁面姥份。
  • 頁面底部的 tabBar 由頁面決定郭脂,即只要是定義為 tabBar 的頁面,底部都有 tabBar澈歉。
  • 調(diào)用頁面路由帶的參數(shù)可以在目標(biāo)頁面的onLoad中獲取.
  • 首次進(jìn)入頁面時朱庆,頁面周期函數(shù)調(diào)用的順序為onLoad()、onShow()闷祥、onReady()。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末傲诵,一起剝皮案震驚了整個濱河市凯砍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拴竹,老刑警劉巖悟衩,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異栓拜,居然都是意外死亡座泳,警方通過查閱死者的電腦和手機锁施,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門易遣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事审磁。” “怎么了谍婉?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵括尸,是天一觀的道長。 經(jīng)常有香客問我香拉,道長啦扬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任凫碌,我火速辦了婚禮扑毡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盛险。我一直安慰自己瞄摊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布枉层。 她就那樣靜靜地躺著泉褐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸟蜡。 梳的紋絲不亂的頭發(fā)上膜赃,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音揉忘,去河邊找鬼跳座。 笑死,一個胖子當(dāng)著我的面吹牛泣矛,可吹牛的內(nèi)容都是我干的疲眷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼您朽,長吁一口氣:“原來是場噩夢啊……” “哼狂丝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起哗总,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤几颜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后讯屈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛋哭,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年涮母,在試婚紗的時候發(fā)現(xiàn)自己被綠了谆趾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躁愿。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沪蓬,靈堂內(nèi)的尸體忽然破棺而出彤钟,到底是詐尸還是另有隱情,我是刑警寧澤怜跑,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布样勃,位于F島的核電站,受9級特大地震影響性芬,放射性物質(zhì)發(fā)生泄漏峡眶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一植锉、第九天 我趴在偏房一處隱蔽的房頂上張望辫樱。 院中可真熱鬧,春花似錦俊庇、人聲如沸狮暑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搬男。三九已至,卻和暖如春彭沼,著一層夾襖步出監(jiān)牢的瞬間缔逛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工姓惑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褐奴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓于毙,卻偏偏與公主長得像敦冬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子唯沮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

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