以 app.js 的全局属性为基础,用消息订阅与发布对全局属性进行管理

以 vuex 为例,app.js 全局属性就是 state,消息发布就是 actions ,消息订阅就是 mutations

1. 在 app.js 定义全局数据


// app.js
App({// 定义全局数据data: {num: 1,}
})

2. 下载消息订阅与发布


在 app.js 以及在需要用到 app.js 数据的地方引入该包

npm i pubsub-js

3. 页面结构


父组件 index.html

<!--index.wxml--><view class="container">页面组件
<!-- app.data.num 是 app.js 全局属性 --><view>全局的num:{{app.data.num}}</view><!-- 点击事件 --><button bindtap="add">num++</button><view>-------分割线---------</view><!-- A是子组件 --><A/></view>

子组件 A.wxml

<!--commponent/A/A.wxml--><!-- app.data.num 是 app.js 全局属性 -->
<view>我是组件A,全局num:{{app.data.num}}</view>

4. 实现状态管理器


在 index.js 和 A.js 以及 app.js 引入 pubsub-js

import PubSub from 'pubsub-js'

在 app.js 里的 onLaunch 生命周期订阅一个 num 增加事件

// 生命周期:初始化完成
onLaunch () {// 接收PubSub.subscribe('add', (_, data) => {// 接收数据console.log('app.js收到的数据',data);// 修改逻辑层数据this.data.num++// 因为 app.js 不能直接更新视图层,只能让对应的组件自己修改视图层PubSub.publish('success','我是app')})
},

 在 index.js 发布一个 num 增加事件,并订阅一个更新视图层事件

在 bindtap 事件发布增加事件,在生命周期 onLoad 订阅一个更新视图层事件

