微信小程序的市场在进一步的扩大,而背后的技术社区仍在摸索着最好的实践方案。我在帮助Nike,沃尔玛以及一些创业公司开发小程序后,依旧认为使用小程序原生框架是一个更高效,稳定的选择,而使用原生框架唯独缺少一个好的状态管理库,如果不引入状态管理则会让我们在模块化,项目结构以及单元测试上都有些捉襟见肘。

目前相对比较稳健的做法是针对redux或者mobx做一个adaptor应用到小程序中,但这样需要自己想办法打包引入外部库,还要想怎么去写这个adaptor,总显得有些麻烦。于是我迸发出一个想法去写一个专用于小程序的状态管理库,它使用起来足够简单并且可以通过小程序自己的npm机制安装。

目前我已经用这个开源库开发了两个电商小程序,在提高我开发效率的同时亦保证了程序的性能,所以接下来我想谈谈这背后的理念以启发更多开发者尝试新的解决方案。

基于Proxy的状态管理实现

Proxy在小程序中已经得到了足够好的支持,目前并没有发现在任何iPhone或者Android上不能使用Proxy的情况。而基于Proxy的状态管理其实也就是订阅监听的模式,一方面监听数据的变化,另一方面将这些变化传达给订阅的小程序页面。

举一个比较常见的例子,当一个用户从自己的主页进入用户编辑页面,然后更改了自己的用户名点击保存后,用户主页和用户编辑页上的用户名这时候都应该被更新。这背后的程序逻辑则是:更新这个行为将触发Proxy去通知状态管理库,然后状态管理库负责检查此时还在页面栈中的所有页面,更新订阅了用户名这个数据的页面,如下图:

Part1: 监听数据变化

监听数据变化其实就是监听各个Store的属性变化,实现上就是在各个Store前面加了一层Proxy,用更直观的图片来表示就是这样:

当一个Store被观察以后,它的属性就都变成了Proxy实例,当这个属性值是Object或者Array的时候,它内部的值也会被包装成Proxy实例,这样无论多深层的数据变动都能被监听到。 而在Proxy的后面,Store的属性其实是被另一套数据(紫色部分)所维护,这套数据不负责监听,它就是纯数据,针对属性的任何变动最后都会应用到这套数据上来,它的作用是维护和返回最新的数据。

实现细节: github.com/wwayne/mini…

Part2: 页面数据绑定

因为小程序每个页面的js都是向Page中传递一个对象,这就让我们有机会包装这个对象,从而实现: 1. 进入页面后,将页面保存在页面栈中 2. 将来自状态管理库的数据映射到这个页面的data上来 3. 页面退出时,将页面从页面栈中移除

实现细节: github.com/wwayne/mini…

Part3: 页面订阅更新

当数据被监听到变化后,我们需要依次做两件事,先是找到所有存储在页面栈里的页面,然后根据各个页面订阅的数据来检查变化,如果有变化就通知这些页面,从而让它们去触发setData更新页面。

实现细节:github.com/wwayne/mini…

使用状态管理的例子

有了状态管理库,现在我们就来实现一开始举例的更新用户信息的操作,我们的文件路径如下:

stores/user.js
pages/userEdit/index.jsindex.wxml
复制代码
  1. 首先我们创建一个Store保存用户的信息,并且监听它的变化:
// stores/user.js
import { observe } from 'minii'Class UserStore {constructor () {this.name = 'bob'}changeName (name) {this.name = name}
}export default observe(new UserStore(), 'user')
复制代码
  1. 接着在我们的小程序页面订阅Store的信息
