This repository has been archived by the owner on Mar 13, 2023. It is now read-only.
/
extend-globalData.js
86 lines (75 loc) · 2.53 KB
/
extend-globalData.js
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// 将app.globalData注入到所有页面的data.$globalData中
// 并提供this.$globalSetData的方法修改 globalData
let appInstance = null;
// 本来应该以symbol类型作为key避免冲突,但是小程序不支持,只能直接用字符串类型了
// let $globalSetDataArray = Symbol('$globalSetDataArray')
let $globalSetDataArray = '$globalSetDataArray'
export default {
App: {
onLaunch() {
appInstance = this
},
$globalSetData(o) {
const pages = getCurrentPages();
if (pages.length === 0) {
// 如果还没有页面实例化,把 globalSetData 的数据暂存起来
this[$globalSetDataArray].push(o);
} else {
// 如果已经有实例化的页面,直接对前台页面 globalSetData
pages[pages.length - 1].$globalSetData(o);
}
},
// 在还没有实例化的页面时用于暂存
[$globalSetDataArray]: [],
},
Page: {
onLoad() {
this.setData({
$globalData: appInstance.globalData
})
// 保证在页面未创建时进行 $globalSetData 也能影响到所有页面
appInstance[$globalSetDataArray].forEach(obj => {
this.$globalSetData(obj);
});
appInstance[$globalSetDataArray] = [];
},
// 根据小程序文档中描述,所有非显示的页面都不应当调用setData
// 这里使用一个 $globalSetDataArray 数组暂存在页面显示时需要更新的data
// 在页面onShow时才调用setData进行更新
onShow() {
this[$globalSetDataArray].forEach(obj => {
this.setData(obj);
});
this[$globalSetDataArray] = [];
},
[$globalSetDataArray]: [],
$globalSetData(o) {
// 所有页面setData所用的object
let obj = {};
for (let key in o) {
obj['$globalData.' + key] = o[key]
}
// 对当前页面堆中的所有页面进行操作
const currentPages = this.$getCurrentPages()
for (const pagePath in currentPages) {
const pageItem = currentPages[pagePath]
// 直接调用前台页面的setData
if (pageItem.__route__ === this.__route__) {
pageItem.setData(obj)
// 更新 app.globalData 的值
appInstance.globalData = deepCopyData(pageItem.data.$globalData)
}
// 后台页面暂存到数组中
else {
pageItem[$globalSetDataArray].push(obj)
}
}
}
}
}
/**
* 用于data的深拷贝,不可用于函数、时间、正则等
*/
function deepCopyData(o) {
return JSON.parse(JSON.stringify(o))
}