App
代表頂層應用,管理所有頁面和全域資料,並提供生命週期方法。它也是一個構造方法,產生 App
執行個體。一個小程式就是一個 App
執行個體。
簡介
每個小程式的頂層一般包含三個檔案:
app.acss
:應用樣式(可選)app.js
:應用邏輯app.json
:應用配置
下面是一個簡單的 app.json
:
{
"pages": [
"pages/index/index",
"pages/logs/index"
],
"window": {
"defaultTitle": "Demo"
}
}
在上述配置中,指定了小程式包含兩個頁面,以及應用視窗的預設標題是 Demo
。
App
提供四個事件,可以設定鉤子方法:
onLaunch
:小程式啟動onShow
:小程式切換到前台onHide
:小程式切換到後台onError
:小程式出錯
一個簡單的 app.js
代碼如下:
App({
onLaunch(options) {
// 小程式初始化
},
onShow(options) {
// 小程式顯示
},
onHide() {
// 小程式隱藏
},
onError(msg) {
console.log(msg)
},
globalData: {
foo: true,
}
})
App()
App()
接受一個 object
作為參數,用來配置小程式的生命週期等。
參數說明:
屬性 | 類型 | 描述 | 觸發時機 |
---|---|---|---|
onLaunch | Function | 監聽小程式初始化 | 當小程式初始化完成時觸發,全域只觸發一次 |
onShow | Function | 監聽小程式顯示 | 當小程式啟動,或從後台進入前台顯示時觸發 |
onHide | Function | 監聽小程式隱藏 | 當小程式從前台進入後台時觸發 |
onError | Function | 監聽小程式錯誤 | 當小程式發生 js 錯誤時觸發 |
前台、後台定義: 使用者點擊左上方關閉,或者按了裝置 Home 鍵離開 mPaaS 用戶端時,小程式並不會直接銷毀,而是進入了後台,當再次進入 mPaaS 用戶端或再次開啟小程式時,又會從後台進入前台。
只有當小程式進入後台一定時間後,或佔用系統資源過高時,才會被真正銷毀。
onLaunch/onShow 方法的參數
屬性 | 類型 | 描述 |
---|---|---|
query | Object | 當前小程式的 query |
path | String | 當前小程式的頁面地址 |
Native 啟動傳參方法為:
URL 啟動傳參方法為:
query
從啟動參數的query
欄位解析而來,path
從啟動參數page
欄位解析而來。 例如在如下 URL 中:alipays://platformapi/startapp?appId=1999&query=number%3D1&page=x%2Fy%2Fz
其中的
query
參數解析如下:number%3D1 === encodeURIComponent('number=1')
其中的
path
參數解析如下:x%2Fy%2Fz === encodeURIComponent('x/y/z')
那麼,當使用者第一次啟動小程式可以從 onLaunch
方法中擷取這個參數,或者小程式在後台時被重新用 schema 開啟也可以從 onShow
方法中擷取這個參數。
App({
onLaunch(options) {
// 第一次開啟
// options.query == {number:1}
},
onShow(options) {
// 從後台被 scheme 重新開啟
// options.query == {number:1}
},
})
getApp()
我們提供了全域的 getApp()
函數,可以擷取小程式執行個體,一般用在各個子頁面之中擷取頂層應用。
var app = getApp()
console.log(app.globalData) // 擷取 globalData
注意:
App()
必須在app.js
裡調用,且不能調用多次。不要在定義於
App()
內定義的函數中調用getApp()
,使用this
就可以拿到app
執行個體。不要在
onLaunch
裡調用getCurrentPages()
,這個時候page
還沒有產生。通過
getApp()
擷取執行個體之後,不要私自調用生命週期函數。
全域的資料可以在 App()
中設定,各個子頁面通過全域函數 getApp()
可以擷取全域的應用執行個體。例如:
// app.js
App({
globalData: 1
})
// a.js
// localValue 只在 a.js 有效
var localValue = 'a'
// 產生 app 執行個體
var app = getApp()
// 拿到全域資料,並改變它
app.globalData++
// b.js
// localValue 只在 b.js 有效
var localValue = 'b'
// 如果 a.js 先運行,globalData 會返回 2
console.log(getApp().globalData)
在上面代碼中,a.js
和 b.js
都聲明了變數 localValue
,它們不會互相影響,因為各個指令碼聲明的變數和函數只在該檔案中有效。
app.json
app.json
用於全域配置,決定分頁檔的路徑、視窗表現、設定網路逾時時間、設定多 tab 等。
以下是一個包含了部分配置選項的簡單配置 app.json
。
{
"pages": [
"pages/index/index",
"pages/logs/index"
],
"window": {
"defaultTitle": "Demo"
}
}
app.json
配置項如下。
檔案 | 類型 | 必填 | 描述 |
---|---|---|---|
pages | String Array | 是 | 設定頁面路徑 |
window | Object | 否 | 設定預設頁面的視窗表現 |
tabBar | Object | 否 | 設定底部 tab 的表現 |
pages
pages
屬性是一個數組,每一項都是字串,用來指定小程式的頁面。每一項代表對應頁面的路徑資訊,數組的第一項代表小程式的首頁。小程式中新增/減少頁面,都需要對 pages
數組進行修改。
頁面路徑不需要寫 js
尾碼,架構會自動去載入同名的.json
、.js
、.axml
、.acss
檔案。
舉例來說,如果開發目錄為:
pages/
pages/index/index.axml
pages/index/index.js
pages/index/index.acss
pages/logs/logs.axml
pages/logs/logs.js
app.js
app.json
app.acss
app.json
就要寫成下面的樣子。
{
"pages":[
"pages/index/index",
"pages/logs/logs"
]
}
注意:page
忽略時預設為首頁
window
window
屬性用於設定小程式通用的狀態列、導航條、標題、視窗背景色。
子屬性包括 titleBarColor
、 defaultTitle
、 pullRefresh
、 allowsBounceVertical
。
檔案 | 類型 | 必填 | 描述 |
---|---|---|---|
titleBarColor | 十進位 | 否 | 導覽列背景色 |
defaultTitle | String | 否 | 頁面標題 |
pullRefresh | Boolean | 否 | 是否允許下拉重新整理。預設 |
allowsBounceVertical | String(YES/NO) | 否 | 頁面是否支援縱向拽拉超出實際內容。預設 |
樣本如下:
{
"window":{
"defaultTitle": "支付寶介面功能示範"
}
}
tabBar
如果你的小程式是一個多 tab 應用(用戶端視窗的底部欄可以切換頁面),那麼可以通過tabBar
配置項指定 tab 欄的表現,以及 tab 切換時顯示的對應頁面。
通過頁面跳轉(
my.navigateTo
)或者頁面重新導向(my.redirectTo
)所到達的頁面,即使它是定義在 tabBar 配置中的頁面,也不會顯示底部的 tab 欄。tabBar
的第一個頁面必須是首頁。
tabBar 配置
檔案 | 類型 | 必填 | 描述 |
---|---|---|---|
textColor | HexColor | 否 | 文字顏色 |
selectedColor | HexColor | 否 | 選中文字顏色 |
backgroundColor | HexColor | 否 | 背景色 |
items | Array | 是 | 每個 tab 配置 |
每個 item 配置
檔案 | 類型 | 必填 | 描述 |
---|---|---|---|
pagePath | String | 是 | 設定頁面路徑 |
name | String | 是 | 名稱 |
icon | String | 否 | 平常表徵圖路徑 |
activeIcon | String | 否 | 高亮表徵圖路徑 |
icon
推薦大小為 60*60px ,系統會對任意傳入的圖片非等比展開或縮放。
例如
{
"tabBar": {
"textColor": "#dddddd",
"selectedColor": "#49a9ee",
"backgroundColor": "#ffffff",
"items": [
{
"pagePath": "pages/index/index",
"name": "首頁"
},
{
"pagePath": "pages/logs/logs",
"name": "日誌"
}
]
}
}
啟動參數
從 native 代碼中開啟小程式時可以帶上 page
和 query
參數,page
用來指定開啟特定頁面的路徑,query
用來帶入參數。
iOS 範例程式碼
NSDictionary *param = @{@"page":@"pages/card/index", @"query":@"own=1&sign=1&code=2452473"}; MPNebulaAdapterInterface startTinyAppWithId:@"1234567891234568" params:param];
Android 範例程式碼
Bundle param = new Bundle(); param.putString("page", "pages/card/index"); param.putString("query", "own=1&sign=1&code=2452473"); MPNebula.startApp("1234567891234568",param);