一:復(fù)雜數(shù)據(jù)的傳遞頁面跳轉(zhuǎn)進(jìn)行數(shù)據(jù)傳遞是一個(gè)必不可少的功能,有很多應(yīng)用場(chǎng)景需要使用比如買商品的流程是“選擇商品” - “購(gòu)物車” - “物流信息” - “確認(rèn)訂單”,所以在這幾個(gè)不同 ...
一:復(fù)雜數(shù)據(jù)的傳遞
頁面跳轉(zhuǎn)進(jìn)行數(shù)據(jù)傳遞是一個(gè)必不可少的功能,有很多應(yīng)用場(chǎng)景需要使用
比如買商品的流程是“選擇商品” -> “購(gòu)物車” -> “物流信息” -> “確認(rèn)訂單”,所以在這幾個(gè)不同頁面進(jìn)行跳轉(zhuǎn)的時(shí)候,相應(yīng)的數(shù)據(jù)也需要傳遞下去
在android中,我們可以用Intent 來進(jìn)行數(shù)據(jù)的傳遞,新界面通過getIntent來進(jìn)行獲取
在IOS中,一般是通過controller 的屬性來進(jìn)行傳值
在React-Native中,可以在navigator.push 方法傳遞對(duì)象
上面三種進(jìn)行數(shù)據(jù)的傳遞都很簡(jiǎn)單,而且也很方法。
而在小程序中,我們可以看到,頁面跳轉(zhuǎn)和傳遞數(shù)據(jù)是通過

代碼實(shí)現(xiàn)
wx.navigateTo({url: 'page?a=1&b=2',success: function (res) {// success},fail: function (err) {// fail},complete: function () {// complete}});他是通過url字段來控制跳轉(zhuǎn)的頁面,同時(shí)路徑“?”后面的表示傳遞的參數(shù),這跟http的GET請(qǐng)求傳參一致
在新頁面獲取參數(shù)信息也很簡(jiǎn)單
Page({data: {},onLoad: function(options) {console.log(options)}});可以直接在每個(gè)頁面的onLoad 回調(diào)中來進(jìn)行獲取。
看了上面的代碼,你會(huì)疑問這不是很簡(jiǎn)單嗎?還需要你來說嗎??jī)删浯a搞定的事
確實(shí),如果你只是做簡(jiǎn)單的數(shù)據(jù)傳遞是很簡(jiǎn)單
但是,回到最上面說的那個(gè)問題,如果頁面層級(jí)比較多,數(shù)據(jù)比較多且復(fù)雜的時(shí)候,你會(huì)抓狂,因?yàn)閣x.navigateTo 的url自動(dòng)是String類型,也就是說你不能直接傳遞對(duì)象,如果數(shù)據(jù)很多的話,會(huì)是一件很痛苦的事
wx.navigateTo({url: "page?productId=1&count=2&name=zhangzy&phone=13488888888&address=xxx"});代碼可讀性極差而且非常繁瑣,萬一那個(gè)字段忘記拼進(jìn)去,很容易出bug
所以,我們必須要做改變,需要優(yōu)化
結(jié)合上篇文章《返回上級(jí)頁面并傳遞數(shù)據(jù)》封裝另外一個(gè)大同小異的方法
class Router {navigateTo(obj) {wx.navigateTo({url: obj.url,success: function (res) {// successobj.success && obj.success(res);if (obj.data) {setTimeout(() => {let pages = getCurrentPages()let curPage = pages[pages.length - 1];if(curPage.startPageForData) {curPage.startPageForData(obj.data);} else {curPage.setData(obj.data);} }, 1000);}},fail: function (err) {// failobj.fail && obj.fail(res);},complete: function () {// completeobj.complete && obj.complete();}});}}Router = new Router();module.exports = Router;實(shí)際上還是基于微信提供的wx.navigateTo接口,在跳轉(zhuǎn)成功之后,我們獲取頁面棧里面最上層的一個(gè),也就是最新打開的那個(gè)頁面,從而進(jìn)行數(shù)據(jù)綁定或是執(zhí)行對(duì)應(yīng)的startPageForData方法,上面我們加了1000毫秒的延時(shí),主要是當(dāng)頁面跳轉(zhuǎn)之后,可能沒那么快注冊(cè)的棧里面,不延時(shí)可能獲取的還是之前頁面數(shù)