最近小程序出來了,公司也要求我們開發一款小程序。于是,就開始著手做了,做了差不多一周吧,也遇到了很多問題,這里就來總結一下。(主要是從一個Android開發者的角度來述說的,可能比較 ...
最近小程序出來了,公司也要求我們開發一款小程序。
于是,就開始著手做了,做了差不多一周吧,也遇到了很多問題,這里就來總結一下。
(主要是從一個Android開發者的角度來述說的,可能比較零碎的一些知識點和經驗,如果大家還有補充,歡迎)
getUserInfo:function(cb){
var that = this
if(this.globalData.userInfo){
typeof cb == "function" && cb(this.globalData.userInfo)
}else{
//調用登錄接口
wx.login({
success: function () {
wx.getUserInfo({
success: function (res) {
that.globalData.userInfo = res.userInfo
typeof cb == "function" && cb(that.globalData.userInfo)
}
})
}
})
}
},
這里就是傳遞一個形參,cb的方法,并且這里還有一個很巧妙的判斷方法
typeof cb == "function" && cb(that.globalData.userInfo)
利用的&&的運算規律,首先判斷cb是不是一個方法, 這里的==可以作為類型是否相當的判斷,然后在&&中如果前面的不滿足,后面的則不會執行;如果是cb是一個方法,調用cb方法,并且傳入success成功回調的userinfo參數
還有一點,if(this.globalData.userInfo) 可以作為是否為null的判斷條件,在java中不可以。
X console.log("info"+info);
所以只能分開打印
console.log("info");
console.log(info);
json的使用,可以通過 json["key"]來取其子對象
person: {
name: "jafir",
age: "11",
}
var name = person["name"];
var age = person["age"];
info: {persons:[{name:"123",age:11},{name:"jafir1",age:12}]}
//如果有數組 通過這種方法獲取
console.log(that.data.info["persons"][1].name)
console.log(that.data.info["persons"][1].age)
要注意如果在page的data中要定義一個boolean類型的值,必須是 isSuccess : true而不是 isSuccess :"true"
if (this.data.isSccess) {
console.log("true")
} else {
console.log("false")
}
因為如果是isSucees : "true" ,結果為true,沒問題
但是如果是isSucess:"false",結果依舊為true,
因為這里的isSuccess不是boolean,而是一個非空類型,既然非空,if就是為true
如果,默認undefined,if則為false
建議在 page{}外面定義一個that變量,然后在onLoad中賦值為this,以后所有的地方,都可以使用that,這樣就避免有些地方,this并不是指向page的上下文對象
//上下文對象
var that;
page({
onLoad: function (options) {
// 頁面初始化 options為頁面跳轉所帶來的參數
that = this;
}
...
that.setData({
xxx: xxx,
})
})
從主頁跳轉一個新的界面 新界面處理完邏輯 成功與否 結束之后怎么通知 主頁結果?
這種情況,一般是沒有辦法解決的。經過測試,如果你想要從二級非主頁界面直接navigator打開主頁,是不行的,會報錯。
所以,我們采用的策略是:二級界面處理完數據之后,直接返回,然后在主頁界面重新拉取數據。所以會出現,我們的請求接口是在onShow方法里面執行的。因為onload只會執行一次
<image src="{{logoUrl?logoUrl:'../../img/paihao.png'}}"></image>
style="visibility:{{isShow?'visible':'hidden'}}"
你可以封裝一下網絡請求的返回結果,做統一處理
requestWithGet: function(paramsData) {
data.method = 'GET'
this.requestInternal(paramsData)
},
requestWithPost: function(paramsData) {
data.method = 'POST'
this.requestInternal(paramsData)
},
requestInternal: function (paramsData) {
var that = this;
console.log('requestInternal: 開始請求接口[' + paramsData.url + ']');
//開始網絡請求
wx.request({
url: paramsData.url,
data: paramsData.data,
method: paramsData.method,
success: function (res) {
console.log('requestInternal: 接口請求成功[' + paramsData.url + ']');
paramsData.success(res);
},
fail: function (res) {
console.log('requestInternal: 接口請求失敗[' + paramsData.url + ']');
console.log(res);
////在這里做請求失敗的統一處理
wx.showToast({
title: '網絡訪問失敗',
duration: 1500
})
typeof paramsData.fail == "function" && paramsData.fail(res);
},
complete: function (res) {
//在這里做完成的統一處理
typeof paramsData.complete == "function" && paramsData.complete(res);
}
})
}
這樣在使用請求的時候,可以直接先wx.request({}) 這樣,就可以IDE給你聯想生成對應的請求格式,然后直接把“wx.request” 替換 “requestWithGet”或者“requestWithPost”就OK了