深入vuex原理(上)

7,315

前言

vuex作为vue生态的重要组成部分,是对store进行管理的一柄利剑。简而言之,vuex是vue的状态管理器。使用vuex可用使数据流变得清晰、可追踪、可预测,更可以简单的实现 类似时光穿梭 等高级功能,对于复杂的大型应用来讲,vuex将变得尤为重要,对于 store的切分、store的module化、store的变更、store的追踪 等等 store的管理工作,使用vuex 管理store会大大提高项目的稳定性,扩展性!本篇将通过vuex的源码对vuex 的设计以及实现原理 进行剖析!


注:本篇文章只展示关键核心代码,一来由于篇幅原因,二来展示核心代码更容易让人理解!再者,本篇属于 vuex 高级篇,对于本篇章中 涉及的 vue 相关的机制 以及 vuex的 高级使用 等 不进行过多赘述!请自行前往官网查看!


准备

浅析vuex的构成

vuex 引入 StateGetter 的概念对状态进行定义;使用 MutationAction对状态进行变更;引入Module对状态进行模块化分割;引入插件对状态进行快照、记录、以及追踪等;提供了mapState、mapGetters、 mapActions、 mapMutations 辅助函数方便开发者在vm中处理store。具体构成关系如下:

vuex部件构成关系图

浅析vuex的使用

vuex的使用方式很简单,具体使用细节请参见 vuex官网,本文为了剖析源码方便,只进行简单介绍!我们只需要利用vue的use机制将 实例化后的store对象 注入vue实例即可!如下图:

vuex装载过程图解

核心代码如下:


Vue.use(Vuex); // 1. vue的插件机制,安装vuex
let store = new Vuex.Store({ // 2.实例化store,调用install方法
 	state,
 	getters,
 	modules,
 	mutations,
 	actions,
 	plugins
});
new Vue({ // 3.注入store, 挂载vue实例
	store,
	render: h=>h(app)
}).$mount('#app');

对vuex的疑问

我们在使用vuex对store进行管理的同时,不禁会问:

  • vuex的store是如何注入到组件中的?
  • vuex的state 和 getter 是如何映射到 各个组件实例中自动更新的?

本篇章旨在解决以上疑问,让我们一起深入vuex的原理,揭开vuex的神秘面纱吧!

探秘原理

本部分将针对以上疑问,通过源码分析,剖析核心代码,对问题进行解答。

疑问:vuex的store是如何注入到组件中的?

要解答这个问题,我们先从vuex的使用表象上着手,从上面的介绍我们知道,使用vuex之前我们要对vuex进行安装!核心代码如下:

Vue.use(Vuex); // vue的插件机制,安装vuex插件

源码分析
上面的代码得益于vue的插件机制,会在调用vuex的 install方法时,装载vuex! 所以我们直接关注 install方法的实现,其核心代码如下:

Vue.mixin({ beforeCreate: vuexInit });

可见,store注入 vue的实例组件的方式,是通过vue的 mixin机制,借助vue组件的生命周期 钩子 beforeCreate 完成的。即 每个vue组件实例化过程中,会在 beforeCreate 钩子前调用 vuexInit 方法。下面,我们将焦点聚焦在 vuexInit 函数。 下面为 vuexInit 的核心代码!

this.$store = typeof options.store === 'function'
    ? options.store()
    : options.store

该代码的核心问题是this的指向,得益于mixin机制,this将指向 vue组件实例!最终,我们可以再 vue组件实例上获得vuex 的store 对象的引用 $store!图示如下:

vuex装载原理图示
分析至此,我们已经得出该问题的答案!

结论

vuex利用了vue的mixin机制,混合 beforeCreate 钩子 将store注入至vue组件实例上,并注册了 vuex store的引用属性 $store!

对于其余问题的解答,请前往 深入vuex原理(下)