浅谈小程序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 相关文章推荐
JS获取后台Cookies值的小例子
Mar 04 Javascript
jquery 无限级下拉菜单的简单实现代码
Feb 21 Javascript
js代码实现随机颜色的小方块
Jul 30 Javascript
JavaScript实现时间倒计时跳转(推荐)
Jun 28 Javascript
微信小程序 生命周期详解
Oct 12 Javascript
jQuery UI 实例讲解 - 日期选择器(Datepicker)
Sep 18 jQuery
详解vue中引入stylus及报错解决方法
Sep 22 Javascript
vue利用axios来完成数据的交互
Mar 23 Javascript
angularJs中ng-model-options设置数据同步的方法
Sep 30 Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
Apr 08 Javascript
JS插入排序简单理解与实现方法分析
Nov 25 Javascript
vue打包时去掉所有的console.log
Apr 10 Vue.js
小程序怎样让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的面试题集
2006/11/19 PHP
php foreach循环中使用引用的问题
2013/11/06 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
2014/05/04 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
Symfony控制层深入详解
2016/03/17 PHP
Laravel SQL语句记录方式(推荐)
2016/05/26 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
2009/12/03 Javascript
加速IE的Javascript document输出的方法
2010/12/02 Javascript
javascript-简单的计算器实现步骤分解(附图)
2013/05/30 Javascript
JS分页控件 可用于无刷新分页
2013/07/23 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
AngularJS基础 ng-click 指令示例代码
2016/08/01 Javascript
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
jquery单击文字或图片内容放大并居中显示
2017/06/23 jQuery
VueJS组件之间通过props交互及验证的方式
2017/09/04 Javascript
Webpack之tree-starking 解析
2018/09/11 Javascript
微信小程序云开发修改云数据库中的数据方法
2019/05/18 Javascript
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
2021/02/20 Vue.js
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
传统软件工程与面向对象的软件工程有什么区别
2012/05/31 面试题
医学生自我鉴定范文
2013/11/08 职场文书
初一英语教学反思
2014/01/11 职场文书
一年级数学教学反思
2014/02/01 职场文书
大学生会计职业生涯规划范文
2014/02/28 职场文书
励志演讲稿300字
2014/08/21 职场文书
升学宴演讲稿
2014/09/01 职场文书
乔迁之喜答谢词
2015/01/05 职场文书
2015年酒店年度工作总结
2015/05/23 职场文书
无工作证明怎么写
2015/06/15 职场文书
python数据分析之用sklearn预测糖尿病
2021/04/22 Python
基于MySql验证的vsftpd虚拟用户
2021/11/07 MySQL