微信小程序全局变量监听实现
直到文章发布的今天,微信小程序官方是没有提供解决方案的!!
这里的解决方案是: 对象代理 Proxy + 事件订阅和发布 vc-subscribe-publish;
结果
可以通过回调函数在任意组件或者页面中监听到globalData中的变化,并且拿到变化前后的两个值
前置工作
- 先安装第三方npm包(这是楼主发布的包,也可以选择其它的),
yarn add vc-subscribe-publish - 小程序开发工具-构建npm
代码部分
- 在app.js中
import PublishSubscribe from 'publish-subscribe-js'
App({
//生命周期钩子
onLaunch() {
this.tempValue = Object.assign({}, this.globalData);
this.proxyData = this.watchGlobalData();
},
//全局变量
globalData: {
userInfo: {} //例子: userInfo 需要被其它组件引用
},
//用于临时存放全局变量的较久数据
tempValue: {},
//将被初始化为对外提供修改接口的Proxy对象
proxyData: null,
/**
* 说明: 对 globalData 进行代理,要修改globalData的值只能通过修改 proxyData来达成目的。
* 而对proxyData的修改会影响到globalData,同时会触发事件的发布
*/
watchGlobalData() {
const app = this;
return new Proxy(this.globalData, {
get (target, property) {
return target[property];
},
set (target, property, value) {
target[property] = value;
const oldValue = app.tempValue[property];
PublishSubscribe.publish(property, {
newValue: value,
oldValue
})
app.tempValue[property] = value;
return true
}
})
},
})
- 修改globalData
const app = getApp(); // getApp是小程序内置方法
//例子:对globalData(ProxyData)里的属性 userInfo 进行修改
app.proxyData?.userInfo = {
name: 'Vencent Lum',
age: 25
}
- 读取globalData
import PublishSubscribe from 'publish-subscribe-js'
Page({ //或Component
data: {
// 当订阅慢于消息发布时,此时 userInfo 已是最新数据
dataSource: getApp().proxyData?.userInfo //例子: 对 userInfo 进行监听
},
onLoad() {
PublishSubscribe.subscribe('userInfo', ({
newValue,
oldValue
}) => {
this.setData({
dataSource: newValue
})
})
}
})
posted on 2022-05-31 15:04 Vencent_Lum-9527 阅读(1026) 评论(1) 收藏 举报
浙公网安备 33010602011771号