浅谈小程序globalData的那些事儿


Posted in Javascript onNovember 01, 2019

我在严冬下掘起结冰的泥土,我在黑暗的战壕里跃动,我用生命守护房屋的石板,我在散发着焦土味的废墟下长眠。

小程序中,除了每个页面有自己的 data,还有个全局数据存储地方:globalData,获取方式如下:

let globalData = getApp().globalData

实际业务代码中总会遇到这种情况:写着写着发现需要用全局数据,但是不能直接就在当前函数里直接写上面的一段代码,因为要和别的函数共用,所以返回 js 文件顶部添加一段代码,再返回刚刚断掉的地方继续写,类似这样:

// 省略12行
let globalData = getApp().globalData
// 省略15行
Page({
 data: { ... }
 //.. 省略863行
 onButtonTap(e) {
  // ...
  let myData = globalData.myData
  // ...
 }
})

经过这么一折腾,可能刚刚的代码思路都没了。那能不能直接在想用的函数里直接方便的获取这个 globalData 呢?比如:

// 省略27行
Page({
 data: { ... }
 //.. 省略863行
 onButtonTap(e) {
  // ...
  let myData = this.globalData.myData
  // ...
 }
})

或者换种方式获取和设置 myData:

let myData = this.$global('myData')
// ...
this.$global('myData', 2)

实现 global 方法

function global(name, value) {
 var globalData = getApp().globalData
 var data = {}
 // this.$global()
 if (arguments.length === 0) {
  return globalData
 }
 // this.$global('myData')
 if (arguments.length === 1) {
  if (is.string(name)) {
   return globalData[name]
  }
  // this.$global({
  //  name: 1
  // })
  if (is.object(name)) {
   data = name
  }
 }
 // this.$global('myData', 2)
 if (arguments.length === 2) {
  data[name] = value
 }
 return extend(data, data)
}

其中,is.string 和 is.object 是类型判断函数。简单实现了多种操作 globalData 的方法,详细见注释。

挂载到 this

函数有了,那么怎么挂在到小程序页面的 this 中呢,看过前几篇可能知道,要对小程序原有的 Page 函数进行改造。

有两种方式,一种是直接添加到 config 里:

var originPage = Page
var global = require('../utils/global')

function MyPage(config) {
 // ...
 config.$global = global
 // ...
 originPage(config)
}

function page (config) {
 return new MyPage(config)
}

或者在代理后的 onLoad 函数里定义:

var originPage = Page
var global = require('../utils/global')

function MyPage(config) {
 this.watch = config.watch
 this.lifetimeBackup = {
  onLoad: config.onLoad
 }
 config.onLoad = function(options) {
  this.$global = global
  // 其他代码
  this.lifetimeBackup.onLoad.call(this, options)
 }
 
 // ...

 originPage(config)
}

总结

利用这种方式,可以定义很多通用的小程序页面的方法,比如在摩拜小程序内部封装了 this.$util、this.$navigate等适合自身业务的工具方法等。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
Jul 14 Javascript
js内置对象 学习笔记
Aug 01 Javascript
js控制淡入淡出示例代码
Nov 12 Javascript
基于jQuery实现返回顶部实例代码
Jan 01 Javascript
js流动式效果显示当前系统时间
May 16 Javascript
Three.js学习之Lamber材质和Phong材质
Aug 04 Javascript
微信JSAPI支付操作需要注意的细节
Jan 10 Javascript
jQuery自动或手动图片切换效果
Oct 11 jQuery
Webpack中publicPath路径问题详解
May 03 Javascript
javascriptvoid(0)含义以及与"#"的区别讲解
Jan 19 Javascript
基于form-data请求格式详解
Oct 29 Javascript
ES6 proxy和reflect的使用方法与应用实例分析
Feb 15 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
Nov 01 #Javascript
vue实现配置全局访问路径头(axios)
Nov 01 #Javascript
vue.js路由mode配置之去掉url上默认的#方法
Nov 01 #Javascript
js实现漂亮的星空背景
Nov 01 #Javascript
Vue实现push数组并删除的例子
Nov 01 #Javascript
vue实现跳转接口push 转场动画示例
Nov 01 #Javascript
JS实现动态星空背景效果
Nov 01 #Javascript
You might like
火影忍者:这才是千手柱间和扉间的真正死因,角都就比较搞笑了!
2020/03/10 日漫
PHP实现图片压缩的两则实例
2014/07/19 PHP
php获取url参数方法总结
2014/11/13 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
2016/10/18 PHP
使用JavaScript 实现对象 匀速/变速运动的方法
2013/05/08 Javascript
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
Js中的onblur和onfocus事件应用介绍
2013/08/27 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
2014/06/05 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
javascript制作的简单注册模块表单验证
2015/04/13 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
jQuery+json实现动态创建复杂表格table的方法
2016/10/25 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
vue实现分页栏效果
2019/06/28 Javascript
javascript 数组精简技巧小结
2020/02/26 Javascript
微信小程序使用GoEasy实现websocket实时通讯
2020/05/19 Javascript
Python使用plotly绘制数据图表的方法
2017/07/18 Python
Python 获得13位unix时间戳的方法
2017/10/20 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
解决python执行不输出系统命令弹框的问题
2019/06/24 Python
Python实现代码块儿折叠
2020/04/15 Python
英国床垫和床架购物网站:Bedman
2019/11/04 全球购物
毕业生欢送会主持词
2014/03/31 职场文书
2014年大学生四年规划书范文
2014/04/03 职场文书
合作协议书范本
2014/04/17 职场文书
全国法制宣传日活动总结2014
2014/11/01 职场文书
结婚保证书
2015/01/16 职场文书
消防演习通知
2015/04/25 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
高中团支书竞选稿
2015/11/21 职场文书
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android
详解使用内网穿透工具Ngrok代理本地服务
2022/03/31 Servers
服务器SVN搭建图文安装过程
2022/06/21 Servers