// pages/userEdit/index.js
import { mapToData } from 'minii'
import userStore from '../../stores/user'const connect = mapToData(state => (({myName: state.user.name
}))
Page(connect({updateNameToJames () {userStore. changeName('james')}
}))
复制代码
  1. 完成,现在可以在页面中使用和更新数据了
// pages/userEdit/index.wxml
<text>{{ myName }}</text>
<button bindtap="updateNameToJames">update name to James</button>
复制代码

最后

小程序因为有体积的限制,所以我希望在代码量上也尽量做到轻量和便捷,所以目前这个状态管理库并没有太多很复杂的功能,在小程序打包后所占用的体积也不到1kb,颇有点够用就好的意思。

我也已经用它开发了两款小程序,在经历了一段时间的用户使用后,我也更有信心说这个方案在小程序中是可行的。如果你有任何想法和建议,都欢迎告诉我。

项目Github: github.com/wwayne/mini…


关于我

Hi, 我是wwayne,是一名居住在上海的独立软件工程师,我正在开发我的新产品 talk-to.kim, 你可以在Github 或者专栏 一个人写代码找到我

转载于:https://juejin.im/post/5d02f6565188255e780b673b

基于Proxy的小程序状态管理相关推荐

  1. 微信小程序状态管理的使用

    安装: npm install --save mobx-miniprogram mobx-miniprogram-bindings 创建store.js文件 // 创建 Store 实例对象 impo ...

  2. Jenkins配置基于角色的项目权限管理--转

    本文将介绍如何配置jenkins,使其可以支持基于角色的项目权限管理. 由于jenkins默认的权限管理体系不支持用户组或角色的配置,因此需要安装第三发插件来支持角色的配置,本文将使用Role Str ...

  3. 10人以下小团队管理手册-学习笔记

    [README] 本文总结于<10人以下小团队管理手册>,很nice的一本书,有兴趣的同学可以翻下: [0]序章 作者作为咨询师发现, 1.下属对主管有不满,主管对下属有怨言: 2.10人 ...

  4. 计算机二级web考点,2018年计算机二级考试WEB考点:web应用程序状态管理方式

    2017年计算机等级考试已经结束,出国留学网为考生们整理了2018年计算机二级考试WEB考点,希望能帮到大家,想了解更多资讯,请关注我们,小编会及时更新哦. 2018年计算机二级考试WEB考点:web ...

  5. 从标准到开发,解读基于MOF的应用模型管理

    摘要:为了打破技术与业务的壁垒,搭建技术与业务的桥梁,因此基于如下流程实现应用业务模型管理 ROMA ABM. 在数字经济时代,数据正在成为企业极其重要的战略性资产.在政府方面,数据第一次作为新型生产 ...

  6. 基于项目管理的软件产品研发管理研究

    文章首先分析了常见的软件产品研发管理模式,并从项目管理的角度,针对当前软件项目管理中的薄弱环节,提出了"以项目目的为中心,以兴趣为导向,以制度规范为基石,以逆向三级目标管理方法为保障&quo ...

  7. 基于安卓/微信小程序的个人健康打卡系统

    随着智能终端和移动互联网的发展,健康管理软件在国内外兴起.健康管理系统运行在智能终端上,为人们的日常健康管理提供一种便捷的方式,帮助人们随时随地地管理个人健康.本文在研究国内外健康管理软件的基础上,充 ...

  8. linux 拍照软件有哪些,六款基于Linux的开源照片管理软件推荐

    六款基于Linux的开源照片管理软件推荐,哪吒游戏网给大家带来详细的六款基于Linux的开源照片管理软件推荐介绍,大家可以阅读一下,希望这篇六款基于Linux的开源照片管理软件推荐可以给你带来参考价值 ...

  9. 基于微信共享小程序系统设计与实现 开题报告

      毕业论文 基于微信共享小程序 开题报告 学    院: 专    业: 年    级: 学生姓名: 指导教师: 黄菊华   XXXX大学本科生毕业论文(设计)开题报告书 姓   名 Xxx 学院 ...

最新文章

  1. Interactive Mathematics Study
  2. Mongodb python驱动教程
  3. 图像传感器与信号处理——详解CCD与CMOS图像传感器
  4. 车品觉 | 大数据的价值:找到别人的“集体智慧”
  5. bulid-tool
  6. Spring Cloud 升级最新 Finchley 版本,踩了所有的坑
  7. 【LeetCode笔记】88. 合并两个有序数组(Java、双指针)
  8. [EffectiveC++]item02:尽量以const,enum,inline代替#define
  9. C语言 模拟实现 strlen strcat strcpy函数
  10. vue向ifarm传值_vue组件间传值
  11. iOS开发问题之Could not instantiate class named NSLayoutConstraint
  12. php在简历模版文件,PHP简历模板
  13. windows 文件保护机制
  14. 查看linux系统有哪些登陆用户,Linux_linux查看系统登录用户,Last login: Wed Jul 29 17:16:10 2009 fro - phpStudy...
  15. python setup_python--setUp()和tearDown()应用
  16. 手持两把锟斤拷,口中疾呼烫烫烫
  17. 用计算机上初中英语课的方法,初中英语课讲课流程
  18. 前端低代码平台腾讯云微搭使用文档
  19. 浏览器UserAgent汇总
  20. yyyy-MM-dd‘T‘HH:mm:ss - 里面的‘T‘是什么意思

热门文章

  1. SAP Batch Derivation功能初探之二
  2. 阿里达摩院包揽AI领域六大权威榜单冠军:用人类的学习方式超越人类
  3. 百年 IBM 终于 All In 人工智能和混合云
  4. 部署基于嵌入的机器学习模型的通用模式
  5. 如何构建一个成功的AI PoC(概念验证项目)
  6. 苹果公司开发Overton机器学习平台,它到底是什么?
  7. “刷脸”之后 声纹识别有望成为新秀
  8. 中国ATM龙头转型 全要素布局人工智能
  9. 量子技术新突破!科学家完美实现将单个原子逐一嵌入硅晶片
  10. 柳进军 | 城市大脑的逻辑模型