浅谈小程序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实现一些常用软件的下载导航
Aug 03 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
Mar 01 Javascript
捕获键盘事件(且兼容各浏览器)
Jul 03 Javascript
javascript实现div浮动在网页最顶上并带关闭按钮效果实例
Aug 13 Javascript
jQuery中clone()方法用法实例
Jan 16 Javascript
jQuery实现tab选项卡效果的方法
Jul 08 Javascript
利用Js+Css实现折纸动态导航效果实例源码
Jan 25 Javascript
基于Vue实现timepicker
Apr 25 Javascript
Vue.Draggable实现拖拽效果
Jul 29 Javascript
js实现每日签到功能
Nov 29 Javascript
React-redux实现小案例(todolist)的过程
Sep 29 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
基于mysql的bbs设计(五)
2006/10/09 PHP
php学习之数据类型之间的转换介绍
2011/06/09 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
Javascript实例教程(19) 使用HoTMetal(4)
2006/12/23 Javascript
自己的js工具_Form 封装
2009/08/21 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
form表单action提交的js部分与html部分
2014/01/07 Javascript
详谈JavaScript内存泄漏
2014/11/14 Javascript
基于jquery和svg实现超炫酷的动画特效
2014/12/09 Javascript
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
原生Javascript插件开发实践
2017/01/09 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
uploader秒传图片到服务器完整代码
2017/04/22 Javascript
JS中的JSON对象的定义和取值实现代码
2018/05/09 Javascript
vue 点击按钮实现动态挂载子组件的方法
2018/09/07 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
Python中itertools模块用法详解
2014/09/25 Python
PYTHON 中使用 GLOBAL引发的一系列问题
2016/10/12 Python
Python找出微信上删除你好友的人脚本写法
2018/11/01 Python
python2.7实现邮件发送功能
2018/12/12 Python
python dict 相同key 合并value的实例
2019/01/21 Python
python中time库的实例使用方法
2019/10/31 Python
python类中super() 的使用解析
2019/12/19 Python
在win64上使用bypy进行百度网盘文件上传功能
2020/01/02 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
加拿大著名时装品牌:SOIA & KYO
2016/08/23 全球购物
财务方面个人工作的自我评价
2013/12/28 职场文书
《小松树和大松树》教学反思
2014/02/20 职场文书
离职证明标准格式
2014/09/15 职场文书
MySQL之DML语言
2021/04/05 MySQL
Python Django / Flask如何使用Elasticsearch
2022/04/19 Python