浅谈小程序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中遭遇级联表达式陷阱
Mar 08 Javascript
javascript 进度条 实现代码
Jul 30 Javascript
js调用浏览器打印模块实现点击按钮触发自定义函数
Mar 21 Javascript
jQuery实现3D文字特效的方法
Mar 10 Javascript
JavaScript中使用concat()方法拼接字符串的教程
Jun 06 Javascript
JS版元素周期表实现方法
Aug 05 Javascript
详解AngularJs中$resource和restfu服务端数据交互
Sep 21 Javascript
Async Validator 异步验证使用说明
Jul 03 Javascript
JavaScript实现一个带AI的井字棋游戏源码
May 21 Javascript
在微信小程序里使用watch和computed的方法
Aug 02 Javascript
前端防止用户重复提交js实现代码示例
Sep 07 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
Feb 24 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
合作指挥官:孟斯克
2020/03/16 星际争霸
php获取参数的几种方法总结
2014/02/18 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
2016/03/17 PHP
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
通过Javascript创建一个选择文件的对话框代码
2012/06/16 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
2013/11/26 Javascript
jquery实现简单实用的打分程序实例
2015/07/23 Javascript
基于Three.js插件制作360度全景图
2016/11/29 Javascript
微信小程序 页面之间传参实例详解
2017/01/13 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
Ionic3实现图片瀑布流布局
2017/08/09 Javascript
vue-cli2.9.3 详细教程
2018/04/23 Javascript
微信小程序实现选项卡效果
2018/11/06 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
重命名批处理python脚本
2013/04/05 Python
Python实现命令行通讯录实例教程
2016/08/18 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
2018/02/24 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
2019/06/26 Python
Python设计密码强度校验程序
2020/07/30 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
HTML5 使用 sessionStorage 进行页面传值的方法
2018/07/02 HTML / CSS
html5指南-3.如何实现html元素拖拽功能
2013/01/07 HTML / CSS
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
物业管理计划书
2014/01/10 职场文书
寒假思想汇报
2014/01/10 职场文书
法人授权委托书
2014/04/03 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
工厂仓管员岗位职责范本
2014/07/17 职场文书
给下属加薪申请报告
2015/05/15 职场文书
2016年教师学习教师法心得体会
2016/01/20 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python