浅谈小程序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 相关文章推荐
返回页面顶部top按钮通过锚点实现(自写)
Aug 30 Javascript
javascript使用isNaN()函数判断变量是否为数字
Sep 21 Javascript
JavaScript实现找出数组中最长的连续数字序列
Sep 03 Javascript
jQuery选择器源码解读(三):tokenize方法
Mar 31 Javascript
jQuery基于扩展简单实现倒计时功能的方法
May 14 Javascript
浅谈Javascript数据属性与访问器属性
Jul 26 Javascript
jquery 动态增加删除行的简单实例(推荐)
Oct 12 Javascript
Bootstrap CSS布局之按钮
Dec 17 Javascript
seajs中模块依赖的加载处理实例分析
Oct 10 Javascript
10分钟上手vue-cli 3.0 入门介绍
Apr 04 Javascript
对angularJs中自定义指令replace的属性详解
Oct 09 Javascript
html5以及jQuery实现本地图片上传前的预览代码实例讲解
Mar 01 jQuery
小程序怎样让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连接Oracle数据库
2006/10/09 PHP
eWebEditor v3.8 商业完整版 (PHP)
2006/12/06 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
PHP获取音频文件的相关信息
2015/06/22 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
深入讲解PHP的Yii框架中的属性(Property)
2016/03/18 PHP
PHP中如何防止外部恶意提交调用ajax接口
2016/04/11 PHP
对PHP依赖注入的理解实例分析
2016/10/09 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
2010/01/15 Javascript
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
js函数在frame中的相互调用详解
2014/03/03 Javascript
JS实现淘宝支付宝网站的控制台菜单效果
2015/09/28 Javascript
浅谈在js传递参数中含加号(+)的处理方式
2016/10/11 Javascript
AngularJS中使用ngModal模态框实例
2017/05/27 Javascript
javaScript封装的各种写法
2017/08/14 Javascript
Angularjs中的$apply及优化使用详解
2018/07/02 Javascript
Vue发布项目实例讲解
2019/07/17 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
[13:25]VP vs VICI (BO3)
2018/06/07 DOTA
python在指定目录下查找gif文件的方法
2015/05/04 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
Python脚本实现自动将数据库备份到 Dropbox
2017/02/06 Python
Python学习笔记之列表推导式实例分析
2019/08/13 Python
Python实现快速大文件比较代码解析
2020/09/04 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
HTML5拍照和摄像机功能实战详解
2019/01/24 HTML / CSS
商务专员岗位职责
2013/11/23 职场文书
自主招生自荐信
2013/12/08 职场文书
十佳青年事迹材料
2014/08/21 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
花田少年史观后感
2015/06/16 职场文书
浅析MongoDB之安全认证
2021/06/26 MongoDB