当前位置:网站首页>微信小程序 - 全局监听globalData的某个属性变化,例如监听网络状态切换
微信小程序 - 全局监听globalData的某个属性变化,例如监听网络状态切换
2022-06-23 05:18:00 【与BUG战斗的小绵羊】
前言
近日公司小程序项目中有个需求,商品列表页及商品详情页配置视频,视频在WiFi环境下自动播放,非WiFi环境下暂停播放。
一、小程序有获取网络类型的API
wx.getNetworkType(Object object)
先获取到当前网络环境是否是WiFi
//app.js
App({
onLaunch: function() {
wx.getNetworkType({
success: function (res) {
if (res.networkType == 'wifi') {
that.globalData.isWifi = true
}
}
})
},
globalData: {
isWifi: false
}
})
在商品列表页,获取到当前isWifi的属性值
// goods_list.js
var app = getApp()
Page({
data: {
// 是否是wifi环境
isWifi: false
},
onLoad: function(options) {
this.setData({
isWifi: app.globalData.isWifi
});
}
})
然而进行网络切换时,商品列表页获取到的当前网络状态不会发生任何改变。
二、微信小程序提供了监听网络状态变化事件
wx.onNetworkStatusChange(function callback)
我们可以使用该事件监听到网络切换变化
wx.onNetworkStatusChange((res) => {
if (res.networkType == 'wifi') {
that.globalData.isWifi = true
} else {
that.globalData.isWifi = false
}
});
这时,网络状态切换便可以监听到了,但是app.js中isWifi属性变化改变,商品列表页值并不会随之改变,要怎么办呢。
三、使用Object.defineProperty()监听属性全局更改
回想下vue实现数据双向绑定原理:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应监听回调。
// 监听网络状态变化
setWatching: function (key,method) {
let obj = this.globalData;
//加个前缀生成隐藏变量,防止死循环发生
let ori = obj[key]; //obj[key]这个不能放在Object.defineProperty里
if (ori){
//处理已经声明的变量,绑定处理
method(ori);
}
Object.defineProperty(obj, key, {
configurable: true, // 属性是否可以被删除或者可否被重新定义特性
enumerable: true, // 是否可以被枚举,简单讲就是在使用Object.keys()时,是否能拿到键值
set: function (value) {
this['_' + key] = value;
method(value); //数据有变化的时候回调函数,实现同步功能
},
get: function () {
// 在其他界面调用key值的时候,这里就会执行。
if (typeof this['_' + key] == 'undefined'){
if(ori) {
//这里读取数据的时候隐藏变量和 globalData设置不一样,所以要做同步处理
this['_' + key] = ori;
return ori;
} else {
return undefined;
}
} else {
return this['_' + key];
}
}
})
}
最后修改下,商品列表页获取isWifi属性的方法
// 监听网络状态变化
app.setWatching('isWifi', (v)=>{
this.setData({
isWifi: app.globalData.isWifi
});
});
现在随意切换网络,在商品列表页便可以监听到了。
完。
边栏推荐
- Xray linkage crawlergo automatic scanning pit climbing record
- 百度URL参数之LINK?URL参数加密解密研究(代码实例)
- haas506 2.0开发教程-sntp(仅支持2.2以上版本)
- 同步开关电源降低EMI布局 dv/dt di/dt
- C语言 踩坑:文档编码错误,导致base64中文编码错误
- Word pattern for leetcode topic analysis
- haas506 2.0开发教程-hota(仅支持2.2以上版本)
- 解析创客教育中的造物原理
- 【已解决】“The Unity environment took too long to respond. Make sure that :\n“
- Laravel log channel grouping configuration
猜你喜欢

Day_04 传智健康项目-预约管理-套餐管理
Link of Baidu URL parameter? Research on URL parameter encryption and decryption (code example)

haas506 2.0开发教程-hota(仅支持2.2以上版本)

记一次GLIB2.14升级GLIB2.18的记录以及其中的步骤原理

haas506 2.0开发教程-高级组件库-modem.sms(仅支持2.2以上版本)

Day_03 传智健康项目-预约管理-检查组管理

QT creator builds osgearth environment (osgqt msvc2017)

Microsoft interview question: creases in origami printing

RF content learning

haas506 2.0開發教程-高級組件庫-modem.sms(僅支持2.2以上版本)
随机推荐
MySQL ON DUPLICATE KEY 和 PgSQL ON CONFLICT(主键) 处理主键冲突
常见设置模式(抽象工厂&责任链模式&观察者模式)
RF content learning
Synchronous switching power supply reduces EMI layout dv/dt di/dt
English语法_副词 - ever / once
光谱共焦的测量原理及厚度测量模式
C语言去除字符串尾部的换行(或其他字符)
js创建数组(元素都是对象)
How to batch produce QR codes that can be read online after scanning
Leetcode topic resolution single number II
Day_09 传智健康项目-移动端开发-手机快速登录、权限控制
The central network and Information Technology Commission issued the National Informatization Plan for the 14th five year plan, and the network security market entered a period of rapid growth
Index - MySQL
Basic RF theory (DB)
Vs+qt project transferred to QT Creator
Xray linkage crawlergo automatic scanning pit climbing record
phpStudy设置301重定向
Day_ 02 smart communication health project - appointment management - inspection item management
haas506 2.0开发教程-高级组件库-modem.sms(仅支持2.2以上版本)
C language obtains second, millisecond, subtle and nanosecond timestamps