▶_MiniApp Toolkit

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 原理,在其基础上做了关键改进:

特性westoremini-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. 安装

code
npm install mini-stores --save

2. 创建 Store

code
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. 页面中使用

code
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. 视图中使用

code
<view>
  <view>{{$index.title}}</view>
  <view>{{$data.language}}</view>
  <view>{{$data.description}}</view>
  <view>{{$data.a.b.c}}</view>
  <view>{{privateData}}</view>
</view>

5. 组件中使用

code
import globalStore from '../../stores/globalStore'

Component({
  data: { privateData: '私有状态' },
  lifetimes: {
    ready() {
      globalStore.bind(this, '$data')
    },
    detached() {
      globalStore.unbind(this)
    }
  },
  methods: {
    handleChange() {
      globalStore.data.title = '组件中修改'
    }
  }
})

6. 监听状态变化

code
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)
  }
})

常见陷阱#

  1. 必须成对调用 bind/unbind — onLoad 绑定后 onUnload 忘记 unbind 会导致内存泄漏
  2. 视图前缀不要和私有 data 冲突 — Store bind 的 key(如 $data)不能和页面 data 中的字段同名
  3. 支付宝/钉钉组件生命周期不同 — 微信用 lifetimes.ready/detached,阿里系用 didMount/didUnmount
  4. 函数属性 this 指向 store.data — 计算属性中的 this 指向 Store 的 data 对象,不是 Store 实例
  5. 直接赋值不是立即渲染 — 赋值后会在下一个微任务批次中 diff + setData,不是同步的
  6. 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

社区资源#

版本更新#

v2.3.0(最新,2025-08-28)#

  • 持续维护更新
  • 多平台兼容性优化
  • TypeScript 类型定义完善

v2.x 核心特性#

  • 基于 JSON Diff 的最小化 setData
  • 多 Store 实例 + 私有状态隔离
  • 计算属性(含深层嵌套)
  • 状态监听(watch)
  • 后台页面延迟更新
  • 多平台兼容(7+ 小程序平台)

选型建议#

场景推荐方案
原生小程序 + 轻量状态管理mini-stores
原生小程序 + 复杂状态逻辑mobx-miniprogram-bindings
Taro ReactReact useState / useReducer
uni-app Vue3Pinia