邏輯層,是事務邏輯處理的地方。對於小程序而言,邏輯層就是.js腳本文件的集合。邏輯層將數據進行處理后發送給視圖層,同時接收視圖層的事件反饋。
微信小程序開發框架的邏輯層是由JavaScript編寫。在JavaScript的基礎上,微信團隊做了一些適當的修改,以便提高開發小程序的效率。主要修改包括:
♦ 增加app和page方法,進行程序和頁面的注冊
♦ 提供豐富的API,如掃一掃、支付等微信特有的能力
♦ 每個頁面有獨立的作用域,並提供模塊化能力。
邏輯層的實現就是編寫各個頁面的.js腳本文件。但由於小程序並非運行在瀏覽器中,所以JavaScript在Web中的一些能力無法使用,如document、window等。
我們開發編寫的所有代碼最終會打包成一份JavaScript,並在小程序啟動的時候運行,直到小程序銷毀。
注冊程序:App()方法
在邏輯層,App()方法用來注冊一個小程序。App()接受一個object參數,用於指定小程序的生命周期函數等。App()方法有且僅有一個,存在於app.js中。object參數見下表

注意:onLaunch函數全局只觸發一次。
前台、后台:用戶當前界面運行或操作小程序時為前台;當用戶點擊左上角關閉,或者按了設備Home鍵離開微信,小程序並沒有直接銷毀,而是進入后台;當再次進入微信或再次打開小程序,又會從后台進入前台。
銷毀:只有當小程序進入后台一定時間,或者系統資源占用過高,才會被真正銷毀。此時代表小程序的生命周期結束。
關閉小程序(公共庫版本1.1.0開始支持): 當用戶從掃一掃、轉發等入口(場景值為1007, 1008, 1011, 1025)進入小程序,且沒有置頂小程序的情況下退出,小程序會被銷毀。
示例代碼:
App({ onLaunch: function(){ //啟動時執行的初始化工作 }, onShow: function(){ //小程序從后台進入前台時,觸發執行的操作 }, onHide: function(){ //小程序從前台進入后台時,觸發執行的操作 }, globalData:'I am global data' })
onLaunch, onShow 參數

獲取更多轉發信息
通常開發者希望轉發出去的小程序被二次打開的時候能夠獲取到一些信息,例如群的標識。現在通過調用 wx.showShareMenu 並且設置 withShareTicket為 true ,當用戶將小程序轉發到任一群聊之后,可以獲取到此次轉發的 shareTicket,此轉發卡片在群聊中被其他用戶打開時,可以在 App.onLaunch() 獲取到另一個 shareTicket。這兩步獲取到的 shareTicket 均可通過 wx.getShareInfo() 接口可以獲取到相同的轉發信息。
微信團隊為開發者提供全局的getApp()函數,可以用來獲取小程序實例。示例如下:
//other.js var app = getApp(); console.log(app.globalData);//I am global data
注意: ♦ App()方法須在app.js中注冊,且不能注冊多個。 ♦ 不要再定義App()內的函數中調用getApp(),使用this就可以拿到App實例。
♦ 通過getApp()獲取實例之后,不要私自調用生命周期函數。
注冊頁面:Page()方法
在邏輯層,Page()方法用來注冊一個頁面。Page()接受一個object參數,用於指定頁面的初始數據、生命周期函數、事件處理函數等。Page()方法每個頁面有且僅有一個,存在於該頁面的.js文件中。

示例代碼:
Page({ Data: { Text: 'This is page data.' }, onLoad: function (options) { //頁面加載時執行的初始化工作 }, onReady: function () { //頁面就緒后觸發執行的操作 }, onShow: function () { //頁面打開時,觸發執行的操作 }, onHide: function () { //頁面隱藏時,觸發執行的操作 }, onUnload: function () { //頁面關閉時,觸發執行的操作 }, onPullDownRefresh: function(){ //用戶在頁面下拉時執行的操作 }, onReachBottom: function(){ //到達頁面底部時執行的操作 }, //Event Handler viewTap: function () { this.setData({ text: 'set some data for updating view.' }) }, })
注意:
♦ 不要在 onLaunch 的時候調用 getCurrentPages(),此時 page 還沒有生成。
初始化數據
初始化數據將作為頁面的第一次渲染。對象data將會以JSON的形式由邏輯層傳至視圖層,所以其數據必須是可以轉成JSON的格式:字符串、數字、布爾值、對象、數組。視圖層可以通過WXML對數據進行綁定。
<!--demo.wxml--> <view>{{text}}</view> <view>{{array[0].msg}}</view>
//demo.js Page({ /** * 頁面的初始數據 */ data: { text: 'init data', array: [{msg:'1'},{msg:'2'}] } })
頁面的生命周期

生命周期包括onLoad、onShow、onReady、onHide、onUnload。
onload:頁面加載時執行的初始化操作:
♦ 一個頁面只會調用一次。
♦ 參數可以獲取wx.navigateTo和wx.redirectTo及<navigator/>中的query。
onShow:頁面顯示時執行的操作。每次打開頁面都會調用一次。
onReady:頁面初次渲染完成時執行的操作。
♦ 一個頁面只會調用一次,代表頁面已經准備妥當,可以和視圖層進行交互。
♦ 對頁面的設置(如wx.setNavigationBarTitle)在onReady之后設置。
onHide:頁面隱藏時執行的操作。當navigateTo或底部進行tab切換時調用。
onUnload:頁面卸載時執行的操作。當進行redirectTo或navigateBack操作時調用。
頁面相關事件處理函數
onPullDownRefresh:下拉刷新時執行的操作。
♦ 監聽用戶下拉刷新事件。
♦ 需要在config的window選項中開啟enablePullDownRefresh。
♦ 處理完數據刷新后,wx.stopPullDownRefresh可以停止當前頁面的下拉刷新。
事件處理函數
除了初始化數據和生命周期函數,Page()方法中可以定義一些特殊的函數:事件處理函數。在視圖層通過對組件加入事件綁定,當滿足事件時,就會執行Page()中定義的事件處理函數。
//<!--wxml--> //綁定viwTap事件到view組件 <view bindtap="viewTap"> Click Me </view>
//page.js Page({ //定義一個viewTap事件處理函數 viewTap:function(){ console.log('view tap') } })
頁面棧及其實例獲取
框架以棧的形式維護了當前的所有頁面。 當發生路由切換的時候,頁面棧的表現如下:

getCurrentPages()函數用於獲取當前頁面棧的實例,以數組的形式按棧的順序給出第一個元素為首頁,最后一個元素為當前頁面。
注:不要嘗試修改頁面棧,會導致路由以及頁面狀態錯誤。
頁面的路由
在小程序中,所有頁面的路由全部都由框架進行管理,對於路由的觸發方式以及頁面生命周期見下表:

Tab 切換對應的生命周期(以 A、B 頁面為 Tabbar 頁面,C 是從 A 頁面打開的頁面,D 頁面是從 C 頁面打開的頁面為例):

模塊及調用
文件作用域
在頁面的JavaScript(.js)腳本文件中聲明的變量和函數只在該文件中有效;不同的文件中可以聲明相同名字的變量和函數,不會相互影響。
通過全局函數getApp()可以獲取全局的應用實例,如果需要全局的數據可以在App()中設置。
//app.js App({ globalData:1 }) //a.js //變量localValue只在a.js文件中有效 var localValue = 'a' //獲取App實例 var app = getApp() //獲取全局數據值並修改 app.globalData++ //b.js //可以在b.js文件中重新定義變量localValue,這並不會影響 a.js文件中的localValue var localValue = 'b' //若a.js在b.js之前運行,那么這里的globalData就應是2 console.log(getApp().globalData)
模塊化
可以將一些公共的代碼抽離成為一個單獨的js腳本文件,作為一個模塊。
注:模塊只有通過module.exports才能對外暴露接口以供其他.js文件引入使用。
示例代碼:
//common.js function sayHello(name){ console.log('Hello' + name + '!') } module.exports = { sayHello:sayHello }
在需要使用這些模塊的.js文件中,使用require(path)將公共代碼引入。
示例代碼:
//call.js var common = require('common.js') Page({ helloMINA:function(){ common.sayHello('MINA') } })
