搜尋
首頁微信小程式小程式開發詳解微信小程式從子頁面退回父頁面時的資料傳遞過程

我們知道,在微信小程式中,從一個頁面轉到另一個頁面,一般情況下可以透過navigate或redirect時候的url來攜帶參數,然後在目標頁面的onLoad函數參數中取得這些url參數。例如:

// 源页面A相关代码
wx.navigateTo({
  url: "/pages/mypage/mypage?a=1&b=2"
})

// 目标页面B相关代码
Page({
  onLoad: function (options) {
    var a = options.a; // 值:1
    var b = options.b; // 值:2
  }
})

但是,這種方式只有在目標頁面還沒建立的時候,才有效。因為一個頁面的onLoad方法在頁面的生命週期中,只執行一次。

我們來考慮以下場景:

1. 在【页面A】中调用wx.navigateTo方法跳转到【页面B】
2. 然后从【页面B】返回【页面A】, 并将【页面B】中的一些数据传回【页面A】

舉個更實際點的例子,如下圖所示,我在這個表單頁面A中填寫資料:

詳解微信小程式從子頁面退回父頁面時的資料傳遞過程

A頁面

然後這個頁面上,有一個搜尋按鈕,點擊該按鈕,將跳到另一個證券代碼搜尋頁面B:

詳解微信小程式從子頁面退回父頁面時的資料傳遞過程

頁面B

當我在這個搜尋清單中選取一個證券代碼後,將會回到上一個表單頁面,繼續我未完成的表單填寫與提交操作。

這種場景是非常合理且常見的。

但是,我們來想一下,怎麼在退出頁面B,返回頁面A的時候,把頁面B中選中的證券代碼回傳給頁面A呢?使用navigateTo()中url攜帶參數的方式?

基於Page生命週期的原因,我們的答案是:不行!

那有什麼辦法可以做到呢?

方法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()方法,把数据存到上一个页面中去
prevPage.setData({
  mydata: {a:1, b:2}
})

比起全域資料儲存的方式,這種方式在邏輯上要清晰得多,也不存在對資料的銷毀有額外的管理工作。

總之,目前來看,如果你遇上了這樣的場景,我推薦你使用方法2來設計你的程式碼。也希望小程式框架能推出更好、更優雅的方式,來解決這種資料回傳問題。

以上是詳解微信小程式從子頁面退回父頁面時的資料傳遞過程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器