You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Vuex是一个专为Vue服务,用于管理页面数据状态、提供统一数据操作的生态系统。它集中于MVC模式中的Model层,规定所有的数据操作必须通过 action - mutation - state change 的流程来进行,再结合Vue的数据视图双向绑定特性来实现页面的展示更新。统一的页面状态管理以及操作处理,可以让复杂的组件交互变得简单清晰。那么如何实现一个 Mini Vuex呢?
Please start your performance.
import{Store,install}from'./store';import{mapState,mapGetters,mapMutations,mapActions}from'./helper';exportdefault{ install, Store };export{mapState,mapGetters,mapMutations,mapActions};
Activity
CodeRookie262 commentedon Jan 18, 2021
告诉各位一个鬼故事,Vuex 出了 Vue3 的版本啦,新的一年新的学不动,趁 Vuex 还知道如何在 Vue2 的使用,赶紧抓住它的尾巴,
擦出五彩缤纷的火花,实现一个属于我们自己的 mini Vuex 吧 (๑•̀ㅂ•́)و✧目录结构及介绍
了解大概的目录和功能后我们开始对我们平时的操作流程分别对对应的源码进行实现。
MiniVuex.Store
先放出我们的主入口文件,接下来我们一一实现这些方法。
先结合我们平时的使用一步步进行吧,首先是将 MiniVuex 安装到 Vue 中,并将 MiniVuex.Store 创建后返回的类注入到 Vue 的实例中。
安装 MiniVuex,并创建 store 实例
以上是MiniVuex 的基本使用,接下我们针对以上的代码进行分析和实现。
install
首先利用
Vue.use安装插件是会调用对应插件的 install 方法,一下是 Vue.use 的源码。可以看出在如果安装插件的话,插件自身需要有有个 install 函数,利用 Vue.use 安装插件时 Vue 会执行一下插件的 install 方法并且将自身(Vue)作为参数传给插件,然后插件就可以对传入的 Vue
嘿嘿嘿进行注入操作啦~那么我们开始来实现插件的 install 吧。
install 搞好后接下来就是重头戏了,这个时候就轮到我们的 MiniVue.Store 进行状态储存对象的创建了,如果对 Vuex 的 Vuex.Store 状态构造器所需要的参数配置不太了解的话建议先看看 官方文档 。
我们是 Mini 版的 Vuex,所以并不会全部配置都实现,只需要实现常用的配置项支持即可,主要支持 state, getters, mutations, actions 和 modules。
state
先逐一对每个配置项进行处理。
首先创建储存对象时得要先定义好state对象来初始化我们提前定义我们 store 的状态值。
定义对象遍历函数
getters
所以我们也可以利用 Vue 的 computed 对我们设置的 getters 进行监听和缓存处理即可。Let's Coding~
mutations
偷个懒,贴官方的说明(;´▽`)y-~~
举个例子,先创建一个含有 mutations 的 store。
usage
如果Wimbledon想要对 count 进行更新的话,我们需要这样做:
大致的用法基本了解了,撒,哈子麻油~
action
Action 类似于 mutation,不同在于:
继续拿上面的 store 来用~
usage
派发更新
modules
模块也是 Vuex 核心的一部分,每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割。
这里我的处理方式和 Vuex 有一些不同,我是直接用一个 Map 储存每个模块实例的,并给他们各自标记一个特定的层级方便管理或操作。
虽然没有 Vuex 那样完善和强大的模块系统,不过我们的重点是 mini就好。(主要是我太菜了(╥╯^╰╥))
看下我们的完整例子吧~
完整代码亲戳这里
辅助函数
MiniVuex 提前封装了 mapState,mapGetters,mapActions和mapMutations,
对辅助方法的使用不太熟悉的戳这里。
辅助方法可以从store中取出对应的属性,同时也支持模块查找,取值筛选和对取值进行更改名称。
取值筛选和对取值进行更改名称我们可以在
utils.js中定义函数来处理。因为属性筛选如果是
string[],只需要简单的取值并且返回出去即可,而如果object[]的话就不单单取值,如果是对象的话可以对取出来的属性进行更改属性名更改,例如{count: 'newCount'},就是将取出来的属性可以以nnewCount进行访问,避免过多属性带来的重名冲突。所以我们可以封装一个函数对这几种情况进行特点的处理。
如果传递的是
['count']就返回[{key: 'count',val: 'count'}];如果是
{count: state => state.count, user: "userInfo"}就返回然后在封装辅助方法的时候我们还需要借助一下的几个工具方法来协助开发。
mapState
另外的三个辅助方法都是一样的做法,就不多说了。
mapGetters
mapMutations
mapActions
以上就是 MiniVuex 的全部实现了。
MiniVuex 特点:
具体请查看源代码,以上传到 Github。
原创不易,欢迎小伙伴记得关注微信公众号『进击的切图仔』Get 更多原创好文哦。