浅谈小程序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 相关文章推荐
Input 特殊事件onpopertychange和oninput
Jun 17 Javascript
JavaScript中的函数的两种定义方式和函数变量赋值
May 12 Javascript
javascript中var的重要性分析
Feb 11 Javascript
jQuery实现简洁的导航菜单效果
Nov 23 Javascript
jQuery设置Cookie及删除Cookie实例分析
Apr 15 Javascript
微信小程序 tabs选项卡效果的实现
Jan 05 Javascript
node版本管理工具n包使用教程详解
Nov 09 Javascript
JavaScript解析机制与闭包原理实例详解
Mar 08 Javascript
浅谈layui 数据表格前后台传值的问题
Sep 12 Javascript
js实现盒子拖拽动画效果
Aug 09 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
Sep 10 Javascript
Vue实现穿梭框效果
Sep 30 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 microtime获取浮点的时间戳
2010/02/21 PHP
php 魔术函数使用说明
2010/02/21 PHP
PHP代码审核的详细介绍
2013/06/13 PHP
php判断字符串在另一个字符串位置的方法
2014/02/27 PHP
php命令行使用方法和命令行参数说明
2014/04/08 PHP
php使用curl详细解析及问题汇总
2016/08/11 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
2019/04/17 PHP
div层的移动及性能优化
2010/11/16 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
2014/12/19 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
jquery平滑滚动到顶部插件使用详解
2017/05/08 jQuery
通过一个简单的例子学会vuex与模块化
2017/11/22 Javascript
vue select选择框数据变化监听方法
2018/08/24 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
node.js 微信开发之定时获取access_token
2020/02/07 Javascript
[44:58]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第二场
2018/04/06 DOTA
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
详细讲解Python中的文件I/O操作
2015/05/24 Python
python开发之thread线程基础实例入门
2015/11/11 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
python字符串查找函数的用法详解
2019/07/08 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
python用requests实现http请求代码实例
2019/10/31 Python
python Jupyter运行时间实例过程解析
2019/12/13 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
Desigual美国官方网站:西班牙服装品牌
2019/03/29 全球购物
高中生操行评语
2014/04/25 职场文书
初中同学会活动方案
2014/08/22 职场文书
导游词之介休绵山
2019/12/31 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
详解Flutter和Dart取消Future的三种方法
2022/04/07 Java/Android