汪图南
  • RAG

    • RAG
  • 快速入门
  • 高级技巧
前端面试之道
  • 打包工具

    • Webpack
    • Rollup
  • TypeScript

    • TypeScript基础
    • TypeScript类型挑战
  • CSS预编译器

    • SASS
  • 自动化测试

    • Vue应用测试
  • Vue2.0源码分析
  • Vue3.0源码分析
  • 数据结构和算法(基础)
  • LeetCode(刷题)
  • JavaScript书籍

    • 你不知道的JavaScript(上)
    • 你不知道的JavaScript(中下)
    • JavaScript数据结构和算法
    • JavaScript设计模式与开发实践
    • 深入理解ES6
  • Git书籍

    • 精通Git
Github
  • RAG

    • RAG
  • 快速入门
  • 高级技巧
前端面试之道
  • 打包工具

    • Webpack
    • Rollup
  • TypeScript

    • TypeScript基础
    • TypeScript类型挑战
  • CSS预编译器

    • SASS
  • 自动化测试

    • Vue应用测试
  • Vue2.0源码分析
  • Vue3.0源码分析
  • 数据结构和算法(基础)
  • LeetCode(刷题)
  • JavaScript书籍

    • 你不知道的JavaScript(上)
    • 你不知道的JavaScript(中下)
    • JavaScript数据结构和算法
    • JavaScript设计模式与开发实践
    • 深入理解ES6
  • Git书籍

    • 精通Git
Github
  • 介绍

    • 介绍和参考
  • 源码目录设计和架构设计

    • 设计
  • Rollup构建版本

    • Rollup基础知识
    • Vue中的Rollup构建
  • 从入口到构造函数整体流程

    • 整体流程
    • initGlobalAPI流程
    • initMixin流程
    • stateMixin流程
    • eventsMixin流程
    • lifecycleMixin流程
    • renderMixin流程
  • 响应式原理

    • 介绍
    • 前置核心概念
    • props处理
    • methods处理
    • data处理
    • computed处理
    • watch处理
    • 深入响应式原理
    • 依赖收集
    • 派发更新
    • nextTick实现原理
    • 变化侦测注意事项
    • 变化侦测API实现
  • 虚拟DOM和VNode

    • 虚拟DOM
    • VNode介绍
    • Diff算法
  • 组件化

    • 介绍
    • $mount方法
    • render和renderProxy
    • createElement
    • createComponent
    • 合并策略
    • update和patch
    • 组件生命周期
    • 组件注册
  • 编译原理

    • 介绍
    • compileToFunctions
    • parse模板解析
    • optimize优化
    • codegen代码生成
  • 扩展

    • 扩展
    • directive指令
    • filter过滤器
    • event事件处理
    • v-model
    • 插槽
    • Keep-Alive
    • Transition
    • Transition-Group
    • Vue.use插件机制
  • Vue-Router

    • 介绍
    • 路由安装
    • matcher介绍
    • 路由切换
    • 内置组件
    • 路由hooks钩子函数
  • Vuex

    • 介绍
    • Vuex安装
    • Vuex初始化
    • Vuex辅助API
    • Store实例API

Vuex安装

由于Vuex也属于Vue的插件,因此我们在使用Vuex的时候,需要使用Vue.use()方法进行注册。

在store.js中其代码如下:

// store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

根据Vue插件机制原理,插件需要提供一个install方法,在Vuex源码中,install的代码路径为src/store.js,其实现代码如下:

import applyMixin from './mixin'

let Vue
export function install (_Vue) {
  if (Vue && _Vue === Vue) {
    if (__DEV__) {
      console.error(
        '[vuex] already installed. Vue.use(Vuex) should be called only once.'
      )
    }
    return
  }
  Vue = _Vue
  applyMixin(Vue)
}

在这个方法中,它所做的事情很简单,第一个就是把我们传递的Vue实例缓存起来,以方便后续实例化Store的时候使用。第二件事情就是调用applyMixin方法,此方法代码路径为src/mixin.js。

// mixin.js文件
export default function (Vue) {
  const version = Number(Vue.version.split('.')[0])
  if (version >= 2) {
    Vue.mixin({ beforeCreate: vuexInit })
  } else {
    // 省略Vue1.0+版本逻辑
  }
}

因为我们Vue源码分析是基于Vue2.6.11,因此我们省略关于else分支的逻辑。

当Vue的版本高于2.0时,它会调用Vue.mixin()方法全局混入一个beforeCreate生命周期,当beforeCreate生命周期执行的时候,会调用vuexInit,其代码如下:

// vuexInit中的this代表当前Vue实例
function vuexInit () {
  const options = this.$options
  // store injection
  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
  }
}

在入口main.js文件中,我们有这样一段代码:

// main.js
import store from './store'

new Vue({
  el: '#app',
  store
})

我们在vuexInit方法中拿到的options.store就是我们传入的store,我们再来把目光跳转到store.js文件中,其代码如下:

// store.js
import Vuex from 'vuex'

export default new Vuex.Store({})

原来我们在根实例中传递的是一个Store实例,这样我们就明白了vuexInit方法的主要作用了:给每一个Vue实例都赋值一个$store属性。

这样,我们在组件中就不用去手动引入store了,而是可以直接使用$store,例如:

<template>
  <div>{{$store.state.xxx}}</div>
</template>
最后更新时间: 2025/5/6 15:36
贡献者: wangtunan
Prev
介绍
Next
Vuex初始化