浅谈小程序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 相关文章推荐
csdn 博客中实现运行代码功能实现
Aug 29 Javascript
jquery获取焦点和失去焦点事件代码
Apr 21 Javascript
jquery ajax,ashx,json的用法总结
Feb 12 Javascript
基于JavaScript实现简单的随机抽奖小程序
Jan 05 Javascript
js添加事件的通用方法推荐
May 15 Javascript
AngularJS入门教程之AngularJS 模板
Aug 18 Javascript
canvas简单快速的实现知乎登录页背景效果
May 08 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
Oct 31 Javascript
Nuxt.js实战详解
Jan 18 Javascript
如何在基于vue-cli的项目自定义打包环境
Nov 10 Javascript
Js on及addEventListener原理用法区别解析
Jul 11 Javascript
JavaScript 异步时序问题
Nov 20 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编程最快明白》第三讲:php数组
2010/11/01 PHP
教你如何快捷的使用cmd访问mysql小技巧
2014/05/26 PHP
php实现文本数据导入SQL SERVER
2015/05/17 PHP
详解js异步文件加载器
2016/01/24 PHP
PHP中OpenSSL加密问题整理
2017/12/14 PHP
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
kmock javascript 单元测试代码
2011/02/06 Javascript
JS高级笔记
2011/07/13 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
jquery清空textarea等输入框实现代码
2013/04/22 Javascript
JavaScript中的object转换函数toString()与valueOf()介绍
2014/12/31 Javascript
javascript中传统事件与现代事件
2015/06/23 Javascript
jQuery实用技巧必备(上)
2015/11/02 Javascript
微信jssdk在iframe页面失效问题的解决措施
2016/03/03 Javascript
学习Bootstrap滚动监听 附调用方法
2016/07/02 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
React-router中结合webpack实现按需加载实例
2017/05/25 Javascript
jQuery实现滚动效果
2017/11/17 jQuery
Vue中自定义全局组件的实现方法
2017/12/08 Javascript
node.js遍历目录的方法示例
2018/08/01 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
python交互界面的退出方法
2019/02/16 Python
75条笑死人的知乎神回复,用60行代码就爬完了
2019/05/06 Python
python的reverse函数翻转结果为None的问题
2020/05/11 Python
波兰在线体育用品商店:Hop-Sport.pl
2019/07/23 全球购物
内业资料员岗位职责
2014/01/04 职场文书
小学教师暑期培训方案
2014/08/28 职场文书
数学教师求职信范文
2015/03/20 职场文书
2015年采购部工作总结
2015/04/23 职场文书
运动会广播稿200字
2015/08/19 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang
教你使用pyinstaller打包Python教程
2021/05/27 Python
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