目錄
- 一、跨頁面傳值
-
- 正向傳值 A->B
- 反向傳值 B->A
- 二、頁面内傳值
- 三、本地儲存
- 四、全局的app對象
一、跨頁面傳值
正向傳值 A->B
1.用
navigator
标簽傳值或
wx.navigator
, 比如
// A頁面傳值
<navigator class="highLight" url="../detail/detail?good_id=18"></navigator>
這裡将
good_id=16
參數傳入detail頁面,然後detail頁面的onload方法内接收。
// B頁面接收
onLoad: function(options){
this.setData({
good_id: options.good_id
})
}
如果需要傳多個參數,用&連結即可
// A頁面傳值
<navigator class="highLight" url="../detail/detail?good_id=18&good_price=1.88&good_name=hello網際網路人"></navigator>
onLoad: function(options){
this.setData({
good_id: options.good_id,
good_name: options.good_name,
good_price: options.good_price
})
}
如果需要傳入數組,字典等複雜類型,要先用JSON.stringify()轉成字元串傳遞
let detail = [
{img: '../img1.png?111', title: '濃香', size: "0-0"},{img: '../img2.png?222', title: '醬香', size: "1-0"},{img: '../img3.png?333', title: '原味', size: "2-0"}
]
wx.navigateTo({
url: '../detail/detail/good_detail=' + JSON.stringify(detail),
success: function(res){
// todo sucess
},
fail: function(){
// todo fail
},
complete: function(){
// todo complete
}
})
注 : 如果轉化的字元串中 有"?","&“或”="等這樣的符号,則隻會傳遞符号以前的字元串,符号後面資料會被丢失,這個問題我猜想可能是小程式内部的路由處理 對這些符号敏感吧。是以有時候這裡可以先用 encodeURIComponent() 進行轉碼,在目标頁面再用 decodeURIComponent() 解碼,這樣就可以避免資料丢失了。OK,這是第一種 依靠跳轉的url帶參數傳值
反向傳值 B->A
在B界面需要傳值地方代碼如下
var pages = getCurrentPages() // 擷取棧中全部界面的, 然後把資料寫入相應界面
var currentPage = pages[pages.length - 1] //目前界面
var prePage = pages[pages.length - 2] //上一個界面
var that = this
prePage.setData({
id: that.data.id,
})
在A界面需要接受B界面傳過來值碼如下:這裡要在onShow方法裡面重新調用你的資料請求或是,為了驗證是否傳值成功,你可以列印驗證
注:由于你從B界面傳回A界面使用了wx.navigateBack,是以當你回到A界面後onLoad、onReady方法不響應,onShow方法響應,是以這裡你需要特别注意--生命周期
/**
* 生命周期函數--監聽頁面顯示
*/
onShow: function () {
//擷取資料
this.gainData()
// 列印你的傳值
console.log("res==", this.data.res)
},
二、頁面内傳值
1 . 設定id的方法辨別跳轉後傳遞後的參數
在bindtap定義的點選方法 swiperTap : function(e) 中擷取
2 . 設定 data-xxx 的方法來辨別要傳遞的值
注 : 這裡 data-city_index="{{item.index}}"裡的 {{item.index}} 是有效的, 在用wx-for 渲染視圖層時, item.index 代表點選的下标. 在bindtap定義的點選方法 swiperTap : function(e) 中擷取, 即
swiperTap: function(e){
let index = e.currentTarget.dataset.city_index;
}
其他的參數取出也如此,
3.form表單和input輸入框
<form bindsubmit="forSubmit">
<input name="detail" placeholder="詳細位址"></input>
<input name="name" placeholder="姓名"></input>
<input name="phone" placeholder="手機号" type="number"></input>
</form>
<input bindconfirm="confirm"/>
forSubmit: function(e){
var detail = e.detail.value.detail;
var name = e.detail.value.name;
var phone = e.detail.value.phone;
}
// confirm
confirm: funtion(e){
var a = e.detail.value
}
三、本地儲存
tips:本地資料存儲的大小限制為 10MB
每個微信小程式都可能用到本地緩存資料,這裡我們可以通過調用微信提供的方法:
wx.setStorage
、
wx.setStorageSync
、
wx.getStorage
、
wx.getStorageSync
、
wx.clearStorage
、
wx.clearStorageSync
、
實作對資料本地緩存
、
擷取
、
清除
。可參考微信小程式【資料緩存】開發文檔,檢視詳情。
在A界面擷取資料并緩存到本地
在B界面擷取資料并緩存到本地
var user_info = wx.getStorageSync("user_info")
this.setData({
username: user_info.username
});
從本地緩存中同步移除指定 key。這裡具體使用同步或是異步需要根據你存儲時的方法,或是同步清理本地資料緩存wx.clearStorageSync()
同理你可以在B界面傳值在A界面取值,隻不過這裡你需要注意存儲、擷取的順序,先存後取,否則你是拿不到值的。
四、全局的app對象
這裡你需要在app.js檔案,寫好你要全局使用的資料
//使用者資料
appData: {
user_info:null,
}
在你需要指派的地方引用app,代碼如下:
var app = getApp();
app.appData.user_info = {"username":"jane"};
在你需要取值的地方引用app,代碼如下:
var app = getApp();
var user_info = app.appData.user_info;
this.setData({
username: user_info.username
});
總結不易,留下足迹!!!
參考連結:
[1]https://www.jianshu.com/p/b2d912920a6a
[2]https://www.jianshu.com/p/0135769db89c