微信小程序之頁面路由


路由方式

簡介

對於路由的觸發方式以及頁面生命周期函數如下:

路由方式 觸發時機 路由前頁面 路由后頁面
初始化 小程序打開的第一個頁面   onLoad, onSHow
打開新頁面 調用 API wx.navigateTo 或使用組件 <navigator open-type="navigateTo"/> onHide onLoad, onShow
頁面重定向 調用 API wx.redirectTo 或使用組件 <navigator open-type="redirectTo"/> onUnload onLoad, onShow
頁面返回 調用 API wx.navigateBack 或使用組件<navigator open-type="navigateBack">或用戶按左上角返回按鈕 onUnload onShow
Tab 切換 調用 API wx.switchTab 或使用組件 <navigator open-type="switchTab"/> 或用戶切換 Tab   各種情況請參考下表
重啟動 調用 API wx.reLaunch 或使用組件 <navigator open-type="reLaunch"/> onUnload onLoad, onShow

 

頁面跳轉觸發的生命周期,實際還存在bug,並不如官網所說的

SwitchTab的跳轉BUG

情景:

首頁跳轉到子頁面后,然后子頁面使用

<navigator type='switchTab' url="/pages/index/index" >
    <view>跳轉首頁</button>
</navigator>

解決辦法:

通過js來跳轉

<view class="weui-btn-area">
             <button class="weui-btn" bindtap="backIndex" type="default">返回主頁</button> 
            </view> 

跳轉成功后,重新調用onload方法

backIndex:function(){
    wx.switchTab({
      url: '/pages/index/index',
      success: function (e) {
        var page = getCurrentPages().pop();
        if (page == undefined || page == null) return;
        page.onLoad();
      }
    })
  },

 

頁面路由的其他基礎知識請看官方文檔 :https://mp.weixin.qq.com/debug/wxadoc/dev/framework/app-service/route.html

 

wx.navigateBack傳參

  我們來考慮一下以下場景:

1. 在【頁面A】中調用wx.navigateTo方法跳轉到【頁面B】 2. 然后從【頁面B】返回【頁面A】, 並將【頁面B】中的一些數據傳回【頁面A】
方法1:使用全局數據存儲
  • 將要傳遞的數據,存儲在App對象上(比如globalData屬性)。
  • 將要傳遞的數據,存儲在小程序的本地數據緩存(Storage)中。

例如,我們在將要退出頁面B的時候,作如下調用:

//=== 1. 存儲到app對象上的方式 ========
var app = getApp()
app.globalData.mydata = {a:1, b:2};  //存儲數據到app對象上
wx.navigateBack();  //返回上一個頁面

//=== 2.存儲到數據緩存的方式 =========
wx.setStorage({
  key: "mydata",
  data: {a:1, b:2},
  success: function () {
    wx.navigateBack();   //返回上一個頁面
  }
})

這樣一來,當返回到上一個頁面的時候,可以通過讀取這些全局存儲區域,來獲取到我們需要的數據。

不過,這種方式也是有很明顯的缺點的。由於是全局數據存儲,所以當你存入了那些數據后,必須謹慎的去管理這些全局數據(何時被銷毀),否則一不小心,就會產生副作用。

方法2:從頁面路由棧中直接獲取和操作目標Page對象

  通過調用小程序的API: getCurrentPages(),來獲取當前頁面路由棧的信息,這個路由棧中按照頁面的路由順序存放着相應的Page對象,獲取到上一級頁面的完整Page對象,從而使直接調用Page對象的屬性和方法成為可能。

如下所示:

var pages = getCurrentPages();
var currPage = pages[pages.length - 1];   //當前頁面
var prevPage = pages[pages.length - 2];  //上一個頁面

//直接調用上一個頁面的setData()方法,把數據存到上一個頁面中去

var newtitle ='It is new title';
prevPage.data.title= newtitle; //不需要頁面更新
prevPage.setData({
  title: newtitle
})

 

頁面棧

頁面棧以棧(先進后出)的形式維護頁面與頁面之間的關系;
小程序提供了getCurrentPages()函數獲取頁面棧,第一個元素為首頁,最后一個元素為當前頁面。

  1. 使用wx.navigateTo每新開一個頁面,頁面棧大小加1,直到頁面棧大小為5為止;

  2. 使用wx.navigateTo重復打開界面

上圖中,假如使用wx.navigateTo從四級頁面跳轉到二級頁面,此時會在頁面棧頂添加一個與二級頁面初始狀態一樣的界面,但兩個頁面狀態是獨立的。頁面棧大小會加1,如果頁面棧大小為5,則wx.navigateTo無效

  1. 使用wx.redirectTo重定向

上圖中,假如使用wx.redirectTo從四級頁面重定向到二級頁面,此時會將關閉四級頁面,並使用二級頁面替換四級頁面,但兩個頁面狀態是獨立的。此時的頁面棧大小不變,請注意和使用wx.navigateTo的區別。

  1. 使用wx.navigateBack返回

上圖中,假如當前頁面為五級頁面,使用wx.navigateBack:

  • 當delta為1,關閉五級頁面,當前頁面為四級頁面,頁面棧大小減1;
  • 當delta為2,關閉依次五級頁面和四級頁面,當前頁面為三級頁面,頁面棧大小減2;
  • 以此類推,直到棧底為止,也就是首頁。

以上使用wx.navigateTo、wx.redirectTo、wx.navigateBack頁面出入棧操作對頁面棧的影響,平時不一定用得上,但是還是有必要了解背后的原理。

通過學習頁面棧,你至少可以知道:

  • 小程序運行時你可以獲取到已經初始化了的頁面的屬性和方法
  • 動態獲取當前頁面路徑
  • 頁面自動跳轉
  • 你可以通過getCurrentPages()獲取頁面page對象,執行非當前頁js里的方法

總結

    • wx.navigateTo會增加頁面棧大小,直到頁面棧大小為5
    • wx.redirectTo不會增加頁面棧大小
    • wx.navigateBack會減少頁面棧大小,直到頁面棧大小為1

 

摘抄來自:

http://www.cnblogs.com/nosqlcoco/p/6195572.html

 https://www.cnblogs.com/caicaizi/p/6652103.html

 

歡迎閱讀本系列文章:微信小程序開發教程目錄

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM