浅谈小程序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 相关文章推荐
js滚动条多种样式,推荐
Feb 05 Javascript
Jquery全选与反选点击执行一次的解决方案
Aug 14 Javascript
jQuery实现为控件添加水印文字效果(附源码)
Dec 02 Javascript
jquery.multiselect多选下拉框实现代码
Nov 11 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
Feb 16 Javascript
jquery平滑滚动到顶部插件使用详解
May 08 jQuery
快速了解vue-cli 3.0 新特性
Feb 28 Javascript
jQuery中each方法的使用详解
Mar 18 jQuery
如何用webpack4带你实现一个vue的打包的项目
Jun 20 Javascript
vuejs前后端数据交互之从后端请求数据的实例
Aug 11 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
Sep 06 Javascript
原生JavaScript实现五子棋游戏
Nov 09 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字符串的编码问题的详细介绍
2013/04/27 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
2017/01/07 PHP
PHP实现爬虫爬取图片代码实例
2021/03/03 PHP
jQuery.Autocomplete实现自动完成功能(详解)
2010/07/13 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
2011/02/12 Javascript
基于MVC3方式实现下拉列表联动(JQuery)
2013/09/02 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
浅谈js中的引用和复制(传值和传址)
2016/09/18 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
2016/12/13 Javascript
JS实现改变HTML上文字颜色和内容的方法
2016/12/30 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
微信小程序实现watch监听
2020/06/04 Javascript
Python无损音乐搜索引擎实现代码
2018/02/02 Python
PyCharm安装第三方库如Requests的图文教程
2018/05/18 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
Python分布式进程中你会遇到的问题解析
2019/05/28 Python
python Django 创建应用过程图示详解
2019/07/29 Python
python 装饰器功能与用法案例详解
2020/03/06 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
纯css3实现走马灯效果
2014/12/26 HTML / CSS
css3 flex实现div内容水平垂直居中的几种方法
2020/03/27 HTML / CSS
HTML5 canvas基本绘图之图形组合
2016/06/27 HTML / CSS
Sneaker Studio罗马尼亚网站:购买运动鞋
2018/11/04 全球购物
英国伦敦的睡衣品牌:Asceno
2019/10/06 全球购物
Gretna Green中文官网:苏格兰格林小镇
2019/10/16 全球购物
八年级英语教学反思
2014/01/09 职场文书
市政施工员自我鉴定
2014/01/15 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书
2015年教务工作总结
2015/05/23 职场文书
《钓鱼的启示》教学反思
2016/02/18 职场文书
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL