支付宝小程序代码结构及组成 (二)

简介: 本节以 IDE 内的 Todo App 模板小程序为例,介绍支付宝小程序的文件结构,以及每种文件类型在小程序中的作用。

本章内容出自《小程序开发不求人》电子书,点击下载完整版

支付宝小程序代码结构及组成

小程序全局结构

概述

App() 代表顶层应用,管理所有页面和全局数据,以及提供生命周期回调等。它也是一个构造方法,生成 App 实例。
一个小程序就是一个 App 实例。
每个小程序顶层一般包含三个文件。

  • app.json:应用配置
  • app.js:应用逻辑
  • app.acss:应用样式(可选)

简单示例

一个简单的 app.json 代码如下:

{
 "pages": [
 "pages/index/index",
 "pages/logs/logs"
 ],
 "window": {
 "defaultTitle": "Demo"
 }
}

这段代码配置指定小程序包含两个页面(index 和 logs),以及应用窗口的默认标题设置为 “Demo”。
一个简单的 app.js 代码如下:

App({
 onLaunch(options) {
 // 第一次打开
 },
 onShow(options) {
 // 小程序启动,或从后台被重新打开
 },
 onHide() {
 // 小程序从前台进入后台
 },
 onError(msg) {
 // 小程序发生脚本错误或 API 调用出现报错
 console.log(msg);
 },
 globalData: {
 // 全局数据
 name: 'alipay',
 },
});

app.json 全局配置

app.json 用于对小程序进行全局配置,设置页面文件的路径、窗口表现、多 tab等。
以下是一个基本配置示例:

{
 "pages": [
 "pages/index/index",
 "pages/logs/index"
 ],
 "window": {
 "defaultTitle": "Demo"
 }
}

完整配置项如下:

image.png

pages

app.json 中的 pages 为数组属性,数组中每一项都是字符串,用于指定小程序的页面。在小程序中新增或删除页面,都需要对 pages 数组进行修改。
pages 数组的每一项代表对应页面的路径信息,其中,第一项代表小程序的首页。
页面路径不需要写任何后缀,框架会自动去加载同名的 .json、.js、.axml、.acss文件。举例来说,如果开发目录为:

├── pages
│ ├──index
│ │ ├── index.json
│ │ ├── index.js
│ │ ├── index.axml
│ │ └── index.acss
│ ├──logs
│ │ ├── logs.json
│ │ ├── logs.js
│ │ └── logs.axml
├── app.json
├── app.js
└── app.acss

app.json 中应当如下配置:

{
 "pages":[
 "pages/index/index",
 "pages/logs/logs"
 ]
}

window

window 用于设置小程序的状态栏、导航条、标题、窗口背景色等。
示例代码:

{
 "window":{
 "defaultTitle": "支付宝接口功能演示"
 }
}
属性 类型 是否必填 描述 最低版本
defaultTitle String 页面默认标题 -
pullRefresh String 是否允许下拉刷新。默认NO, 备注:下拉刷新生效的前提是allowsBounceVertical 值为 YES -
allowsBounceVertical String 是否允许向下拉拽。默认YES, 支持 YES / NO -
transparentTitle String 导航栏透明设置。默认none,支持 always 一直透明 / auto 滑动自适应 /none 不透明 -
titlePenetrate String 是否允许导航栏点击穿透。默认 NO,支持 YES / NO -
showTitleLoading String 是否进入时显示导航栏的loading。默认 NO,支持YES / NO -
titleImage String 导航栏图片地址 -
titleBarColor HexColor 导航栏背景色,十六进制颜色值(0-255) -
backgroundColor HexColor 页面的背景色,十六进制颜色值(0-255) -
backgroundImageColor HexColor 下拉露出显示的背景图底色,十六进制颜色值(0-255) -
backgroundImageUrl String 下拉露出显示的背景图链接 -
gestureBack String iOS 用,是否支持手势返回。默认 NO,支持 YES /NO -
enableScrollBar Boolean Android 用,是否显示WebView 滚动条。默认YES,支持 YES / NO -
onReachBottomDistance Number 页面上拉触底时触发时距离页面底部的距离,单位为px。相关文档页面事件处理函数 1.19.0 ,目前iOS 在page.json 下设置无效,只能全局设置。

tabBar

