小程序?qū)W習(xí)(四)之邏輯層(主要說(shuō)的是對(duì)應(yīng)的js文件)
本節(jié)知識(shí)點(diǎn):
-
注冊(cè)小程序
-
場(chǎng)景值
-
注冊(cè)頁(yè)面
-
路由
-
模塊化
-
API
App()
App()函數(shù)用來(lái)注冊(cè)一個(gè)小程序,接受一個(gè)object參數(shù),其指定小程序的生命周期函數(shù)等。
object參數(shù)說(shuō)明:
-
onLaunch
類(lèi)型是function 作用監(jiān)聽(tīng)小程序初始化,觸發(fā)時(shí)機(jī)就是當(dāng)小程序初始化加載,會(huì)觸發(fā)onLaunch(全局只觸發(fā)一次)
-
onReady
類(lèi)型function 作用監(jiān)聽(tīng)小程序加載。觸發(fā)時(shí)機(jī)當(dāng)小程序初次渲染完成。
onShow
類(lèi)型是Function 作用是監(jiān)聽(tīng)小程序顯示。觸發(fā)時(shí)機(jī)當(dāng)小程序啟動(dòng)后,或者從后臺(tái)進(jìn)入前臺(tái)顯示,會(huì)觸發(fā)onShow
- onHide
類(lèi)型是Function 作用是監(jiān)聽(tīng)小程序隱藏,觸發(fā)時(shí)機(jī)當(dāng)小程序從前臺(tái)進(jìn)入后臺(tái)時(shí)候,會(huì)觸發(fā)onHide
- OnError
類(lèi)型function 作用錯(cuò)誤監(jiān)聽(tīng)函數(shù) , 當(dāng)小程序發(fā)生腳本錯(cuò)誤,或者api調(diào)用失敗。會(huì)觸發(fā)onError并帶上錯(cuò)誤信息
- 其他
類(lèi)型Any 開(kāi)發(fā)者可以添加任意的函數(shù)或者數(shù)據(jù)到object參數(shù)中,用this可以訪(fǎng)問(wèn)
前臺(tái),后臺(tái)定義。當(dāng)用戶(hù)點(diǎn)擊左上角關(guān)閉,或者來(lái)電話(huà)的時(shí)候,小程序并沒(méi)有直接銷(xiāo)毀,而是進(jìn)入了后臺(tái)。當(dāng)再次進(jìn)入小程序就又會(huì)從后臺(tái)進(jìn)入前臺(tái)。
特別注意:只有當(dāng)小程序進(jìn)入后臺(tái)一定的時(shí)間,或者系統(tǒng)資源占用過(guò)高,才會(huì)被真正的銷(xiāo)毀。
getApp()
我們提供了全局的getApp()函數(shù),可以獲取到小程序?qū)嵗?/p>
var app = getApp();
console.log(app.globalData) //I am global data
特別注意:App()必須在app.js中注冊(cè),且不能是多個(gè)
不要在定義于App()內(nèi)的函數(shù)調(diào)用getApp()使用this 就可以拿到app實(shí)例
不要在onlauch的時(shí)候調(diào)用getCurrentPages(),此時(shí)page還沒(méi)有生成
通過(guò)getApp() 獲取到實(shí)例后,不要私自調(diào)用或者啟用生命周期函數(shù)
Page
Page()函數(shù)用來(lái)注冊(cè)一個(gè)頁(yè)面,接受一個(gè)object參數(shù),其指定的頁(yè)面的初始數(shù)據(jù),生命周期函數(shù),事件處理函數(shù)等等
Object參數(shù)說(shuō)明:
data 類(lèi)型object 作用頁(yè)面的初始數(shù)據(jù)
onLoad 類(lèi)型Function 作用監(jiān)聽(tīng)頁(yè)面加載(只執(zhí)行一次)
onReady 類(lèi)型Function 作用監(jiān)聽(tīng)頁(yè)面初次渲染完成
onShow 類(lèi)型Function 作用監(jiān)聽(tīng)頁(yè)面顯示
onHide 類(lèi)型Function 作用監(jiān)聽(tīng)頁(yè)面隱藏
onUnload 類(lèi)型Function 作用監(jiān)聽(tīng)頁(yè)面卸載
onPullDownRefresh 類(lèi)型Function 作用監(jiān)聽(tīng)用戶(hù)下拉動(dòng)作
onReachBottom 類(lèi)型Function 作用頁(yè)面上拉觸底事件的處理函數(shù)
onShareAppMessage 類(lèi)型Function 作用用戶(hù)點(diǎn)擊右上角轉(zhuǎn)發(fā)
onPageScroll 類(lèi)型Function 作用頁(yè)面滾動(dòng)觸發(fā)事件的處理函數(shù)
其他 類(lèi)型 Any 作用開(kāi)發(fā)者可以添加任意的函數(shù)或者數(shù)據(jù)到object參數(shù)中。在頁(yè)面的函數(shù)中用this可以訪(fǎng)問(wèn)
示例代碼:
//index.js
Page({
data: {
text: "This is page data."
},
onLoad: function(options) {
// Do some initialize when page load.
},
onReady: function() {
// Do something when page ready.
},
onShow: function() {
// Do something when page show.
},
onHide: function() {
// Do something when page hide.
},
onUnload: function() {
// Do something when page close.
},
onPullDownRefresh: function() {
// Do something when pull down.
},
onReachBottom: function() {
// Do something when page reach bottom.
},
onShareAppMessage: function () {
// return custom share data when user share.
},
onPageScroll: function() {
// Do something when page scroll
},
// Event handler.
viewTap: function() {
this.setData({
text: 'Set some data for updating view.'
}, function() {
// this is setData callback
})
},
customData: {
hi: 'MINA'
}
})
初始化數(shù)據(jù)
初始化數(shù)據(jù)將作為頁(yè)面的第一次渲染。data將會(huì)以JSON的形式由邏輯層傳輸?shù)戒秩緦?。所以?shù)據(jù)必須是可以轉(zhuǎn)成JSON格式的。字符串,數(shù)字,布爾值,對(duì)象,數(shù)組
<view>{{text}}</view>
<view>{{array[0].msg}}</view>
對(duì)應(yīng)的在JS里面的data數(shù)據(jù)應(yīng)該寫(xiě)成
Page({
data:{
text:"今天",
array:[{msg:'1'},{msg:'2'}]
}
})
生命周期函數(shù)
-
onLoad :頁(yè)面加載
一個(gè)頁(yè)面只會(huì)調(diào)用一次,可以在onLoad中獲取打開(kāi)當(dāng)前頁(yè)面所調(diào)用的query參數(shù)
-
onShow:頁(yè)面顯示
每次打開(kāi)頁(yè)面都會(huì)調(diào)用一次
-
onReady: 頁(yè)面初次渲染完成
一個(gè)頁(yè)面只會(huì)調(diào)用一次,代碼頁(yè)面已經(jīng)準(zhǔn)備妥當(dāng),可以和視圖層交互
對(duì)界面的設(shè)置如:wx.setNavigationBarTitle請(qǐng)?jiān)趏nReady之后設(shè)置 -
onHide 頁(yè)面隱藏
當(dāng)navigateTo或者底部tab切換的時(shí)候調(diào)用
-
onUnload: 頁(yè)面卸載
當(dāng)redirectTo或者navigateBack的時(shí)候調(diào)用
頁(yè)面相關(guān)事件處理函數(shù)
-
onPullDownRefresh :下拉刷新
(1)監(jiān)聽(tīng)用戶(hù)下拉刷新事件。
(2)必須需要在app.json的window選項(xiàng)中,或者在頁(yè)面配置中開(kāi)啟enablePullDownRefresh
(3)當(dāng)處理完數(shù)據(jù)刷新后。wx.stopPullDownRefresh可以停止當(dāng)前頁(yè)面的刷新 -
onReachBottom:上拉觸底
(1)監(jiān)聽(tīng)用戶(hù)上拉觸底事件。
(2)可以在app.json里面的window選項(xiàng)中或者頁(yè)面配置中設(shè)置觸發(fā)距離onReachBottomDistance
(3)在觸發(fā)距離內(nèi)滑動(dòng)期間,本事件只會(huì)觸發(fā)一次. -
onPageScroll:頁(yè)面滾動(dòng)
(1)監(jiān)聽(tīng)用戶(hù)滑動(dòng)頁(yè)面事件
(2)參數(shù)為object包含以下字段.
scrollTop 類(lèi)型Num 頁(yè)面在垂直方向已滾動(dòng)的距離(單位Px)
(3)代碼如下:
onPageScroll:function(options){
console.log(options.scrollTop);
}
-
onShareAppMessage : 用戶(hù)轉(zhuǎn)發(fā)
(1)只有定義了此事件處理函數(shù),右上角菜單才會(huì)顯示轉(zhuǎn)發(fā)按鈕.
(2)用戶(hù)點(diǎn)擊轉(zhuǎn)發(fā)按鈕的時(shí)候就會(huì)調(diào)用
(3)此事件需要return一個(gè)object用戶(hù)自定義轉(zhuǎn)發(fā)內(nèi)容
onShareAppMessage: function () {
return {
title: '頁(yè)面的主標(biāo)題',
desc: '頁(yè)面的描述',
path: '/pages/index/index?id=123'
}
}
事件處理函數(shù)
(1)除了初始化數(shù)據(jù)和生命周期函數(shù),我們還可以自定義事件處理函數(shù),在組件中加入事件綁定,當(dāng)達(dá)到觸發(fā)事件就會(huì)執(zhí)行Page中定義的事件處理函數(shù).
示例代碼:
<view bindtap = "clickme">點(diǎn)擊我</view>
在邏輯層(js)
Page({
clickme:function(){
console.log('Hello world!')
}
})
this.setData()
setData 函數(shù)用于將數(shù)據(jù)從邏輯層發(fā)送到視圖層(異步),同時(shí)改變對(duì)應(yīng)的this.data的值(同步)
setData()參數(shù)格式
- data
類(lèi)型object 必填:是 描述需要改變的數(shù)據(jù)
- callback 類(lèi)型function 必填:否 描述回調(diào)函數(shù)
object以key,value的形式表示將this.data中的key對(duì)應(yīng)的值變成value!callback是一個(gè)回調(diào)函數(shù),在這次setData對(duì)界面渲染完畢后使用。
其中key可以非常靈活,以數(shù)據(jù)路徑的形式給出。如arr[2].message,a.b.c.d并且不需要再this.data中預(yù)先定義.
注意:
直接修改this.data而不調(diào)用this.setData 是無(wú)法改變頁(yè)面的狀態(tài)的。還會(huì)造成數(shù)據(jù)不一致。
單次設(shè)置的數(shù)據(jù)不能超過(guò)1024KB,避免一次設(shè)置過(guò)多的數(shù)據(jù).
示例代碼:
<view>{{text}}</view>
<button bindtap="changeText"> Change normal data </button>
<view>{{num}}</view>
<button bindtap="changeNum"> Change normal num </button>
<view>{{array[0].text}}</view>
<button bindtap="changeItemInArray"> Change Array data </button>
<view>{{object.text}}</view>
<button bindtap="changeItemInObject"> Change Object data </button>
<view>{{newField.text}}</view>
<button bindtap="addNewField"> Add new data </button>
在index.js文件里面
Page({
data: {
text: 'init data',
num: 0,
array: [{text: 'init data'}],
object: {
text: 'init data'
}
},
changeText: function() {
// this.data.text = 'changed data' // bad, it can not work
this.setData({
text: 'changed data'
})
},
changeNum: function() {
this.data.num = 1
this.setData({
num: this.data.num
})
},
changeItemInArray: function() {
// you can use this way to modify a danamic data path
this.setData({
'array[0].text':'changed data'
})
},
changeItemInObject: function(){
this.setData({
'object.text': 'changed data'
});
},
addNewField: function() {
this.setData({
'newField.text': 'new data'
})
}
})
頁(yè)面路由
在小程序中所有的頁(yè)面的路由全部由框架進(jìn)行管理
getCurrentPages()
getCurrentPages()函數(shù)用于獲取到當(dāng)前頁(yè)面棧的實(shí)例,以數(shù)組形式按棧的順序給出,第一個(gè)元素為首頁(yè),最后一個(gè)元素為當(dāng)前頁(yè)。
重要的事情說(shuō)三遍。千萬(wàn)不要修改頁(yè)面棧。千萬(wàn)不要修改頁(yè)面棧。千萬(wàn)不要修改頁(yè)面棧。
路由方式
-
打開(kāi)新頁(yè)面:
調(diào)用API wx.navigateTo
或者組件<navigator open-type="navigateTo"> -
頁(yè)面重定向
調(diào)用API wx.redirecTo
或者使用組件<navigator open-type="redirectTo"> -
頁(yè)面返回
調(diào)用API wx.navigateBack
或者使用組件<navigator open-type="navigateBack"> -
Tab切換
調(diào)用API wx.switchTab
或者使用組件<navigator open-type="switchTab"> -
重啟動(dòng)
調(diào)用API wx.reLaunch
或者使用組件<navigator open-type="reLaunch">
這幾種路由跳轉(zhuǎn)方式。對(duì)于前頁(yè)面來(lái)說(shuō):
wx.navigateTo 對(duì)應(yīng)的 onHide
wx.redirecTo 對(duì)應(yīng)的 onUnload
wx.navigateBack 對(duì)應(yīng)的onUnload
特別注意
- navigateTo,redirectTo只能打開(kāi)不是底部導(dǎo)航指定的頁(yè)面
- SwitchTab 只能打開(kāi)tabBar頁(yè)面
- reLaunch 可以打開(kāi)任意頁(yè)面
- 頁(yè)面底部的tabBar由頁(yè)面決定,即只要是定義了tabbar的頁(yè)面,底部就有tabBar
- 調(diào)用頁(yè)面路由帶的參數(shù)可以在目標(biāo)頁(yè)面的onLoad中獲取