
mini-stores
工具高性能小程序全局多状态管理库,支持多 Store 实例、跨页面/组件通信、JSON Diff 最小化渲染,兼容微信/支付宝/钉钉/百度/抖音/QQ/京东等小程序
state-managementstoreminiprogramwechatalipaycross-platformtypescript
详细文档
mini-stores#
资源概述#
mini-stores 是一个高性能的小程序全局多状态管理库,由腾讯开源的 westore 核心原理启发并重写。它通过 JSON Diff 算法实现最小化 setData 渲染,支持多 Store 实例、跨页面/组件通信,兼容微信/支付宝/钉钉/百度/抖音/QQ/京东等主流小程序平台。
核心特点:
- JSON Diff 最小渲染:基于 westore 的 diff 算法,每次 setData 只发送变化的部分,减少渲染开销
- 多 Store 实例:一个页面/组件可同时绑定多个 Store,Store 之间相互独立
- 直接赋值触发渲染:
store.data.title = '新标题'即自动触发绑定页面的 setData,无需手动调用 - 计算属性(函数属性):Store data 中支持函数类型的计算属性,支持深层嵌套
- 状态监听:
store.watch.on('key', fn)监听任意层级状态变化 - 多平台兼容:微信/支付宝/钉钉/百度/抖音/QQ/京东等小程序均可使用
- 后台页面延迟更新:非当前页面状态更新延迟到再次激活时执行,减少同时 setData 的频次
项目数据(2026-08-08):
- GitHub:179⭐ / 11 forks / MIT License
- npm:最新版 2.3.0 / 20 versions
- 活跃度:最后推送 2025-08-28(近期活跃)
- 语言:TypeScript
设计规范#
核心架构#
mini-stores 的设计基于腾讯 westore 的 JSON Diff 原理,在其基础上做了关键改进:
| 特性 | westore | mini-stores |
|---|---|---|
| 多 Store 实例 | ❌ 单例 | ✅ 多例 |
| 私有状态 | 与全局混合 | 独立保留 |
| 后台页面优化 | ❌ 即时更新 | ✅ 延迟更新 |
| 多平台支持 | 仅微信 | 微信/支付宝/钉钉/百度/抖音/QQ/京东 |
| 计算属性 | 基础 | 支持深层嵌套 |
API 设计#
| API | 说明 |
|---|---|
Store | 基础类,继承创建自定义 Store |
store.bind(pageInstance, key) | 绑定页面/组件,key 为视图访问前缀 |
store.unbind(pageInstance) | 解除绑定(页面/组件销毁时调用) |
store.data | 状态对象,直接修改即触发渲染 |
store.update() | 手动触发 diff + setData(特殊场景) |
store.watch.on(path, fn) | 监听状态变化,支持点路径 |
store.watch.off(path, fn) | 移除监听 |
审核规范#
mini-stores 是开发工具库,不涉及平台审核。使用时需注意:
- Store 中的数据不涉及敏感信息(不需要安全合规审查)
- 绑定/解绑生命周期必须成对出现,否则会导致内存泄漏
开发指南#
快速上手#
1. 安装
npm install mini-stores --save
2. 创建 Store
import { Store } from 'mini-stores'
class GlobalStore extends Store {
data = {
title: '小程序多状态管理',
language: 'zh_cn',
userName: '李狗蛋',
// 函数属性 — 自动计算,支持视图绑定
description() {
return `我是${this.userName}`
},
a: {
b: {
// 深层嵌套也支持函数属性
c() {
return this.language + this.description
}
}
}
}
onChangeLang() {
this.data.language = this.data.language === 'zh_cn' ? 'en_US' : 'zh_cn'
}
}
export default new GlobalStore()
3. 页面中使用
import globalStore from '../../stores/globalStore'
import indexStore from '../../stores/indexStore'
Page({
data: {
privateData: '私有状态'
},
onLoad() {
// 绑定 Store,'$data' 为视图访问前缀
indexStore.bind(this, '$index')
globalStore.bind(this, '$data')
},
onUnload() {
// 页面销毁时解绑(必须!)
indexStore.unbind(this)
globalStore.unbind(this)
},
handleChangeTitle() {
// 直接赋值即触发渲染
globalStore.data.title = '新标题'
}
})
4. 视图中使用
<view>
<view>{{$index.title}}</view>
<view>{{$data.language}}</view>
<view>{{$data.description}}</view>
<view>{{$data.a.b.c}}</view>
<view>{{privateData}}</view>
</view>
5. 组件中使用
import globalStore from '../../stores/globalStore'
Component({
data: { privateData: '私有状态' },
lifetimes: {
ready() {
globalStore.bind(this, '$data')
},
detached() {
globalStore.unbind(this)
}
},
methods: {
handleChange() {
globalStore.data.title = '组件中修改'
}
}
})
6. 监听状态变化
import globalStore from '../../stores/globalStore'
Page({
onLoad() {
globalStore.bind(this, '$data')
// 监听单字段
globalStore.watch.on('language', this.onLangChange)
// 监听深层字段(点路径)
globalStore.watch.on('a.b.c', this.onDeepChange)
},
onUnload() {
globalStore.unbind(this)
// 移除监听(必须!避免内存泄漏)
globalStore.watch.off('language', this.onLangChange)
},
onLangChange(newValue, oldValue) {
console.log('语言变更:', oldValue, '→', newValue)
}
})
常见陷阱#
- 必须成对调用 bind/unbind — onLoad 绑定后 onUnload 忘记 unbind 会导致内存泄漏
- 视图前缀不要和私有 data 冲突 — Store bind 的 key(如
$data)不能和页面 data 中的字段同名 - 支付宝/钉钉组件生命周期不同 — 微信用
lifetimes.ready/detached,阿里系用didMount/didUnmount - 函数属性 this 指向 store.data — 计算属性中的
this指向 Store 的 data 对象,不是 Store 实例 - 直接赋值不是立即渲染 — 赋值后会在下一个微任务批次中 diff + setData,不是同步的
- watch.off 必须传同一函数引用 — 不能用匿名函数,否则无法移除监听
生态资源#
相关方案#
| 方案 | 说明 |
|---|---|
| mobx-miniprogram-bindings | 微信官方推荐的 MobX 小程序绑定库(250⭐) |
| westore | 腾讯开源的小程序状态管理(westore v1,已停更) |
| miniprogram-computed | 微信官方的小程序计算属性组件 |
框架兼容性#
| 框架 | 支持 | 说明 |
|---|---|---|
| 微信原生小程序 | ✅ | 完全支持 |
| 支付宝小程序 | ✅ | 完全支持(注意生命周期差异) |
| 钉钉小程序 | ✅ | 完全支持 |
| 百度/抖音/QQ/京东 | ✅ | 支持,理论上通用 |
| Taro | ⚠️ | 可用但非推荐——Taro 推荐使用 React state / Vue reactivity |
| uni-app | ⚠️ | 可用但非推荐——uni-app 推荐使用 Vuex / Pinia |
社区资源#
- GitHub Issues — 问题反馈
- npm:mini-stores
版本更新#
v2.3.0(最新,2025-08-28)#
- 持续维护更新
- 多平台兼容性优化
- TypeScript 类型定义完善
v2.x 核心特性#
- 基于 JSON Diff 的最小化 setData
- 多 Store 实例 + 私有状态隔离
- 计算属性(含深层嵌套)
- 状态监听(watch)
- 后台页面延迟更新
- 多平台兼容(7+ 小程序平台)
选型建议#
| 场景 | 推荐方案 |
|---|---|
| 原生小程序 + 轻量状态管理 | mini-stores |
| 原生小程序 + 复杂状态逻辑 | mobx-miniprogram-bindings |
| Taro React | React useState / useReducer |
| uni-app Vue3 | Pinia |