swan-docs
Version:
398 lines (308 loc) • 12.7 kB
Markdown
---
title: 逻辑层
header: develop
nav: framework
sidebar: app-service
---
介绍
-----
智能小程序的逻辑层由 JavaScript 编写。
逻辑层将数据进行处理后发送给视图层,同时接受视图层的反馈。
在 JavaScript 的基础上,我们提供了一些框架方法。
1、提供了 [App](#注册程序) 和 [Page](#注册页面) 方法
2、提供了 getApp 和 getCurrentPages 方法,分别用来获取 App 实例和当前页面栈
3、提供了丰富的 API ,如扫一扫,ocrIdCard 等智能小程序能力
4、每个页面有独立的 [作用域](#文件作用域) ,并提供 [模块化](#模块化)
5、框架本身并非运行在浏览器中,所以 JavaScript 在 Web 中的一些能力都无法使用,如 document , window 等
6、开发者写的所有代码,最终会被打包成一份 JavaScript ,并在智能小程序启动时运行,直到智能小程序销毁。
注册程序
-----
App()
<div class="notice">解释: </div>App() 函数用来注册一个智能小程序。接受一个 Object 作为参数,用以指定智能小程序的生命周期函数等。
**Object参数说明:**
|属性 |类型 |描述 |触发时机|
|---- | ---- | ---- |---- |
|onLaunch | Function | 生命周期函数-- 监听 SWAN 的初始化 | 当 SWAN 初始化完成时,会触发 onLaunch (全局只触发一次) |
|onShow | Function | 生命周期函数-- 监听 SWAN 的显示 | 当 SWAN 初始化,或从后台进入前台显示,会触发 onShow |
|onHide | Function | 生命周期函数-- 监听 SWAN 的隐藏 | 当 SWAN 从前台进入后台,会触发 onHide |
|其他 | Any | | 开发者可以添加任意的函数或者数据到 Object 参数中, 用 this 可以访问 |
**<div class="notice">前台、后台定义:当用户点击左上角的关闭,或者按了设备的 Home 键离开智能小程序,智能小程序没有直接销毁,而是进入到了后台;当再次进入智能小程序,又会从后台进入前台。需要注意的是:只有当智能小程序进入后台一定时间,或者系统资源占用过高,才会被销毁 </div>**
**<div class="notice">示例: </div>**
```js
App({
onLaunch: function (options) {
// do something when launch
},
onShow: function (options) {
// do something when show
},
onHide: function () {
// do something when hide
},
globalData: 'global data'
});
```
onLaunch,onShow 参数
|字段 |类型 |说明 |
|---- | ---- | ---- |
|scene | Number | 打开智能小程序的场景值 |
getApp()
全局的 getApp() 函数可以用来获取到智能小程序实例。
**<div class="notice">示例: </div>**
```js
var appInstance = getApp()
console.log(appInstance.globalData)
```
**<div class="notice">注意: </div>**
1、App() 必须在 app.js 中注册,且不能注册多个。
2、不要在 App() 内的函数中调用 getApp() 函数,使用 this 就可以拿到 app 实例
3、不要在 onLaunch 中调用 getCurrentPages() ,此时,page 还没有生成
注册页面
-----
### Page()
<div class="notice">解释: </div>Page() 函数用来注册一个页面。接受一个 object 参数,其指定页面的初始数据、生命周期函数、事件处理函数等。
**Object参数说明:**
|属性 |类型 |描述 |
|---- | ---- | ---- |
|data | Object | 页面的初始数据 |
|onLoad | Function | 页面的生命周期函数 -- 监听页面加载 |
|onReady | Function | 页面的生命周期函数 -- 监听页面初次渲染完成 |
|onShow | Function | 页面的生命周期函数 -- 监听页面显示 |
|onHide | Function | 页面的生命周期函数 -- 监听页面隐藏 |
|onUnload | Function | 页面的生命周期函数 -- 监听页面卸载 |
|onPullDownRefresh | Function | 页面的事件处理函数 -- 监听用户下拉动作 |
|onReachBottom | Function | 页面的事件处理函数 -- 上拉触底事件的处理函数 |
|onShareAppMessage | Function | 页面的事件处理函数 -- 用户点击右上角转发 |
|onPageScroll | Function | 页面的事件处理函数 -- 页面滚动触发事件的处理函数 |
|onTabItemTap | Function | 页面的事件处理函数 -- 当前是 tab 页时,点击 tab 时触发 |
|其他 | Any | 开发者可以添加任意的函数或数据到 object 参数中 |
**<div class="notice">示例: </div>**
```js
Page({
data: {
text: 'swan data'
},
onLoad: function (options) {
// do something 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 unload
},
onPullDownRefresh: function () {
// do something when pull down
},
onReachBottom: function () {
// do something when page reach bottom
},
onShareAppMessage: function () {
// return custom share data
},
onPageScroll: function () {
// do something when page scroll
},
onTabItemTap: function (item) {
console.log(item.index);
console.log(item.pagePath);
console.log(item.text);
},
customData: {}
});
```
### 初始化数据
<div class="notice">解释: </div>
初始化数据将作为页面的第一次渲染。data 将会以 JSON 的形式由逻辑层传至渲染层,所以其数据必须是可以转成 JSON 的格式:字符串,数字,布尔值,对象,数组。
渲染层,通过SWAN模板,对数据进行绑定。
**<div class="notice">示例: </div>**
```js
Page({
data: {
name: 'swan'
}
});
```
```js
<view>{{name}}</view>
```
### 生命周期函数
1、onLoad:页面加载
一个页面只会调用一次,可以在 onLoad 中获取打开当前页面所调用的 query 参数。
2、onShow:页面显示
每次打开页面都会调用一次。
3、onReady:页面初次渲染完成
一个页面只会调用一次,代表页面已经准备妥当,可以和视图层进行交互。
对界面的设置如:swan.setNavigationBarTitle 请在onReady之后设置。
4、onHide:页面隐藏
当 navigateTo 或底部 tab 切换时或Home键离开智能小程序时调用。
5、onUnload:页面卸载
当 redirectTo 或 navigateBack 的时候调用。
### 页面相关事件处理函数
1、onPullDownRefresh: 下拉刷新
监听用户下拉刷新事件。
需要在 app.json 的 window 选项中或页面配置中开启 enablePullDownRefresh 。
当处理完数据刷新后,swan.stopPullDownRefresh 可以停止当前页面的下拉刷新。
2、onReachBottom: 上拉触底
监听用户上拉触底事件。
可以在 app.json 的 window 选项中或页面配置中设置触发距离 onReachBottomDistance 。
在触发距离内滑动期间,本事件只会被触发一次。
3、onPageScroll:页面滚动
监听用户滑动页面事件。
参数为 Object,包含以下字段:
**Object参数说明:**
|字段 |类型 |说明 |
|---- | ---- | ---- |
|scrollTop|Number|页面在垂直方向已滚动的距离(单位px)|
4、onShareAppMessage:用户点击分享
用户点击转发按钮的时候会调用
此事件需要 return 一个 Object,用于自定义转发内容
** 自定义转发字段 **
|字段 |类型 |说明 |默认值 |
|---- | ---- | ---- | ---- |
|title |string | 转发标题 |当前的智能小程序的名称 |
|path |string | 转发路径 |当前页面 path ,必须是以 / 开头的完整路径 |
**<div class="notice">示例: </div>**
```js
Page({
onShareAppMessage: function () {
return {
title: '标题',
path: '/pages/path/path'
}
}
});
```
### 事件处理函数
<div class="notice">解释: </div>
除了初始化数据和生命周期函数,Page 中还可以定义一些特殊的函数:事件处理函数。在渲染层可以在组件中加入事件绑定,当达到触发事件时,就会执行 Page 中定义的事件处理函数。
**<div class="notice">示例: </div>**
```xml
<view bindtap="tap"> tap </view>
```
```js
Page({
tap: function() {
console.log('tap')
}
})
```
### Page.prototype.setData()
<div class="notice">解释: </div>
setData 函数,用于将数据,从逻辑层发送到视图层,当开发者调用 setData 后,数据的变化,会引起视图层的更新。
**<div class="notice">示例: </div>**
```xml
<view>{{name}}</view>
<view bindtap="tap">{{age}}</view>
```
```js
Page({
data: {
name: '',
age: 0
},
tap: function () {
this.setData({'age', 1});
}
});
```
页面路由
-----
<div class="notice">解释: </div>
在智能小程序中所有页面的路由全部由框架进行管理。
### 页面栈
<div class="notice">解释: </div>
框架以栈的形式维护了当前的所有页面。 当发生路由切换的时候,页面栈的表现如下:
** 页面栈 **
|路由方式 |页面栈表现 |
|---- | ---- |
|初始化 |新页面入栈 |
|打开新页面 |新页面入栈 |
|页面重定向 |当前页面出栈,新页面入栈 |
|页面返回 |页面出栈 |
|Tab 切换 |页面全部出栈,只留下初始的 Tab 页面 |
|重加载 |页面全部出栈,只留下新的页面 |
### getCurrentPages()
<div class="notice">解释: </div>
getCurrentPages() 函数用于获取当前页面栈的实例,以数组形式按栈的顺序给出,第一个元素为首页,最后一个元素为当前页面。
**<div class="notice">注意: </div>不要尝试修改页面栈,会导致路由以及页面状态错误。**
### 路由方式
对于路由的触发方式以及页面生命周期函数如下:
** 生命周期函数 **
|路由方式 |触发时机 |路由前页面触发事件 |路由后页面触发事件 |
|---- | ---- | ---- | ---- |
|初始化 |智能小程序打开的第一个页面 | |onLoad, onShow |
|打开新页面 |调用 API swan.navigateTo 或使用组件 <navigator open-type="navigateTo"/> | onHide |onLoad, onShow |
|页面重定向 |调用 API swan.redirectTo 或使用组件 <navigator open-type="redirectTo"/> | onUnload |onLoad, onShow |
|页面返回 |调用 API swan.navigateBack 或使用组件<navigator open-type="navigateBack">或用户按左上角返回按钮 | onUnload |onShow |
|Tab 切换 |调用 API swan.switchTab 或使用组件 <navigator open-type="switchTab"/> 或用户切换 Tab | | |
|重新启动 |调用 API swan.reLaunch 或使用组件 <navigator open-type="reLaunch"/> | onUnload | onLoad, onShow |
Tab 切换对应的生命周期(以 A、B 页面为 Tabbar 页面,C 是从 A 页面打开的页面,D 页面是从 C 页面打开的页面为例):
** 生命周期函数详解 **
|当前页面 |路由后页面 |触发的生命周期 |
|---- | ---- | ---- | ---- |
|A|A|Nothing happend|
|A|B|A.onHide(), B.onLoad(), B.onShow()|
|A|B(再次打开)| A.onHide(), B.onShow()|
|C|A|C.onUnload(), A.onShow()|
|C|B|C.onUnload(), B.onLoad(), B.onShow()|
|D|B|D.onUnload(), C.onUnload(), B.onLoad(), B.onShow()|
**<div class="notice">注意: </div>**
1、navigateTo, redirectTo 只能打开非 tabBar 页面。
2、switchTab 只能打开 tabBar 页面。
3、reLaunch 可以打开任意页面。
4、页面底部的 tabBar 由页面决定,即只要是定义为 tabBar 的页面,底部都有 tabBar。
5、调用页面路由带的参数可以在目标页面的 onLoad 中获取。
### 文件作用域
<div class="notice">解释: </div>
在 JavaScript 文件中声明的变量和函数只在该文件中有效;不同的文件中可以声明相同名字的变量和函数,不会互相影响。
通过全局函数 getApp() 可以获取全局的应用实例,如果需要全局的数据可以在 App() 中设置
**<div class="notice">示例: </div>**
```js
// app.js
App({
data: 1
});
```
```js
// page.js
var app = getApp();
app.data++;
```
```js
// page2.js
var app = getApp();
console.log(app.data);
// 2
```
### 模块化
<div class="notice">解释: </div>
可以将一些公共的代码抽离成为一个单独的 js 文件,作为一个模块。模块只有通过 module.exports 或者 exports 才能对外暴露接口。
```js
// utils.js
var name = 'swan';
var age = 0;
function logName() {
console.log(name);
}
function logAge() {
console.log(age);
}
module.exports.logName = logName;
module.exports.logAge = logAge;
```
可以在需要使用这些模块的文件中,对模块进行引用:
```js
var utils = require('./utils');
Page({
onLoad: function () {
utils.logName();
}
});
```