浅谈小程序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复选框全选/取消示例
Dec 30 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
Aug 22 Javascript
js实现非常简单的焦点图切换特效实例
May 07 Javascript
把Node.js程序加入服务实现随机启动
Jun 25 Javascript
直接拿来用的15个jQuery代码片段
Sep 23 Javascript
学习JavaScript事件流和事件处理程序
Jan 25 Javascript
vue开发心得和技巧分享
Oct 27 Javascript
jquery横向纵向鼠标滚轮全屏切换
Feb 27 Javascript
Node.JS利用PhantomJs抓取网页入门教程
May 19 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
Oct 31 Javascript
webpack组织模块打包Library的原理及实现
Mar 10 Javascript
JavaScript canvas绘制折线图
Feb 18 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下防止单引号,双引号在接受页面转义的设置方法
2008/09/25 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
Prototype Array对象 学习
2009/07/19 Javascript
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
2013/03/05 Javascript
jQuery插件实现表格隔行换色且感应鼠标高亮行变色
2013/09/22 Javascript
javascript的push使用指南
2014/12/05 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
jquery validate表单验证的基本用法入门
2016/01/18 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
JS无限级导航菜单实现方法
2019/01/05 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
JS实现给数组对象排序的方法分析
2019/06/24 Javascript
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
[40:06]DOTA2亚洲邀请赛 4.3 突围赛 Liquid vs VGJ.T 第一场
2018/04/04 DOTA
[01:11:46]DOTA2-DPC中国联赛 正赛 iG vs Magma BO3 第一场 2月23日
2021/03/11 DOTA
Python的迭代器和生成器使用实例
2015/01/14 Python
Python类的定义、继承及类对象使用方法简明教程
2015/05/08 Python
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
python 编码规范整理
2018/05/05 Python
Python函数参数操作详解
2018/08/03 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
2018/11/29 Python
Python合并同一个文件夹下所有PDF文件的方法
2019/03/11 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
Python Lambda函数使用总结详解
2019/12/11 Python
关于ResNeXt网络的pytorch实现
2020/01/14 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
深入理解HTML5定时器requestAnimationFrame的使用
2018/12/12 HTML / CSS
美国购车网站:TrueCar
2016/10/19 全球购物
荷兰领先的百货商店:De Bijenkorf
2018/10/17 全球购物
Ellos瑞典官网:北欧地区时尚、美容和住宅领域领先的电子商务网站
2019/11/21 全球购物
环境保护与污染治理求职信
2014/07/16 职场文书
质量承诺书格式范文
2015/04/28 职场文书
李白经典诗之一:全文无一“月”字,却句句有月
2019/07/12 职场文书
java协程框架quasar和kotlin中的协程对比分析
2022/02/24 Java/Android