刚开始学习微信小程序,在基础框架学习中主要遇到以下两个问题:
一.button的点击跳转页面事件不被触发
app.json:
"tabBar"
: {
"list"
: [{
"pagePath"
:
"../logs/logs"
,
"text"
:
"text"
,
"iconPath"
:
"iconPath"
,
"selectedIconPath"
:
"selectedIconPath"
}]
}
index.js:
//事件处理函数,由于路径../logs/logs已经再tapbar里被设置,所以此处button惦记事件不会被响应
bindViewTap:
function
() {
wx.navigateTo({
url:
'../logs/logs'
})
}
经过调查发现,是由于在app.json中设置了tapbar属性,只要是在tapbar中设置过的页面属性,是无法被任何其它事件触发的。
目前还不知道这是bug还是微信的特性
二.关于以下逻辑(回调与异步)的理解
wx.getUserInfo({
success: res => {
// 可以将 res 发送给后台解码出 unionId
this
.globalData.userInfo = res.userInfo
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
if
(
this
.userInfoReadyCallback) {
this
.userInfoReadyCallback(res) //这里回调userInfoReadyCallback方法给用户信息赋值
}
}
})
在尝试获取用户信息的时候,会判断
this
.userInfoReadyCallback是否被赋值,如果被赋值,则Page的onload已经被调用。
onLoad:
function
() {
if
(app.globalData.userInfo) {
this
.setData({
userInfo: app.globalData.userInfo,
hasUserInfo:
true
})
}
else
if
(
this
.data.canIUse){
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
app.userInfoReadyCallback = res => { //this.userInfoReadyCallback就是在这里赋值
this
.setData({ //其实这里是一个回调函数,至于为什么不是app.userInfoReadyCallback(res){}
hasUserInfo:
true //由于对lamda表达式理解不深,有大神看到还望告知
})
}
即页面加载完毕,回调onLoad方法时,会给用户信息赋值,然而若此时getUserInfo尚未获得结果,就需要在getUserInfo之后,重新给用户信息赋值。这也充分体现了微信小程序里的方法都是异步处理的。