小程序开发总结

随着小程序的接口。公司在考虑到快速开发,果断决定开发小程序。总体而言,开发难度比较简单, 与流行的mvvm类似,开发只专注数据层,不关注DOM上手比较快。期间也踩了一些坑,记录了下来。

小程序的生命周期

生命周期

路由注意事项

  • navigateTo, redirectTo 只能打开非 tabBar 页面。
  • switchTab 只能打开 tabBar 页面。
  • reLaunch 可以打开任意页面。
  • 页面底部的 tabBar 由页面决定,即只要是定义为 tabBar 的页面,底部都有 tabBar
  • 调用页面路由带的参数可以在目标页面的onLoad中获取。

wxss

  • 单位:rpx
  • 建议: 开发微信小程序时设计师可以用 iPhone6 作为视觉稿的标准。 注意: 在较小的屏幕上不可避免的会有一些毛刺,请在开发时尽量避免这种情况。
  • 支持的选择器:id, class,element, element, element, ::after, ::before

运行机制

小程序没有重启的概念
当小程序进入后台,客户端会维持一段时间的运行状态,超过一定时间后(目前是5分钟)会被微信主动销毁
置顶的小程序不会被微信主动销毁
当收到系统内存告警也会进行小程序的销毁

代码包限制

2M大小

及时清理没有使用到的代码和资源

目前小程序打包是会将工程下所有文件都打入代码包内,也就是说,这些没有被实际使用到的库文件和资源也会被打入到代码包里,从而影响到整体代码包的大小。

组件列表

视图容器

  • view
  • scroll-view
  • swiper

基础内容

  • icon
  • text
  • progress

表单

  • button
  • form
  • input
  • checkbox
  • radio
  • picker
  • picker-view
  • slider
  • switch
  • label

导航

  • navigator

多媒体

  • audio
  • image
  • video

客服

  • contact-button

code 换取 session_key

这是一个 HTTPS 接口,开发者服务器使用登录凭证 code 获取 session_keyopenid。其中 session_key 是对用户数据进行加密签名的密钥。为了自身应用安全,session_key 不应该在网络上传输。

用户信息

调用wx.getUserInfo获取userInfo

1
2
3
4
5
6
7
8
9
{
"nickName": "hehe",
"gender": 1,
"language": "zh_CN",
"city": "Guangzhou",
"province": "Shenzhen",
"country": "CN",
"avatarUrl": "https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLRHCyHSM8EiavGbVY61wSvkmnOsWkWzJxjwgss7Aqa5hDZIougu9X3iauCOY9agh7iamNYRZAG81rxg/0"
}

wx.chooseAddress调起收货地址原生界面,并在编辑完成后返回选择的地址:

1
2
3
4
5
6
7
8
cityName:"广州市"
countyName:"天河区"
detailInfo:"某巷某号"
nationalCode:"510630"
postalCode:"510000"
provinceName:"广东省"
telNumber:"13590452513"
userName:"张三"

wx.login(OBJECT)

调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)。用户数据的加解密通讯需要依赖会话密钥完成。

img

wx.checkSession(OBJECT)

通过上述接口获得的用户登录态拥有一定的时效性。用户越久未使用小程序,用户登录态越有可能失效。反之如果用户一直在使用小程序,则用户登录态一直保持有效。具体时效逻辑由微信维护,对开发者透明。开发者只需要调用wx.checkSession接口检测当前用户登录态是否有效。登录态过期后开发者可以再调用wx.login获取新的用户登录态。

wx.requestPayment(OBJECT)

1
2
3
4
5
6
7
8
9
10
11
wx.requestPayment({
'timeStamp': '',
'nonceStr': '', // 随机32以下字符串
'package': '', //统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*
'signType': 'MD5',
'paySign': '', //签名
'success':function(res){
},
'fail':function(res){
}
})

img

后端模板下发过程:

1.用AppID,secret调用接口获取access_token

2.调用接口发送模板消息, POST的参数如下:

1
2
3
4
5
6
7
8
{
"touser": "OPENID", // 接受者的用户ID
"template_id": "TEMPLATE_ID",
"page": "index", // 模板卡片跳转的小程序页面
"form_id": "FORMID", // 表单提交场景下,为 submit 事件带上的 formId;支付场景下,为本次支付的
"prepay_id": 1223,
"data": {} // 模板内容
}

wx.navigateTo无法打开页面

一个应用同时只能打开5个页面,当已经打开了5个页面之后,wx.navigateTo不能正常打开新页面。请避免多层级的交互方式,或者使用wx.redirectTo

字体规范

微信内字体的使用与所运行的系统字体保持一致,常用字号为20, 18, 17, 16,14 13, 11(pt),使用场景具体如下:

工作中问题总结

展开符号...只能用于数组,暂时不能用于对象

target 与 currentTarget

  • target: 触发事件的源组件
  • currentTarget: 事件绑定的当前组件。

setData() 参数格式

setData 函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的 this.data 的值(同步)。

接受一个对象,以 key,value 的形式表示将 this.data 中的 key 对应的值改变成 value。

其中 key 可以非常灵活,以数据路径的形式给出,如 array[2].message,a.b.c.d,并且不需要在 this.data 中预先定义。

注意:

  1. 直接修改 this.data 而不调用 this.setData 是无法改变页面的状态的,还会造成数据不一致
  2. 仅支持设置可 JSON 化的数据
  3. 单次设置的数据不能超过1024kB,请尽量避免一次设置过多的数据。
  4. 请不要把 data 中任何一项的 value 设为 undefined ,否则这一项将不被设置并可能遗留一些潜在问题。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!--index.wxml-->
<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'
}
},
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'
})
}
})

onLoad 与 onShow

  • onLoad: 一个页面只会调用一次,可以在 onLoad 中获取打开当前页面所调用的 query 参数。(注意一个路由query不一样,认为是两个页面,onLoad也会调用)
  • onShow: 每次打开页面都会调用一次