微信小程序开发之全局状态管理,并提供Vuex的开发体验
白羽 2018-08-09 来源 :网络 阅读 947 评论 0

摘要:本文将带你了解微信小程序开发之全局状态管理,并提供Vuex的开发体验,希望本文对大家学微信有所帮助

        本文将带你了解微信小程序开发之全局状态管理,并提供Vuex的开发体验,希望本文对大家学微信有所帮助


1. 概要
微信小程序的开发体验类似vue和react,但是却没有提供全局状态管理的机制,所以状态的共享只能通过属性传递的方式来实现。这种做法在小规模的应用中尚可以满足开发效率,但是在复杂的应用中组件的嵌套层次很深,属性传递的路径过长。
于是我就想利用小程序Page中的data对象来构建一个全局store,这个store满足一下几点需求:

store可以被当前页面中任意一个组件访问,并且这种访问时直接的而不是通过属性传递。
全局store对于组件是相应式的,也就是说store的变化可以使组件发生重绘。
页面和组件都可以修改store的状态,并且这种修改不破坏原来的响应式。
提供类似Vuex的开发体验,减小学习成本。

先附上源码  github地址
2. 使用
我们先跳过原理来看使用方法。
2.1 安装
将Store.js放入微信小程序项目的文件夹中,例如/lib/Store.js。
2.2 创建Page对象
这里我们通过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
2.3 使用mutation
mutation和Vuex中的mutation类似,它通过同步的方式修改状态。可以通过commit调用。
2.3.1 定义mutation
mutations在wxappStore.createPage的第二个参数中定义,它用于修改全局状态。mutation通常同步的。mutation方法的参数是一个对象,包含三个属性:

setData function: 用来修改全局状态,在微信小程序中直接修改状态不会触发页面重汇。
payload object:修改的状态,可以是一个对象,也可以是String等基础数据类型
data object:当前状态

mutations: {
    testMutation: function({ setData, payload, data }) {
        setData({
            message: payload
        });
    }
},
2.3.2 调用mutation
通过commit方法调用mutation,它的参数是一个对象,包含两个属性:

name String:mutation的名称
payload Object:需要修改的状态,和Vuex的payload类似。

this.store.commit({ 
    name: 'testMutation',
    payload: 'hello world'
});
2.4 使用action
action和Vuex中action概念类似,通常包含异步操作,在异步操作完成后进行commit操作。
2.4.1 定义action
action方法的参数是一个参数,包含3个属性:

commit function:执行commit操作
payload Object:数据对象,和Vuex类型
data Object:当前状态

actions: {
    testAction: function ({ commit, payload, data }) {
        setTimeout(() => {
            commit({
                name: 'testMutation',
                payload: payload
            });
        });
    }
}
2.4.2 调用action
通过dispatch方法调用action,它的参数是一个对象,包含两个属性:

name String:action的名称
payload Object:需要修改的状态,和Vuex的payload类似。

this.store.dispatch({ 
    name: 'testAction',
    payload: 'hello world'
});
2.5 创建Component
在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>
2.5.1 全局状态绑定
全局状态绑定通过getGlobalData这个实例方法实现,这个方法并不在小程序的运行环境中,它是Store.js执行的过程中插入到Component实例中的。

getGlobalData 不能再created回调中调用,应为component的实例方法setData不能再created中调用。

getGlobalData的参数是一个对象,包含两个属性:

globalDataKey String:这个属性表示需要全局状态的属性名,这个全局状态将于component的本地状态绑定。
localDataKey String:这个属性表示本地状态的属性名,这个本地状态将于全局状态绑定。

// 绑定全局状态
this.getGlobalData({ globalDataKey: 'localtime', localDataKey: 'localtimeData' });
2.5.2 改变全局状态
可以使用store.commit或者store.dispatch,store并不是小程序的运行环境中内置的,同样是通过Store.js插入到每一个component实例中。它的使用方法和Page中的类似。
3. 这套框架的不足


Store.js借用了Page对象的data属性来完成全局状态管理,所以data属性的职责并不单一。data属性兼具了页面ViewModel的功能和全局状态的功能。但是Page中的data属性本来也具有全局意义,所以两者的冲突并不大。


component中的data属性职责并不单一。它兼具了本地属性的功能和绑定全局状态的功能。而且直接通过setData修改component中的data并不能触发全局状态的改变,因为data的作用域仅限于当前component,必须通过store.commit或者store.dispatch触发发全局状态的改变。


   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之微信频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程