如果你的小程序是一个多 tab 应用(客户端窗口的底部栏可以切换页面),那么可以通过 tabBar 配置项指定 tab 栏的表现,以及 tab 切换时显示的对应页面。
注意:

  • 通过页面跳转(my.navigateTo)或者页面重定向(my.redirectTo)所到达的页面,即使它是定义在 tabBar 配置中的页面,也不会显示底部的 tab 栏。
  • tabBar 的第一个页面必须是首页。

tabBar 配置项有以下:

image.png

每个 item 配置:

image.png

icon 图标推荐大小为 60×60 px 大小,系统会对传入的非推荐尺寸的图片进行非等比拉伸或缩放。
示例代码:

{
 "tabBar": {
 "textColor": "#dddddd",
 "selectedColor": "#49a9ee",
 "backgroundColor": "#ffffff",
 "items": [
 {
 "pagePath": "pages/index/index",
 "name": "首页"
 },
 {
 "pagePath": "pages/logs/logs",
 "name": "日志"
 }
 ]
 }
}

app.acss 全局样式

app.acss 作为全局样式,作用于当前小程序的所有页面。
ACSS 是一套样式语言,用于描述 AXML 的组件样式,决定 AXML 的组件的显示效果。
为适应广大前端开发者,ACSS 和 CSS 规则完全一致,100% 可以用。同时为更适合开发小程序,对 CSS 进行了扩充。
ACSS 支持 px,rpx,vh,vw 等单位。

rpx

rpx(responsive pixel)可以根据屏幕宽度进行自适应,规定屏幕宽为750rpx。以 Apple iPhone6 为例,屏幕宽度为 375px,共有 750 个物理像素,则 750rpx = 375px = 750 物理像素,1rpx = 0.5px = 1 物理像素。

image.png

样式导入

使用 @import 语句可以导入外联样式表,@import 后需要加上外联样式表相对路径,用;表示结束。
示例代码:

/** button.acss **/
.sm-button {
 padding: 5px;
}
/** app.acss **/
@import "./button.acss";
.md-button {
 padding: 15px;
}

导入路径支持从 node_modules 目录载入第三方模块,例如 page.acss:

@import "./button.acss"; /*相对路径*/
@import "/button.acss"; /*项目绝对路径*/
@import "third-party/page.acss"; /*第三方 npm 包路径*/

内联样式

组件上支持使用 style、class 属性来控制样式。
style 属性
用于接收动态样式,样式在运行时会进行解析。行内样式不支持!important 优先级规则。

<view style="color:{{color}};" />

class 属性
用于接收静态样式,属性值是样式规则中类选择器名(样式类名)的集合,样式类名不需要带上.,多个类名间以空格分隔。请静态样式写进 class 中,避免将静态样式写进 style 中,以免影响渲染速度。

<view class="my-awesome-view" />

选择器

同 CSS3 保持一致。
注意:

  • .a-, .am- 开头的类选择器为系统组件占用,不可使用。
  • 不支持属性选择器。

全局样式与局部样式

  • app.acss 中的样式为全局样式,作用于每一个页面。
  • 页面文件夹内的 .acss 文件中定义的样式为局部样式,只作用在对应的页面,并会覆盖app.acss 中相同的选择器。

本地资源引用

ACSS 文件里的本地资源引用请使用绝对路径的方式,不支持相对路径引用。例如:

/* 支持 */
background-image: url('/images/ant.png');
/* 不支持 */
background-image: url('./images/ant.png');

app.js 注册小程序

App(object: Object)

App() 用于注册小程序,接受一个 Object 作为属性,用来配置小程序的生命周期等。
App() 必须在 app.js 中调用,必须调用且只能调用一次。

object 属性说明

image.png

前台/后台定义:

  • 小程序用户点击右上角关闭,或者按下设备 Home 键离开支付宝时,小程序并不会直接销毁,而是进入后台。
  • 当用户再次进入支付宝或再次打开小程序时,小程序会从后台进入前台。
  • 只有当小程序进入后台 5 分钟后,或占用系统资源过高,才会被真正销毁。

onLaunch(object: Object) 及 onShow(object: Object)

object 属性说明:

