基礎(chǔ)學(xué)習(xí)微信小程序之注冊(cè)頁(yè)面
注冊(cè)過(guò)小程序之后,接下來(lái)注冊(cè)頁(yè)面。
代碼說(shuō)明
//index.js
//獲取應(yīng)用實(shí)例
var app = getApp()
Page({
??? data: {
??????? motto: 'Hello World',
??????? userInfo: {}
??? },
??
??? //事件處理函數(shù)
??? bindViewTap: function() {
??????? wx.navigateTo({
???????????? url: '../logs/logs'
??????? })
??? },
???
??? onLoad: function () {
??????? console.log('onLoad')
??????? var that = this
??????? //調(diào)用應(yīng)用實(shí)例的方法獲取全局?jǐn)?shù)據(jù)
??????? app.getUserInfo(function(userInfo){
??????????? //更新數(shù)據(jù)
??????????? that.setData({
??????????????? userInfo:userInfo
??????????? })
??? ? ? })
???? }
})
Page函數(shù)
Page()
?函數(shù)接受一個(gè)
object 參數(shù),用來(lái)注冊(cè)一個(gè)頁(yè)面。它可以指定頁(yè)面的初始數(shù)據(jù)、生命周期函數(shù)、事件處理函數(shù)等。
初始化數(shù)據(jù)
data屬性指定的數(shù)據(jù)在頁(yè)面第一次描畫時(shí)使用。本例中定義了兩個(gè)數(shù)據(jù):motto和userinfo。
事件處理
bindViewTap函數(shù)是在index.wxml中綁定到用戶信息表示容器上的。每當(dāng)用戶點(diǎn)擊該容器,這個(gè)函數(shù)就會(huì)被調(diào)用。它的內(nèi)容很簡(jiǎn)單,就是遷移到log畫面。
生命周期函數(shù)
本例中注冊(cè)了onLoad函數(shù),它會(huì)在頁(yè)面加載時(shí)自動(dòng)調(diào)用。
onLoad函數(shù)以函數(shù)對(duì)象為參數(shù)調(diào)用app.getUserInfo函數(shù)。而這個(gè)函數(shù)對(duì)象以u(píng)serinfo為參數(shù),功能是將userinfo設(shè)置到頁(yè)面數(shù)據(jù)的userinfo對(duì)象上。
JavaScript知識(shí)
在調(diào)用app.getUserInfo傳遞了一個(gè)匿名的函數(shù)對(duì)象。這個(gè)對(duì)象至少有兩點(diǎn)是C程序員不習(xí)慣的。
this和that
代 碼中首先定義了一個(gè)that變量并將this賦值給它,然后使用that調(diào)用setData函數(shù)。這么做是因?yàn)閖avascript的this指針指向的 是調(diào)用函數(shù)的上下文。而這個(gè)函數(shù)在app.getUserInfo中調(diào)用,所以不能直接使用this,而只能使用事先準(zhǔn)備好,指向本頁(yè)面對(duì)象的that。
函數(shù)對(duì)象
在app.js中,作為參數(shù)傳遞給getUserInfo的函數(shù)對(duì)象cb是這樣被調(diào)用的:
typeof cb == "function" && cb(this.globalData.userInfo)
我們可 以用&&符號(hào)將表達(dá)式分為兩部分,左邊是取得cb的類型,確認(rèn)是否是"function”,如果是則繼續(xù)執(zhí)行右半部分,以 this.globalData.userInfo為參數(shù)調(diào)用cb函數(shù);如果cb的類型不是"function",因?yàn)楸磉_(dá)式已經(jīng)為假,所以不會(huì)調(diào)用cb 函數(shù)。
換一種寫法,其實(shí)就是:
if(typeof cb == "function")
{
????cb(this.globalData.userInfo)
}
參考資料
關(guān)于this對(duì)象