一:頁面關(guān)閉數(shù)據(jù)傳遞在頁面關(guān)閉的時候,將數(shù)據(jù)傳遞到上一個界面,這是一個很常用的功能,一般用于數(shù)據(jù)選擇,比如淘寶的收貨人選擇,需要在收貨人管理界面將選擇的收貨人信息傳遞到訂單 ...
在頁面關(guān)閉的時候,將數(shù)據(jù)傳遞到上一個界面,這是一個很常用的功能,一般用于數(shù)據(jù)選擇,比如淘寶的收貨人選擇,需要在收貨人管理界面將選擇的收貨人信息傳遞到訂單界面。
在Android中,activity自帶有activityForResult,進行傳遞
在IOS中,一般通過Delegate/Block來處理
在React-Native中,則是通過navigator 在push的時候,傳遞一個callback,子頁面關(guān)閉之前,回調(diào)該callback進行值傳遞,然后進行處理
那么在小程序中怎么做呢?
通過文檔,我們可以看到小程序沒有像Android 和 IOS 那樣,有系統(tǒng)提供的api進行操作,而頁面跳轉(zhuǎn)是通過
wx.navigateTo(OBJECT)
//url String 是 需要跳轉(zhuǎn)的應(yīng)用內(nèi)非 tabBar 的頁面的路徑 , 路徑后可以帶參數(shù)。參數(shù)與路徑之間使用?分隔,參數(shù)鍵與參數(shù)值用=相連,不同參數(shù)用&分隔;如 'path?key=value&key2=value2'
//success Function 否 接口調(diào)用成功的回調(diào)函數(shù)
//fail Function 否 接口調(diào)用失敗的回調(diào)函數(shù)
//complete Function 否 接口調(diào)用結(jié)束的回調(diào)函數(shù)(調(diào)用成功、失敗都會執(zhí)行)
跳轉(zhuǎn)傳遞的參數(shù)和web的連接一樣,也不能像React-Native 那樣,傳遞callback。
這tm就尷尬了,大寫的懵逼?。。?!
看來,不能通過跳轉(zhuǎn)的時候做處理,換個思路,看看是否能在返回的時候做文章,我們看文檔,小程序的返回是通過
wx.navigateBack(OBJECT)
// 關(guān)閉當前頁面,返回上一頁面或多級頁面??赏ㄟ^ getCurrentPages()) 獲取當前的頁面棧,決定需要返回幾層。
//OBJECT 參數(shù)說明:
//參數(shù) 類型 默認值 說明
//delta Number 1 返回的頁面數(shù),如果 delta 大于現(xiàn)有頁面數(shù),則返回到首頁。
看上去,這個好像并不能做什么文章,只是一個返回操作,參數(shù)只能傳遞返回的頁面數(shù),并沒有說可以回傳數(shù)據(jù)過去
難道真的沒有解決辦法了嗎?
當然不是!
文檔中有句非常重要的提示
可通過 getCurrentPages()) 獲取當前的頁面棧,決定需要返回幾層。
我們先看一下getCurrentPages()返回的數(shù)據(jù)是什么
我們可以看到,返回的是通過 wx.navigateTo方法到當前頁面的路徑的所有頁面,好像有點眉目了,我們是否可以找到上級頁面然后去修改他的data屬性呢?
Page({
...
submit: function(e) {
let pages = getCurrentPages()
let curPage = pages[pages.length - (delta + 1)];
let data = curPage.data;
curPage.seo?tData({'data.invoice': {key1: "111", "key2": "222"}});
}
})
運行之后,喜極而泣,果然能修改上個頁面data屬性,從而更新UI
封裝自己的pageForResult
這個方法很有可能用的地方比較多,而且可能返回的不是上級頁面,我們可以做下簡單的封裝
class Router {
/**
* 返回并回傳值
*
*/
navigateBack(obj) {
let delta = obj.delta ? obj.delta : 1;
if (obj.data) {
let pages = getCurrentPages()
let curPage = pages[pages.length - (delta + 1)];
if(curPage.pageForResult) {
curPage.pageForResult(obj.data);
} elseo? {
curPage.setData(obj.data);
}
}
wx.navigateBack({
delta: delta, // 回退前 delta(默認為1) 頁面
success: function (res) {
// success
obj.success && obj.success(res);
},
fail: function (err) {
// fail
obj.function && obj.function(err);
},
complete: function () {
// complete
obj.complete && obj.complete();
}
})
}
}
Router = new Router();
module.exports = Router;
使用起來很簡單
// 修改上個界面的invoice
let invoice = {
type: type,
header: header,
content: content,
header_content: this.data.headerContent
}
Router.navigateBack({data: {invoice: invoice}});
// 或是在上級頁面增加一個 pageForResualt方法
上面的封裝,我們可以通過兩種方式進行數(shù)據(jù)傳遞
如果你有更高的方法,請告訴我
對于一個app來說,日期選擇是一個非常常用的功能,無論是在IOS 、Android 還是 React-Native中都有系統(tǒng)空間或是比較成熟的解決方案,同樣,在小程序中,微信也給我提供了一個比較強大的日期組件——picker。
從底部彈起的滾動選擇器,現(xiàn)支持三種選擇器,通過mode來區(qū)分,分別是普通選擇器,時間選擇器,日期選擇器,默認是普通選擇器。
通過查看小程序文檔
可以看到,通過mode屬性,分別可以支持普通選擇器、時間選擇器和日期選擇器。
使用方法比較簡單,可以直接在wxml 文件中進行使用
// wxml
<picker mode="selector" >
<picker mode="time" >
<picker mode="date" >
重點來了
我在開發(fā)過程中有個需求是按月份進行訂單的篩選,所以需要用日期選擇器,先看一下日期控件的使用方法
// page/test/index.js
Page({
data: {
year: 2017,
month: 1,
},
bindDateChange: function (e) {
let [year, month] = e.detail.value.split("-");
this.setData({
year: year,
month: month
})
},
})
// wxml
<picker mode="date" fields="month" value="2017-01" start="2016-05" end="2017-01" bindchange="bindDateChange">
<text class="t-title">{{year}}年</text>
<text class="t-value">{{month}}月</text>
</picker>
以上是測試代碼,代碼比較簡單,就是在頁面有個picker控件,默認顯示日期是2017-01,開始日期和結(jié)束日期分別是:2016-05 和 2017-01,粒度為月份(month,這個很重要,只有粒度為month的時候才會出現(xiàn)這個bug)當選擇新的日期后,在頁面上更新對應(yīng)的年和月。
運行一下代碼
沒有任何毛病啊,顯示完全正常。別急,上面的視頻我們是在devTools 上面運行的,我們試試在真機上運行
我們可以看到,切換到2016年其他月份后,在切回2017年1月,會顯示2017年5月,目測問題是月份沒有更新到,而是顯示了2016年開始的月份。
工作日 8:30-12:00 14:30-18:00
周六及部分節(jié)假日提供值班服務(wù)