首先說點什么呢,因為公司需求,我也開始跳到小程序的坑里了,填坑之路艱辛而凄涼,好啦雖然有很多坑,但畢竟小程序才出現不久,有坑也正常,哈哈哈不扯淡了,來說說小程序的頁面傳值吧
一. 跨頁面傳值.
1 . 用 navigator標簽傳值或 wx.navigator
, 比如
這里將good_id=16
參數傳入 detail 頁面, 然后 detail 頁面的 onload 方法內接受.
如果需要傳多個參數, 用 & 鏈接即可
如果要傳 數組, 字典等復雜類型, 要先用
JSON.stringify()
轉成字符串傳遞.
注 : 如果轉化的字符串中 有"?","&"或"="等這樣的符號,則只會傳遞符號以前的字符串,符號后面數據會被丟失,這個問題我猜想可能是小程序內部的路由處理 對這些符號敏感吧。所以有時候這里可以先用
encodeURIComponent()
進行轉碼,在目標頁面再用decodeURIComponent()
解碼,這樣就可以避免數據丟失了。OK,這是第一種 依靠跳轉的url帶參數傳值
2 . 用getCurrentPages()
獲取棧中全部頁面的, 然后把數據寫入相應頁面.
-
2.1. 先獲取全部頁面, 取出來是個數組, 然后用下標定位
圖片.png
注:這里 這個
__route__
是一個屬性,在最新的小程序中,已經可以用route
這個屬性替換,即圖中的
arr[arr.length - 2].__route__
與arr[arr.length - 2].route
等效。
這里可以傳字符串, 也能傳數組等, 這樣就把 address
傳遞并接受了
注 : 這個方法適合 往后面傳值(即已經存在的頁面), 這樣才能在棧中找到并主動寫入數據, 且 一定要在
onshow()
方法中接受, 因為再次返回只執行onshow()
方法.
- 2.2 這里是在當前頁面直接賦值前一個頁面的data, 所以要在前一個頁面的
onshow()
方法中做設置, 確保數據傳遞并更新到視圖層, 但這個這個方法有一個問題, 就是當前頁面直接賦值時, 容易造成時序問題, 導致數據錯亂. 推薦以下這種寫法
注 : 是不是很熟悉?只是用系統的
setData()
替換了直接賦值, 其實arr[arr.length - 2]
就類似于this/that
, 而arr[arr.length - 2]
就相當于前一頁的this/that
, 且這樣寫, 在前一頁的onshow()
還不用設置, 數據傳遞與更新視圖層 一鍵搞定.
3 . 寫入本地, 跨頁面在取出來 wx.setStorage/wx.getStorage
等, 小程序中對寫入本地數據 封裝了很多方法, 各有側重, 這里就不多說了
4 . 把 數據聲明為全局變量, 可在任何頁面獲取
let detail = getApp().detail;
二. 頁內傳值
1 . 設置id的方法標識跳轉后傳遞后的參數
在bindtap定義的點擊方法 swiperTap : function(e)
中獲取
let id = e.currentTarget.id;
2 . 設置 data-xxx 的方法來標識要傳遞的值
注 : 這里
data-index="{{index}}"
里的 {{index}} 是有效的, 在用wx-for 渲染視圖層時, index 代表點擊的下標. 在bindtap定義的點擊方法swiperTap : function(e)
中獲取, 即
let index = e.currentTarget.dataset.index;
其他的參數取出也如此,
let type = e.currentTarget.dataset.type;