微信小程序 - 全局监听globalData的某个属性变化,例如监听网络状态切换
前言
近日公司小程序项目中有个需求,商品列表页及商品详情页配置视频,视频在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.jsvar 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});
});
现在随意切换网络,在商品列表页便可以监听到了。
完。
微信小程序 - 全局监听globalData的某个属性变化,例如监听网络状态切换相关推荐
- 微信小程序----全局状态管理 (便于全局埋点等操作)
说明 由于我是一个有着一颗玻璃心的博主,导致在2018年后博客很少更新.原因是由于我的分享并没有解决到部分人的问题,而导致被骂了.当时这颗玻璃心就碎了,所以这两年以来很是消极,博客很少更新.这里给那些 ...
- 微信小程序-全局数据共享
微信小程序-全局数据共享MobX 1.开发中常用的数据共享方案 为了解决组件之间的数据共享,开发中常用的数据共享方案有:Vuex/Redux/MobX等 2.小程序中全局数据共享方案-MobX ...
- 微信小程序-------全局通信方案mobx
微信小程序-------全局通信方案mobx 微信小程序本身并没有提供类似于vue中的vuex或者React里的Redux这样的全局通信方案,只在组件中有behaviors这样的属性共享机制,用起来也 ...
- 逆战之微信小程序全局配置
微信小程序之全局配置-1 小程序的配置分为全局配置.页面配置及sitemap 配置 全局配置 小程序根目录下的 app.json 文件用来对微信小程序进行全局配置.文件内容为一个 JSON 对象,有以 ...
- php小程序开发实例,微信小程序全局配置开发实例
本文主要和大家分享微信小程序全局配置开发实例,主要以代码的形式和大家分享,希望能帮助到大家. 一.app.json 使用app.json文件来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设 ...
- 微信小程序全局路由拦截
前言 略 微信小程序全局路由拦截方法1 目前微信小程序没有全局路由拦截.要想实现全局路由拦截,需要自己进行扩充.具体参考这里:微信小程序–路由拦截器. 实现思路: 替换Page的参数对象的onShow ...
- 微信小程序 全局路由拦截
1. 微信小程序 全局路由拦截 // utils/filter.js function loginCheck(pageObj) {if (pageObj.onLoad) {let _onLoad = ...
- 微信小程序全局配置文件app.json中window:backgroundColor“不生效”
那些年我们一起踩过的坑~ 今天说一下微信小程序全局配置文件app.json中window的backgroundColor属性,设置之后发现没效果. 查了资料发现原来这个backgroundColor属 ...
- uniapp实现微信小程序全局【发送给朋友】、【分享到朋友圈】、【复制链接】
在开发微信小程序的时候,发现[发送给朋友].[分享到朋友圈].[复制链接]功能,灰色不可用. 很常见的功能,但是这几个功能,并不是你项目建起来了就有的. 1.[发送给朋友]使用 onShareAppM ...
- 微信小程序全局监听globalData的某个属性变化
前言 近日在开发微信小程序的时候,要将globalData中某个属性的变化要同步到某个页面中. 使用Object.defineProperty()监听属性全局更改 经过上网查询相关资料,参考vue实现 ...
最新文章
- HDU 4035 Maze(树形概率DP)
- 进阶学习(4.2) JVM 常用配置参数, GC 参数
- Prometheus部署监控容器
- 字节跳动被爆商业化部门大量裁员
- OpenShift 4 - 关闭更新MachineConfig后集群节点自动重启功能
- 外虚内实是什么意思_取名|为什么00后那么多梓涵?
- python还是java好找工作_你觉得学 Python 还是 Java 更好找工作?
- as3.0横向渐变发光字
- 单例模式中的饿汉和懒汉模式
- matlabrobert锐化_常用图像锐化MATLAB实现
- php命名空间的设计思想和缺点
- [poj 1741]Tree 点分治
- 计算机桌面黑屏有鼠标,win7系统启动黑屏只有显示鼠标指针怎么办(图文)
- 路由器WIFI密码怎么设置?快速设置,只需1分钟
- python库源码分析_python第三方库Faker源码解读
- 如何ping网站的IP地址
- mktime()函数使用
- java 环境变量 locale_locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
- AD2020库安装及查找库
- 【探花交友】day05—圈子互动
热门文章
- BUU-Crypto-萌萌哒的八戒
- JS(JavaScript)入门设置密码框中点击小眼睛显示隐藏所输入的密码!
- JAVA 小程序支付+服务商分账
- r语言rank降序_R语言速成之第一章 向量(编辑,排序,10个基本函数)
- Arduino单片机控制三相电机正反转
- 台积电3nm晶圆报价超14万/ 罗永浩AR创业公司获3.6亿融资/ 陶哲轩入驻Mastodon…今日更多新鲜事在此...
- 求助-影像组学 for循环连续提取影像受阻
- 苹果和虫子(YZOJ-1058)
- Qt 连接并使用 SQL Sever数据库
- 北理工计算机学院沈建斌,礼欣_北京理工大学计算机学院