微信小程序的开发体验相似vue和react,可是却没有提供全局状态管理的机制,因此状态的共享只能经过属性传递的方式来实现。这种作法在小规模的应用中尚能够知足开发效率,可是在复杂的应用中组件的嵌套层次很深,属性传递的路径过长。html
因而我就想利用小程序Page中的data对象来构建一个全局store,这个store知足一下几点需求:vue
先附上源码 github地址react
咱们先跳过原理来看使用方法。git
将Store.js放入微信小程序项目的文件夹中,例如/lib/Store.js。github
这里咱们经过wxappStore.createPage
来建立。对比一下Store.js和原来的建立方法的区别小程序
// 原来的建立方法 Page({ data: { message: '' }, onLoad: function () { this.setData({ message: 'hello world' }) } })
// 增长全局状态管理以后 import wxappStore from "../../lib/Store.js"; Page(wxappStore.createPage({ // 第一个参数和原来传入Page方法的option没有区别。其中的data会做为全局共享对象来使用。 data: { message: '' }, onLoad: function () { // 经过dispatch方法,进行一个异步操做。 this.store.dispatch({ name: 'testAction', payload: 'hello world' }); // 经过commit方法,修改全局状态。 this.store.commit({ name: 'testMutation', payload: 'hello world' }); } }, // 第二个参数是一个对象,其中包含mutations和actions { mutations: { testMutation: function({ setData, payload, data }) { setData({ message: payload }); } }, actions: { testAction: function ({ commit, payload, data }) { setTimeout(() => { commit({ name: 'testMutation', payload: payload }); }); } } }))
wxappStore.createPage
方法有两个参数。微信小程序
第一个参数和原来传入Page方法的option没有区别。其中的data会做为全局共享对象来使用。微信
第二个参数是一个对象,其中包含mutations
和actions
app
mutation和Vuex中的mutation相似,它经过同步的方式修改状态。能够经过commit调用。框架
mutations在wxappStore.createPage
的第二个参数中定义,它用于修改全局状态。mutation一般同步的。mutation方法的参数是一个对象,包含三个属性:
function
: 用来修改全局状态,在微信小程序中直接修改状态不会触发页面重汇。object
:修改的状态,能够是一个对象,也能够是String等基础数据类型object
:当前状态mutations: { testMutation: function({ setData, payload, data }) { setData({ message: payload }); } },
经过commit方法调用mutation,它的参数是一个对象,包含两个属性:
String
:mutation的名称Object
:须要修改的状态,和Vuex的payload相似。this.store.commit({ name: 'testMutation', payload: 'hello world' });
action和Vuex中action概念相似,一般包含异步操做,在异步操做完成后进行commit操做。
action方法的参数是一个参数,包含3个属性:
function
:执行commit操做Object
:数据对象,和Vuex类型Object
:当前状态actions: { testAction: function ({ commit, payload, data }) { setTimeout(() => { commit({ name: 'testMutation', payload: payload }); }); } }
经过dispatch方法调用action,它的参数是一个对象,包含两个属性:
String
:action的名称Object
:须要修改的状态,和Vuex的payload相似。this.store.dispatch({ name: 'testAction', payload: 'hello world' });
在Component中咱们须要完成两项工做
第一将全局状态绑定到当前组件的data属性上,并将组件的data属性绑定到页面元素上。
第二组件须要使用commit或者dispatch完成全局状态的修改。
这里Store.j经过wxappStore.createComp
来建立Component,它会经过代理的方式为Component实现全局状态管理的功能。
import wxappStore from "../lib/Store.js"; Component(wxappStore.createComp({ data: { localtimeData: '' }, ready: function () { // 绑定全局状态 this.getGlobalData({ globalDataKey: 'localtime', localDataKey: 'localtimeData' }); // 改变全局状态 this.store.commit({ name: 'testMutation', payload: (new Date()).toLocaleTimeString() }) } }))
<view>读取全局状态:{{localtimeData}}</view>
全局状态绑定经过getGlobalData
这个实例方法实现,这个方法并不在小程序的运行环境中,它是Store.js执行的过程当中插入到Component实例中的。
getGlobalData
不能再created
回调中调用,应为component的实例方法setData
不能再created
中调用。
getGlobalData
的参数是一个对象,包含两个属性:
String
:这个属性表示须要全局状态的属性名,这个全局状态将于component的本地状态绑定。String
:这个属性表示本地状态的属性名,这个本地状态将于全局状态绑定。// 绑定全局状态 this.getGlobalData({ globalDataKey: 'localtime', localDataKey: 'localtimeData' });
可使用store.commit
或者store.dispatch
,store
并非小程序的运行环境中内置的,一样是经过Store.js插入到每个component实例中。它的使用方法和Page中的相似。
store.commit
或者store.dispatch
触发发全局状态的改变。