摘要:概要微信小程序的开发体验类似和,但是却没有提供全局状态管理的机制,所以状态的共享只能通过属性传递的方式来实现。安装将放入微信小程序项目的文件夹中,例如。
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 使用mutationmutation和Vuex中的mutation类似,它通过同步的方式修改状态。可以通过commit调用。
2.3.1 定义mutationmutations在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 定义actionaction方法的参数是一个参数,包含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() }) } }))
2.5.1 全局状态绑定读取全局状态:{{localtimeData}}
全局状态绑定通过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触发发全局状态的改变。
如果你发现其他问题,欢迎留言,我们共同进步!
4. 写完好累,原理等下次更新吧。。。。文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/94511.html
摘要:前言一个集微信公众号商城小程序商城商城后台的一个开源项目,后台是基于开发的,是一个简洁而强大的开源微信公众平台开发框架,微信功能插件化开发多公众号管理配置简单。微信小程序项目下载整个包之后,进行根目录文件夹。 前言 一个集微信公众号商城/小程序商城/商城后台的一个开源项目,后台是基于WeiPHP5.0开发的,WeiPHP是一个简洁而强大的开源微信公众平台开发框架,微信功能插件化开发,多...
摘要:前言一个集微信公众号商城小程序商城商城后台的一个开源项目,后台是基于开发的,是一个简洁而强大的开源微信公众平台开发框架,微信功能插件化开发多公众号管理配置简单。微信小程序项目下载整个包之后,进行根目录文件夹。 前言 一个集微信公众号商城/小程序商城/商城后台的一个开源项目,后台是基于WeiPHP5.0开发的,WeiPHP是一个简洁而强大的开源微信公众平台开发框架,微信功能插件化开发,多...
摘要:在这一步,实例已完成以下的配置数据观测,属性和方法的运算,事件回调。可以直接写等标签的写法之前会的工程师上手框架的成本较低 简介 1.美团工程师推出的基于Vue.js封装的用于开发小程序的框架2.融合了原生小程序和Vue.js的特点3.可完全组件化开发 特点 1.组件化开发2.完成的Vue.js开发体验(前提是熟悉Vue)3.可使用Vuex管理状态4.Webpack构建项目5.最终H5...
摘要:所以在小程序出现之后,一股框架之风也很快的出现,微信小程序刚推出之后,就出现了两个比较出名的小程序开发框架,。 原文地址:https://ant-move.github.io/we... 这里说的去除小程序框架其实并不严谨,因为小程序本身也算是一个框架,而且是一个功能更加完善的框架系统。在前端的概念中,我们一般说一个框架是指一个用来帮助开发者构建用户界面的框架,而小程序框架本身不仅仅包...
摘要:业内开发框架层出不穷,,,等等,都在朝着更快,更强大的方向发展,有统一微信支付宝百度和头条小程序的大趋势。最近升级为版本,支持微信支付宝百度和头条小程序。 原文链接 最近小程序的发展越来越火了,作为各个产品线的extra服务入口,以轻便、快速、强大的社交链吸引着大量的用户和开发者。业内开发框架层出不穷,wepy,mpvue,taro等等,都在朝着更快,更强大的方向发展,有统一 H5、微...
阅读 2398·2021-11-11 16:54
阅读 1206·2021-09-22 15:23
阅读 3646·2021-09-07 09:59
阅读 1991·2021-09-02 15:41
阅读 3285·2021-08-17 10:13
阅读 3038·2019-08-30 15:53
阅读 1237·2019-08-30 13:57
阅读 1211·2019-08-29 15:16