首先說點(diǎn)什么呢厦取,因?yàn)楣拘枨蟪碧乙查_始跳到小程序的坑里了,填坑之路艱辛而凄涼虾攻,好啦雖然有很多坑铡买,但畢竟小程序才出現(xiàn)不久,有坑也正常霎箍,哈哈哈不扯淡了寻狂,來說說小程序的頁面?zhèn)髦蛋?/p>
一. 跨頁面?zhèn)髦?
1 . 用 navigator標(biāo)簽傳值或 wx.navigator
, 比如
這里將good_id=16
參數(shù)傳入 detail 頁面, 然后 detail 頁面的 onload 方法內(nèi)接受.
如果需要傳多個(gè)參數(shù), 用 & 鏈接即可
如果要傳 數(shù)組, 字典等復(fù)雜類型, 要先用
JSON.stringify()
轉(zhuǎn)成字符串傳遞.
注 : 如果轉(zhuǎn)化的字符串中 有"?","&"或"="等這樣的符號朋沮,則只會(huì)傳遞符號以前的字符串蛇券,符號后面數(shù)據(jù)會(huì)被丟失缀壤,這個(gè)問題我猜想可能是小程序內(nèi)部的路由處理 對這些符號敏感吧。所以有時(shí)候這里可以先用
encodeURIComponent()
進(jìn)行轉(zhuǎn)碼纠亚,在目標(biāo)頁面再用decodeURIComponent()
解碼塘慕,這樣就可以避免數(shù)據(jù)丟失了。OK蒂胞,這是第一種 依靠跳轉(zhuǎn)的url帶參數(shù)傳值
2 . 用getCurrentPages()
獲取棧中全部頁面的, 然后把數(shù)據(jù)寫入相應(yīng)頁面.
-
2.1. 先獲取全部頁面, 取出來是個(gè)數(shù)組, 然后用下標(biāo)定位
注:這里 這個(gè)
__route__
是一個(gè)屬性图呢,在最新的小程序中,已經(jīng)可以用route
這個(gè)屬性替換骗随,即圖中的
arr[arr.length - 2].__route__
與arr[arr.length - 2].route
等效蛤织。
這里可以傳字符串, 也能傳數(shù)組等, 這樣就把 address
傳遞并接受了
注 : 這個(gè)方法適合 往后面?zhèn)髦?即已經(jīng)存在的頁面), 這樣才能在棧中找到并主動(dòng)寫入數(shù)據(jù), 且 一定要在
onshow()
方法中接受, 因?yàn)樵俅畏祷刂粓?zhí)行onshow()
方法.
- 2.2 這里是在當(dāng)前頁面直接賦值前一個(gè)頁面的data, 所以要在前一個(gè)頁面的
onshow()
方法中做設(shè)置, 確保數(shù)據(jù)傳遞并更新到視圖層, 但這個(gè)這個(gè)方法有一個(gè)問題, 就是當(dāng)前頁面直接賦值時(shí), 容易造成時(shí)序問題, 導(dǎo)致數(shù)據(jù)錯(cuò)亂. 推薦以下這種寫法
注 : 是不是很熟悉?只是用系統(tǒng)的
setData()
替換了直接賦值, 其實(shí)arr[arr.length - 2]
就類似于this/that
, 而arr[arr.length - 2]
就相當(dāng)于前一頁的this/that
, 且這樣寫, 在前一頁的onshow()
還不用設(shè)置, 數(shù)據(jù)傳遞與更新視圖層 一鍵搞定.
3 . 寫入本地, 跨頁面在取出來 wx.setStorage/wx.getStorage
等, 小程序中對寫入本地?cái)?shù)據(jù) 封裝了很多方法, 各有側(cè)重, 這里就不多說了
4 . 把 數(shù)據(jù)聲明為全局變量, 可在任何頁面獲取
let detail = getApp().detail;
二. 頁內(nèi)傳值
1 . 設(shè)置id的方法標(biāo)識跳轉(zhuǎn)后傳遞后的參數(shù)
在bindtap定義的點(diǎn)擊方法 swiperTap : function(e)
中獲取
let id = e.currentTarget.id;
2 . 設(shè)置 data-xxx 的方法來標(biāo)識要傳遞的值
注 : 這里
data-index="{{index}}"
里的 {{index}} 是有效的, 在用wx-for 渲染視圖層時(shí), index 代表點(diǎn)擊的下標(biāo). 在bindtap定義的點(diǎn)擊方法swiperTap : function(e)
中獲取, 即
let index = e.currentTarget.dataset.index;
其他的參數(shù)取出也如此,
let type = e.currentTarget.dataset.type;