// index.jsimport PubSub from 'pubsub-js'// 获取 app.js 的全局数据
const app = getApp()Page({data: {// 视图层的数据只有放在 data 里才能显示app,// 存放该订阅的 id ,用来取消订阅successId:''},// 在这里写订阅事件onLoad(){// 先更新视图层数据,防止页面跳转后视图层没有同步更新this.setData({app})// 再订阅一个更新视图层事件this.data.successId = PubSub.subscribe('success', (_, data) => {console.log(data);// 更新视图层this.setData({app})})},// bindtap 事件add(){// 发布一个 num 增加事件PubSub.publish('add','我是index')},})

在 A.js 订阅一个更新视图层事件

在 attached 生命周期订阅事件

// commponent/A/A.js
import PubSub from 'pubsub-js'// 获取 app.js 的全局数据
const app = getApp()Component({data: {// 视图层的数据只有放在 data 里才能显示app,// 存放该订阅的 id ,用来取消订阅successId:''},// 组件实例的生命周期lifetimes: {// 在组件实例进入页面节点树时执行attached() {// 订阅一个视图更新事件this.data.successId = PubSub.subscribe('success', (_, data) => {console.log(data);// 更新视图层this.setData({ app })})},},
})

5. 取消订阅

取消订阅分为:取消指定订阅和取消全部订阅


取消 index.js 的订阅

在 卸载的生命周期 取消订阅

page({// 页面卸载时触发onUnload(){// 这是取消全部订阅PubSub.clearAllSubscriptions()// 取消指定订阅// Pubsub.unsubscribe(this.data.successId)}});

取消 A.js 的订阅

在生命周期 detached 取消订阅

Component({// 组件实例的生命周期lifetimes: {// 在组件实例被从页面节点树移除时执行detached() {// 这是取消全部订阅PubSub.clearAllSubscriptions()// 取消指定订阅// Pubsub.unsubscribe(this.data.successId)},
})

打造微信小程序伪状态管理器相关推荐

  1. 微信小程序----全局状态管理 (便于全局埋点等操作)

    说明 由于我是一个有着一颗玻璃心的博主,导致在2018年后博客很少更新.原因是由于我的分享并没有解决到部分人的问题,而导致被骂了.当时这颗玻璃心就碎了,所以这两年以来很是消极,博客很少更新.这里给那些 ...

  2. 微信小程序全局状态管理store

    wxMiniStore 一个基于原生小程序的Mini全局状态管理库,跨页面/组件的数据共享. 1.安装 npm init npm install wxministore -S 2.微信开发者工具中勾选 ...

  3. 微信小程序项目实例——密码管理器

    今日推荐

  4. 微信小程序实现音乐播放器(2)

    文章目录 前情提要 BackgroundAudioManager API:wx.setNavigationBarTitle() 搭建静态资源服务器 小程序项目 app.json app.wxss pa ...

  5. 微信小程序实现音乐播放器(5)

    文章目录 前情提要 pubsubjs实现页面通信 moment.js实现时间格式化 BackgroundAudioManager 小程序项目 app.json app.wxss app.js page ...

  6. 小程序全局状态管理,在页面中获取globalData和使用globalSetData

    GitHub: https://github.com/WozHuang/mp-extend 主要目标 微信小程序官方没有提供类似vuex.redux全局状态管理的解决方案,但是在一个完整的项目中各组件 ...

  7. 微信小程序实现一个文件管理器

    微信小程序实现一个文件管理器 虽然标题说是实现一个文件管理器,但我是用来管理预加载小程序可能用的网络资源的,尤其是要是用音效资源时. 小程序的包体即便是分包也是每个分包的资源大小是2m,像音频资源,使 ...

  8. html5音乐播放器设计论文,基于微信小程序的音乐播放器设计和毕业论文

    摘  要 随着通信技术的发展和智能设备的普及,移动互联网在近两年发展迅猛,新兴的移动社交软件"微信"逐渐走进了手机用户的生活,深受全国数亿用户的欢迎.随着微信版本的不断更新,微信也 ...

  9. 基于微信小程序的相关管理系统设计与实现开题报告的思路及方法

    今天主要谈一下计算机科学相关专业同学的选题的思路及方法. 毕业设计选题选没选好就像各位走出校园踏进社会的一道坎,跨过这道坎是很关键的,而有些同学却犯了难,把本应该简单的问题复杂化了.为什么这样讲呢?之 ...

最新文章

  1. sql server 用户'sa'登录失败(错误18456)
  2. GDCM:获取假冒的Identify File的测试程序
  3. java隐藏与覆盖_java中方法的隐藏和覆盖问题?
  4. 服务器虚拟化之-——VMware组件与功能。
  5. 1. 请简述mysql数据库的锁机制_【MySQL入门】之MySQL数据库的锁机制(二)
  6. 什么是bigdata
  7. java 8-6 抽象的练习
  8. matlab 中 x 轴的各种设置
  9. eff java_eff java 39条
  10. 模型的学习方式-迁移学习、多任务学习、小样本学习、元学习
  11. Photoshop 无法安装Tych Panel,提示:could not create folder Run Photoshop as administrator or create the ...
  12. 远程监控tomcat运行
  13. EXCEL怎么隔3行插入1空行?
  14. mac os 系统升级到 Catalina 版本后出现应用打不开 ,闪退,意外退出问题
  15. sofa-bolt是什么?
  16. 内部收益率 IRR XIRR
  17. 三人表决电路——Verilog HDL语言
  18. git如何删除已经提交的文件夹
  19. 线段树(区间修改)模板题 Luogu 2357 守墓人
  20. 明川和治功现在正说牛家沟那个“母老虎”的事

热门文章

  1. Java显示当前月的日历
  2. xss平台模块代码分析--默认模块
  3. 杭电ACM 1713 相遇周期
  4. NLP:自然语言处理领域常见的文本特征表示/文本特征抽取(本质都是“数字化”)的简介、四大类方法(基于规则/基于统计,离散式【one-hot、BOW、TF-IDF】/分布式)之详细攻略
  5. JAVA框架项目实战:系统公告设计及实现
  6. 计算机在无纸化办公系统中应用属于,0506非计算机专业和计算机专业基础部分会考练习题.doc...
  7. matlab大津法函数,大津(Ostu)阈值分割方法在matlab中的实现
  8. 数学期望 极小值的几种求法
  9. 44.求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和
  10. springmvc中Model的理解