vuex原理

281 阅读1分钟

## vuex原理了解下
  • vuex作为vue生态的重要组成部分,是对仓库store进行管理的,也就是vuex是vue的状态管理器。使用vuex可以使数据流变得清晰,可追踪。可预测,更可以简单的实现类似时刻穿梭等高级功能,对于大型项目来说,vuex尤为重要,对于 store的切分、store的module化、store的变更、store的追踪 等等 store的管理工作,使用vuex 管理store会大大提高项目的稳定性,扩展性。
  • vuex 引入 State、Getter 的概念对状态进行定义;使用 Mutation 和 Action对状态进行变更;引入Module对状态进行模块化分割;引入插件对状态进行快照、记录、以及追踪等;提供了mapState、mapGetters、 mapActions、 mapMutations 辅助函数方便开发者在vm中处理store。

vux核心代码如下:

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:

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

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

Vue.mixin({ beforeCreate: vuexInit });

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

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

this.$store.state.user / 仓库状态
this.$store.commit() /改变状态
this.$store.dispath() /获取数据
  • vue中组件通信
  1. 通过props向子组件发送信息:父-->子
  2. 通过实践向父组件发送消息:子——>父,使用$emit发送事件
  3. 父链 和 子索引:
this.$parent 与 this.$children
  1. 依赖注入:provide 和 inject
  2. 子组件引用: ref与$refs
  3. 特性绑定:
v-bind="$attrs" 和 v-on="$listeners"
  • vuex的state 和 getter 是如何映射到 各个组件实例中自动更新的

  • 使用 我们探讨的是state 和 getter,首先我们先来看一下在vue组件中如何方便的获取 vuex的state和getter

this.$store.state.xxx;
this.$store.state.moduleA.xxx;

this.$store.getters.xxx;
this.$store.getters.moduleA.xxx;
  • vuex的Store 会划分出 state 和 getters 两个数据区。getter是从store的state中派生出的状态!代码如下:
// 初始化store时,划分出 state数据区 与 getters数据区
new Vuex.Store({state, getters});

源码分析

  • 首先,我们先来看state。从源码中我们找到了state的get方法,如下:
get state () {
    return this._vm._data.$$state
  }
  • 从源码得知,在vue组件中 使用 this.store.getters.xxx 获取 xxx 属性时,实际上是获取的store._vm.data.$state 对象上的同名属性。那么我们将关注点放在 _vm上。我们通过Store 的constructor 找到了处理state 和 getter的核心函数resetStoreVM(this, state)。其核心代码如下:
store._vm = new Vue({
    data: {
      $$state: state
    }
  })