返回

vuex生命周期详解,揭秘vuex.use背后的故事

前端

在Vue中,vuex.use()是一个非常重要的函数,它使得我们可以使用vuex。那么,vuex.use()到底做了什么呢?

vuex.use()实际上调用了vuex.install()函数。vuex.install()函数做了以下几件事:

  1. 创建了一个vuex实例。
  2. 将vuex实例添加到Vue的原型上。
  3. 注册了vuex的mixin。
  4. 注册了vuex的mapState、mapActions、mapGetters和mapMutations。

下面我们来详细看一下vuex.install()函数的实现:

export function install (_Vue) {
  if (Vue && _Vue === Vue) {
    {
      warn(
        'already installed. Vue.use(Vuex) should be called only once.'
      )
    }
    return
  }
  Vue = _Vue
  applyMixin(Vue)
}

首先,vuex.install()函数会检查Vue是否存在,如果Vue存在并且等于_Vue,则说明vuex已经安装过了,因此会发出警告并返回。

如果Vue不存在或者Vue不等于_Vue,则说明vuex还没有安装,因此会执行以下操作:

  1. 将Vue赋值给Vue。
  2. 调用applyMixin(Vue)函数注册vuex的mixin。

applyMixin(Vue)函数的实现如下:

export function applyMixin (Vue) {
  // install store injection
  Vue.mixin({
    beforeCreate: vuexInit
  })
}

applyMixin(Vue)函数会注册一个mixin,这个mixin会在组件的beforeCreate钩子函数中调用vuexInit函数。vuexInit函数的实现如下:

export function vuexInit () {
  const options = this.$options
  if (options.store) {
    this.$store = typeof options.store === 'function'
      ? options.store()
      : options.store
  } else if (options.parent && options.parent.$store) {
    this.$store = options.parent.$store
  }
}

vuexInit函数会检查组件是否有store选项,如果有,则将store选项的值赋给组件的store属性。如果组件没有store选项,则会检查组件的父组件是否有store属性,如果有,则将父组件的store属性赋给组件的store属性。

这样,我们就完成了vuex的安装。

在vuex安装完成后,我们就可以在组件中使用vuex了。我们可以通过组件的$store属性来访问vuex实例。我们可以使用vuex实例来获取状态、提交mutation和分发action。

以上便是vuex.use()的实现原理。希望这篇文章能够帮助你更好地理解vuex.use()函数。