属性 类型 描述
query Object 当前小程序的 query,从启动参数的 query字段解析而来
scene number 启动小程序的 场景值
path string 当前小程序的页面地址,从启动参数 page字段解析而来,page 忽略时默认为首页
referrerInfo Object 来源信息

比如,启动小程序的 schema url 如下:

alipays://platformapi/startapp?appId=1999&query=number%3D1&page=x%2Fy%2
Fz
  • 小程序首次启动时,onLaunch 方法可获取 query、path 属性值。
  • 小程序在后台被用 schema 打开,也可从 onShow 方法中获取 query、path 属性值。
App({
 onLaunch(options) {
 // 第一次打开
 console.log(options.query);
 // {number:1}
 console.log(options.path);
 // x/y/z
 },
 onShow(options) {
 // 从后台被 schema 重新打开
 console.log(options.query);
 // {number:1}
 console.log(options.path);
 // x/y/z
 },
});

referrerInfo 子属性说明:

属性 类型 描述 最低版本
appId string 来源小程序 -
sourceServiceId string 来源插件,当处于插件运行模式时可见 1.11.0
extraData Object 来源小程序传过来的数据。 -

注意:

  • 不要在 onShow 中进行 redirectTo 或 navigateTo 等操作页面栈的行为。
  • 不要在 onLaunch 里调用 getCurrentPages(),因为此时 page 还未生成。

onHide()

小程序从前台进入后台时触发 onHide() 。
示例代码:

App({
 onHide() {
 // 进入后台时
 console.log('app hide');
 },
});

onError(error: String)

小程序发生脚本错误时触发。
示例代码:

App({
 onError(error) {
 // 小程序执行出错时
 console.log(error);
 },
});

onShareAppMessage(object: Object)

全局分享配置。当页面未设置 page.onShareAppMessage 时,调用分享会执行全局的分享设置,具体见 分享

globalData 全局数据

App() 中可以设置全局数据 globalData。
示例代码:

// app.js
App({
 globalData: 1
});

getApp 方法

小程序提供了全局的 getApp() 方法,可获取当前小程序实例,一般用于在子页面中获取顶层应用。

var app = getApp();
console.log(app.globalData); // 获取 globalData

使用过程中,请注意以下几点:

  • App() 函数中不可以调用 getApp(),可使用 this 可以获取当前小程序实例。
  • 通过 getApp() 获取实例后,请勿私自调用生命周期回调函数。
  • 请区分全局变量及页面局部变量,比如:
// app.js
App({
 //定义全局变量 globalData,在整个 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,但并不会互相影响,因为各个文件声明的局部变量和函数只在当前文件下有效。

相关文章
|
1月前
|
小程序 Devops 开发工具
支付宝小程序入门学习之一:如何创建支付宝小程序并在手机上预览
支付宝小程序入门学习之一:如何创建支付宝小程序并在手机上预览
30 0
|
2月前
|
存储 小程序 UED
微信小程序代码包限制2M 怎么解决?
微信小程序代码包限制2M 怎么解决?
|
1月前
|
存储 小程序 前端开发
Java代码能搭建小程序
Java代码能搭建小程序
17 0
|
1月前
|
小程序
微信小程序下载代码
微信小程序下载代码
|
2月前
|
移动开发 小程序 API
【每周一个小技巧】支付宝小程序内如何跳转生活号文章
【每周一个小技巧】支付宝小程序内如何跳转生活号文章
89 1
|
2月前
|
缓存 小程序 IDE
【每周一个小技巧】支付宝小程序自定义tabbar效果
【每周一个小技巧】支付宝小程序自定义tabbar效果
46 0
|
2月前
|
小程序 JavaScript 前端开发
【经验分享】如何实现在支付宝小程序内的图片裁剪功能
【经验分享】如何实现在支付宝小程序内的图片裁剪功能
45 1
|
2月前
|
小程序
【经验分享】如何生成支付宝小程序scheme链接
【经验分享】如何生成支付宝小程序scheme链接
147 1
|
2月前
|
移动开发 小程序 JavaScript
【经验分享】记一次支付宝小程序的性能优化
【经验分享】记一次支付宝小程序的性能优化
26 0
|
2月前
|
移动开发 小程序 前端开发
【经验分享】如何实现在支付宝小程序内的骨架屏效果
【经验分享】如何实现在支付宝小程序内的骨架屏效果
29 0

热门文章

最新文章