使用watch在微信小程序中实现全局状态共享


Posted in Javascript onJune 03, 2019

问题

在之前开发微信小程序的时候,获取用户信息、openid还有地理位置这些信息的时候,都是采用Promise的方式异步获取,但是这样的话在页面和App.js中都获取就可能造成请求重复的问题。

比如为了在每个页面都能获取到这些共享信息,都会选择在App.js中进行获取,然后在页面级进行获取,这两次获取的时间间隔较小时就可能导致前一个请求还未获取到数据,后一个请求就会再次进行获取,这样就产生了两次请求。

还有一个问题就是书写麻烦(虽然也能通过async await简化),比如

onLoad() {
 app.getUserInfo()
 .then(userInfo => {
 
 }).catch(err => { /* 错误处理 */ });
 
 // 如果同时需要userInfo和openid,可能就是如下形式:
 Promise.all([app.getUserInfo(), app.getOpenid()])
 .then(res => {
 
 }).catch(err => { /* 错误处理 */ });
}

正好周末的时候突然想到了vue的watch语法,利用一些相关的知识,就可以解决这个麻烦的问题了。

解决思路

双向绑定

vue的双向绑定原理,3.0将会采用Proxy监听数据变化,不过考虑到小程序这边的Proxy兼容性我不知道,所以采用了2.0的Object.defineProperty来监听数据的变化。

主要还是拦截设置的操作,在进行赋值时,将新旧值通知至监听者。

观察者模式

在页面级的onLoad监听app.globalData各个键名的事件,而在app.js的onLoad中则使用Object.defineProperty重新定义app.globalData,这样一旦app.globalData相应的键值发生了变化,就会通知监听的页面该值发生了变化。

模块化的引用

观察者模式导出的是一个对象(类实例),而不是一个类,所以在导入的时候这个对象是共享的,就可以通过这个对象将app.js和其他页面联系起来。

至于模块加载的实质,ES6模块加载的机制,与CommonJS模块完全不同。感兴趣的可以去看看这个。

封装Page

小程序的Page函数本身是不支持watch,但是我们可以自定义一个函数,进行参数合并就可以了。

在页面onLoad时先遍历watch属性,对app.globalData进行监听,可以参考vue的watch用法。

页面onUnload时就会进行销毁,此时也应该取消监听,这些我都封装过了,不用手动处理了。

有了这些思路,用不了多久,一个雏形就出来了,经过手动测试,感觉没什么问题,我就发布到npm了,大家感兴趣的可以安装体验一下。

安装

npm i wx-watch -S --production

使用

// app.js
var { watchData, } = require('/miniprogram_npm/wx-watch/index.js');

App({
 onLaunch() {
 this.watchData(); /* 监听this.globalData的变化,并触发事件,其他页面监听的值必须在globalData中预先定义,否则无法监听 */
 },
 watchData,
 globalData: {
 userInfo: null,
 }
});

// 其他需要监听globalData的页面.js
var { getPage } = require('../../miniprogram_npm/wx-watch/index.js');
const app = getApp();

/**
 * getPage(页面参数,app) app必传,因为封装的时候访问不到,就只能传参了
*/
getPage({
 watch: {
 userInfo(userInfo, oldUserInfo) {
 console.log(`来自app.glodalData的userInfo`);
 }
 },
 // 其他参数
}, app)

github:  github.com/ma125120/wx…

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Javascript中的isNaN函数使用说明
Nov 10 Javascript
从数据结构分析看:用for each...in 比 for...in 要快些
Apr 17 Javascript
javascript 分号总结及详细介绍
Sep 24 Javascript
js表单登陆验证示例
Oct 19 Javascript
JS实现太极旋转思路分析
Dec 09 Javascript
详解Vue生命周期的示例
Mar 10 Javascript
微信小程序实现皮肤功能(夜间模式)
Jun 18 Javascript
在一般处理程序(ashx)中弹出js提示语
Aug 16 Javascript
Node.js readline模块与util模块的使用
Mar 01 Javascript
JS尾递归的实现方法及代码优化技巧
Jan 19 Javascript
用Golang运行JavaScript的实现示例
Nov 25 Javascript
vue+springboot图片上传和显示的示例代码
Feb 14 Javascript
深入理解JS异步编程-Promise
Jun 03 #Javascript
模块化react-router配置方法详解
Jun 03 #Javascript
react 组件传值的三种方法
Jun 03 #Javascript
angular使用md5,CryptoJS des加密的方法
Jun 03 #Javascript
Node.js 的 GC 机制详解
Jun 03 #Javascript
微信小程序蓝牙连接小票打印机实例代码详解
Jun 03 #Javascript
react-native滑动吸顶效果的实现过程
Jun 03 #Javascript
You might like
PHP邮件专题
2006/10/09 PHP
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
PHP函数按引用传递参数及函数可选参数用法示例
2018/06/04 PHP
在js(jquery)中获得文本框焦点和失去焦点的方法
2012/12/04 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
Jquery中扩展方法extend使用技巧
2014/08/24 Javascript
javascript中数组array及string的方法总结
2014/11/28 Javascript
jQuery.holdReady()方法用法实例
2014/12/27 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
jQuery自定义元素右键点击事件(实现案例)
2017/04/28 jQuery
基于vue实现swipe轮播组件实例代码
2017/05/24 Javascript
微信小程序实现图片放大预览功能
2020/10/22 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
2019/04/14 Javascript
vue+element tabs选项卡分页效果
2020/06/29 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
linux系统使用python监测网络接口获取网络的输入输出
2014/01/15 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
Python入门_浅谈数据结构的4种基本类型
2017/05/16 Python
浅谈python import引入不同路径下的模块
2017/07/11 Python
Django rest framework实现分页的示例
2018/05/24 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
django实现更改数据库某个字段以及字段段内数据
2020/03/31 Python
计算Python Numpy向量之间的欧氏距离实例
2020/05/22 Python
Python jieba结巴分词原理及用法解析
2020/11/05 Python
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
HTML5移动端手机网站开发流程
2016/04/25 HTML / CSS
英国领先的狗和宠物美容专家:Christies Direct
2017/04/03 全球购物
日语专业推荐信
2013/11/12 职场文书
工作中个人的自我评价
2013/12/31 职场文书
社区党建工作汇报材料
2014/08/14 职场文书
庆国庆国旗下讲话稿2014
2014/09/21 职场文书
2014年大学教师工作总结
2014/12/02 职场文书
消防演习感想
2015/08/10 职场文书
人为什么会“幸灾乐祸”?
2019/08/06 职场文书
Vue接口封装的完整步骤记录
2021/05/14 Vue.js