浅谈小程序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 相关文章推荐
Javascript与vbscript数据共享
Jan 09 Javascript
利用Angularjs实现幻灯片效果
Sep 07 Javascript
Node.js中路径处理模块path详解
Nov 14 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
Nov 24 Javascript
JS实现Ajax的方法分析
Dec 20 Javascript
webuploader模态框ueditor显示问题解决方法
Dec 27 Javascript
JavaScript编写九九乘法表(两种任选)
Feb 04 Javascript
Vue 过渡实现轮播图效果
Mar 27 Javascript
详解vee-validate的使用个人小结
Jun 07 Javascript
详解基于node的前端项目编译时内存溢出问题
Aug 01 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
Apr 26 Javascript
node.js使用yargs处理命令行参数操作示例
Feb 11 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类与对象中的private访问控制的疑问
2012/11/01 PHP
php函数式编程简单示例
2019/08/08 PHP
JavaScript的面向对象方法以及差别
2008/03/31 Javascript
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
jQuery学习笔记 操作jQuery对象 属性处理
2012/09/19 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2014/09/04 Javascript
jQuery如何防止这种冒泡事件发生
2015/02/27 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
JavaScript自学笔记(必看篇)
2016/06/23 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
Vue中使用vux的配置详解
2017/05/05 Javascript
JavaScript面向对象精要(下部)
2017/09/12 Javascript
浅析Vue项目中使用keep-Alive步骤
2018/07/27 Javascript
原生JS封装_new函数实现new关键字的功能
2018/08/12 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
详解react-refetch的使用小例子
2019/02/15 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
python3.6利用pyinstall打包py为exe的操作实例
2018/10/31 Python
PyCharm鼠标右键不显示Run unittest的解决方法
2018/11/30 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
tensorflow实现在函数中用tf.Print输出中间值
2020/01/21 Python
python针对Oracle常见查询操作实例分析
2020/04/30 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
2021/01/19 Python
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
2018/02/01 HTML / CSS
澳大利亚免息网上购物:Shop Zero
2016/09/17 全球购物
波兰家居饰品和厨房配件网上商店:Maleomi
2020/12/15 全球购物
Weblogc domain问题
2014/01/27 面试题
五年级英语教学反思
2014/01/31 职场文书
医药类个人求职的自我评价
2014/02/12 职场文书
个人投资合作协议书
2014/10/12 职场文书
补充协议书
2015/01/28 职场文书
MySQL触发器的使用
2021/05/24 MySQL
JavaScript文档对象模型DOM
2021/11/20 Javascript
SpringBoot使用AOP实现统计全局接口访问次数详解
2022/06/16 Java/Android