浅谈小程序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 相关文章推荐
jQuery使用手册之一
Mar 24 Javascript
js获取IP和PcName(IE)在vs中可用
Aug 02 Javascript
JS实现文字掉落效果的方法
May 06 Javascript
JS实现带提示的星级评分效果完整实例
Oct 30 Javascript
jQuery实现优雅的弹窗效果(6)
Feb 08 Javascript
Bootstrap栅格系统简单实现代码
Mar 06 Javascript
Vue常用指令V-model用法
Mar 08 Javascript
JavaScript 中 apply 、call 的详解
Mar 21 Javascript
Vue.use源码分析
Apr 22 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
Apr 28 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
Jul 25 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
Feb 01 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
php页面缓存ob系列函数介绍
2012/10/18 PHP
php+xml实现在线英文词典查询的方法
2015/01/23 PHP
php正则提取html图片(img)src地址与任意属性的方法
2017/02/08 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
JavaScript中this关键字使用方法详解
2007/03/08 Javascript
javascript学习随笔(使用window和frame)的技巧
2007/03/08 Javascript
javascript import css实例代码
2008/07/18 Javascript
checkbox 复选框不能为空
2009/07/11 Javascript
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
window.ActiveXObject使用说明
2010/11/08 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
利用javascript实现全部删或清空所选的操作
2014/05/27 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
2015/02/25 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
javascript常用函数(2)
2015/11/05 Javascript
JavaScript核心语法总结(推荐)
2016/06/02 Javascript
vue axios用法教程详解
2017/07/23 Javascript
利用Javascript获取选择文本所在的句子详解
2017/12/03 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
vue给组件传递不同的值方法
2018/09/29 Javascript
浅谈Ant Design Pro 菜单自定义 icon
2020/11/17 Javascript
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
编写Python CGI脚本的教程
2015/06/29 Python
Python中数字以及算数运算符的相关使用
2015/10/12 Python
python实现简单socket通信的方法
2016/04/19 Python
python实现公司年会抽奖程序
2019/01/22 Python
django 文件上传功能的相关实例代码(简单易懂)
2020/01/22 Python
DC Shoes澳大利亚官方网上商店:购买DC鞋子
2019/10/25 全球购物
艺术专业大学生自我评价
2013/09/22 职场文书
中学自我评价
2014/01/31 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
全国爱眼日活动总结
2015/02/27 职场文书
小学新课改心得体会
2016/01/22 职场文书
如何在Python项目中引入日志
2021/05/31 Python
mysql数据库隔离级别详解
2022/06/16 MySQL