上拉加载与下拉刷新

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
page页面json中:
"enablePullDownRefresh": true


page页面js中有这两个函数:

/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function() {
this.setData({
playlist: []
})
this._getPlaylist()
},

/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function() {
this._getPlaylist()
},



下拉刷新请求完数据后
wx.stopPullDownRefresh() // 停止下拉刷新动画

云函数路由优化 tcb-router

一个用户在一个云环境只能创建 50 个云函数

假如小程序非常复杂,50 个云函数不能够满足业务需求怎么办?

相似的请求归类到同一个云函数处理

tcb-router 是一个 koa 风格的云函数路由库

通俗理解就是可以把很多个接口归类到同一个云函数内。

github-tcb-router: https://github.com/TencentCloudBase/tcb-router

koa 洋葱模型…

安装:

1
2
在使用到tcb-router的云函数目录下打开命令行,输入命令进行安装
npm install --save tcb-router
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// 云函数的 index.js
const TcbRouter = require('router'); // 必需

exports.main = (event, context) => {
const app = new TcbRouter({ event });// 必需

// app.use 表示该中间件会适用于所有的路由(全局中间件) 非必需
app.use(async (ctx, next) => { // 这个中间件表示所有路由都会调用到,而路由中间件为单独调用
ctx.data = {}; // 获取要传给小程序端的数据
ctx.data.openId = event.userInfo.openId // 这里获取到的openId将分布到所有路由
await next(); // 执行下一中间件
});

// 路由为数组表示,该中间件适用于 user 和 timer 两个路由
app.router(['user', 'timer'], async (ctx, next) => {
ctx.data.company = 'Tencent'; // 这里获取到的数据将分布到 user 和 timer 两个路由
await next(); // 执行下一中间件
});

// 路由为字符串,该中间件只适用于 user 路由
app.router('user', async (ctx, next) => {
ctx.data.name = 'heyli'; // 获取要传给小程序端的数据
await next(); // 执行下一中间件
}, async (ctx, next) => {
ctx.data.sex = 'male'; // 获取要传给小程序端的数据
await next(); // 执行下一中间件
}, async (ctx) => {
ctx.data.city = 'Foshan'; // 获取要传给小程序端的数据
// ctx.body 返回数据到小程序端
ctx.body = { code: 0, data: ctx.data}; // 要传给小程序端的数据
});

// 路由为字符串,该中间件只适用于 timer 路由
app.router('timer', async (ctx, next) => {
ctx.data.name = 'flytam';
await next(); // 执行下一中间件
}, async (ctx, next) => {
ctx.data.sex = await new Promise(resolve => {
// 等待500ms,再执行下一中间件
setTimeout(() => {
resolve('male');
}, 500);
});
await next(); // 执行下一中间件
}, async (ctx)=> {
ctx.data.city = 'Taishan';

// ctx.body 返回数据到小程序端
ctx.body = { code: 0, data: ctx.data };
});

return app.serve(); // 必需

}


小程序端:

// 调用名为 router 的云函数,路由名为 user
wx.cloud.callFunction({
// 要调用的云函数名称
name: "router",
// 传递给云函数的参数
data: {
$url: "user", // 要调用的路由的路径,传入准确路径或者通配符*
other: "xxx"
}
}).then((res) => {
console.log(res)
})

上面 tcb-router 代码会按照洋葱模型执行,即先从上往下逐个进入中间件,再从下往上逐个退出中间件。

本地存储(缓存)

1
2
3
4
5
6
7
// 存储:
wx.setStorageSync(key, data); // 同步存储(存储成功再继续下一步操作)
wx.setStorage(key, data); // 异步存储(即使存储没成功也会执行下一步代码)、

// 读取:
wx.getStorageSync(key); // 同步 (读取到数据在进行下一步操作)
wx.setStorage(key); // 异步

api 设置 title

1
2
3
wx.setNavigationBarTitle({
title: "",
});

背景播放音

BackgroundAudioManager 全局唯一的背景音频管理器

1
2
3
// 需要在app.json配置,才能使用后台音乐播放的能力

"requiredBackgroundModes": ["audio", "location"]
1
2
3
4
5
// 获取全局唯一的背景音频管理器
const backgroundAudioManager = wx.getBackgroundAudioManager();

backgroundAudioManager.src = 音频链接;
backgroundAudioManager.title = 音频标题;