[2016-10-12] 更新 緣起:昨天官方開發有了更新v0.10.101100,Picker的mode屬性已經支持date以及time(background-image的bug也修復),于是來更新此實例。 ##目標:實現集成日期組件 如圖
官方文檔出處:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html 步驟,在item.wxml文件中增加一個picker組件,如下: <view class="section"> <picker mode="date" value="{{date}}" start="2015-09-01" end="2017-09-01" bindchange="bindDateChange"> <view class="section__title"> 日期: {{date}} </view> </picker> </view> 如圖
從圖中可以看出:
于是我們需要在item.js文件中,聲明一個data值date與wxml中的{{date}}綁定關聯 然后在onLoad中初始化字符串格式的日期值,詳細說明見注釋: // 獲取當前日期 var date = new Date(); // 格式化日期為"YYYY-mm-dd" var dateStr = date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(); // 存回data,以渲染到頁面 this.setData({ date: dateStr }) 經過如上處理,日期組件已經顯示為當前日期 如圖
處理到此,我們還需要修復一個邏輯錯誤,即組件的結束日期應該不超過當日,做法也很簡單,只需要在wxml文件中對picker的日期屬性end由2017-09-01改為{{date}}即可 <picker mode="date" value="{{date}}" start="{{date}}" end="2017-09-01" bindchange="bindDateChange"> 吐槽一下,官方的picker的還是有bug的,完全不聽start與end使喚,仍可以選任意日期,暫時不去理會,代碼就這么寫著,什么時候開發工具修復了自然可以了,畢竟是現在還只是內測,就將就用著。 接下來處理日期組件點擊確認事件bindDateChange 回到item.js文件 聲明一個bindDateChange方法,添加如下代碼以寫回data中的date值 // 點擊日期組件確定事件 bindDateChange: function(e) { this.setData({ date: e.detail.value }) }
至此,已經實現集成日期picker組件。剩下的就是將它同之前的標題、類型、金額字段那樣存在json再本地setStorage存儲即可,這里不作贅述,具體可以參考本人公眾號之前發的文章《微信小程序(應用號)實戰課程之記賬應用開發》。 #1.小程序端通過微信第三方登錄,取出nickname向服務端請求登錄,成功后本地并緩存uid,accessToken 接口出處:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html App({ onLaunch: function() { wx.login({ success: function(res) { if (res.code) { //發起網絡請求 wx.request({ url: 'https://test.com/onLogin', data: { code: res.code } }) } else { console.log('獲取用戶登錄態失敗!' + res.errMsg) } } }); } }) 緩存用戶的基本信息 index.js onLoad: function(){ var that = this //調用應用實例的方法獲取全局數據 app.getUserInfo(function(userInfo){ //請求登錄 console.log(userInfo.nickName); app.httpService( 'user/login', { openid: userInfo.nickName }, function(response){ //成功回調 console.log(response); // 本地緩存uid以及accessToken var userinfo = wx.getStorageSync('userinfo') || {}; userinfo['uid'] = response.data.uid; userinfo['accessToken'] = response.data.accessToken; console.log(userinfo); wx.setStorageSync('userinfo', userinfo); } ); }) } app.js 定義一個通用的網絡訪問函數: httpService:function(uri, param, cb) { // 分別對應相應路徑,參數,回調 wx.request({ url: 'http://financeapi.applinzi.com/index.php/' + uri, data: param, header: { 'Content-Type': 'application/json' }, success: function(res) { cb(res.data) }, fail: function() { console.log('接口錯誤'); } }) }, 這里method默認為get,如果設置為其他,比如post,那么服務端怎么也取不到值,于是改動了服務端的取值方式,由 _GET。
在Storage面板中,檢查到數據已成功存入 [2016-10-25]
#由單機版升級為網絡版 ##1.緩存accessToken,以后作為令牌使用,uid不必緩存,由服務端完成映射,user/login接口 先來回顧一下app.js封裝的httpService的代碼實現: httpService:function(uri, param, cb) { // 分別對應相應路徑,參數,回調 wx.request({ url: 'http://financeapi.applinzi.com/index.php/' + uri, data: param, header: { 'Content-Type': 'application/json' }, success: function(res) { cb(res.data) }, fail: function() { console.log('接口錯誤'); } }) } 調用的是wx.request接口,返回res.data即為我們服務器返回的數據,結構與wx.request返回的類似,這里多一層結構,不可混淆。 response.code,response.msg,response.data是我自己服務端定義的結構 res.statusCode,res.errMsg,res.data是微信給我們定義的結構
明白了上述關系與作了封裝后,我們調用起來就方便了,index.js中onShow寫上如下代碼 app.httpService( 'user/login', { openid: userInfo.nickName }, function(response){ //成功回調,本地緩存accessToken var accessToken = response.data.accessToken; wx.setStorageSync('accessToken', accessToken); } ); app.js onLaunch調用如下代碼,在程序啟動就登錄與緩存accessToken。 之所以不在index.js中調用登錄,是因為app launch生命周期較前者更前,accessToken保證要加載item/all之前生成并緩存到本地 |