前言

 对于Vuex相信大家是常用,那么Vuex作为Vue生态中最重要的一部分,专为Vue.js应用的状态管理模式,每一个 Vuex 应用的核心就是 store(仓库)。“store” 基本上就是一个容器,它包含着你的应用中大部分的状态 ( state ),并且Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样可以方便地跟踪每一个状态的变化。

原理分析

Vuex装载分析

 这个问题实际就是问到Vuex的store是如何装载到组件中的,首先利用了Vue的插件机制使用Vue.use(Vuex)来去安装Vuex插件,那么此时会调用vuex的install方法,当调用install时此时会利用mixin机制在beforeCreate阶段去执行vuexInit。核心源码如下:

Vue.mixin({ beforeCreate: vuexInit });

 我们可以发现在beforeCreate阶段调用了vuexInit方法,我们分析一下vuexInit方法。

  /*** Vuex init hook, injected into each instances init hooks list.*/function vuexInit () {const options = this.$options// store injectionif (options.store) {this.$store = typeof options.store === 'function'? options.store(): options.store} else if (options.parent && options.parent.$store) {this.$store = options.parent.$store}}

 分析如上代码:将初始化Vue根组件时传入的store设置到this对象的$store属性上,子组件从其父组件引用$store属性,层层嵌套进行设置。在任意组件中执行 this.$store 都能找到装载的那个store对象。

Vuex中的state与getter

 vuex的Store 会划分出 state 和 getters 两个数据区。getter是从store的state中派生出的状态。那么首先我们先看我们是如何访问state的?

  get state () {return this._vm._data.$$state}

 当我们使用this.$store.state.xxx去获取xxx属性时,实际获取的是store挂载到_vm中store._vm.data.$$state中的数据。
 state是如何挂载上去的?我们在Store constructor找到了核心函数resetStoreVM,观察resetStoreVM的核心代码,其主要做的事情是初始化了一个vue实例_vm,由于vue的data是响应式的,所以,$$state也是响应式的,那么当我们 在一个组件实例中 对state.xxx进行 更新时,基于vue的data的响应式机制,所有相关组件的state.xxx的值都会自动更新,视图自然也会自动更新,核心代码如下:

  store._vm = new Vue({data: {$$state: state},computed})

 上面所介绍的是state,那么接下来我们介绍一下getter,其核心源码也是在
resetStoreVM中,核心源码如下:

  forEachValue(wrappedGetters, (fn, key) => {// use computed to leverage its lazy-caching mechanism// direct inline function use will lead to closure preserving oldVm.// using partial to return function with only arguments preserved in closure environment.computed[key] = partial(fn, store)Object.defineProperty(store.getters, key, {get: () => store._vm[key],enumerable: true // for local getters})})

 until.js的部分源码如下:

/*** forEach for object*/
export function forEachValue (obj, fn) {Object.keys(obj).forEach(key => fn(obj[key], key))
}
export function partial (fn, arg) {return function () {return fn(arg)}
}

 对wrappedGetters 进行处理,让getter 存储至computed对象上,对getter对象的属性进行数据劫持,当触发get时,返回store._vm[key],最后将computed挂载到vue实例上,当做计算属性。

  store._vm = new Vue({data: {$$state: state},computed})

总结

  • vuex利用了vue的mixin机制,混合 beforeCreate 钩子 将store注入至vue组件实例上,并注册了 vuex store的引用属性 $store。
  • vuex的state是借助vue的响应式data实现的。getter是借助vue的计算属性computed特性实现的。

Vue源码系列文章:

  • Vue源码学习之响应式原理
  • Vue源码学习之双向数据绑定原理
  • Vue源码学习之nextTick

一文讲解Vuex实现原理相关推荐

  1. 一文讲解图像插值算法原理!附Python实现

    Datawhale学习 作者:姚童,Datawhale优秀学习者 寄语:本文梳理了最近邻插值法.双线性插值法和三次样条插值法的原理,并以图像缩放为例,对原理进行了C++及Python实现. 在图像处理 ...

  2. 转载:一文讲解图像插值算法原理

    最近在研究插值算法,看到这篇CSDN博主Datawhale学习介绍的博文,觉得介绍得挺不错,转载过来.原文地址:https://blog.csdn.net/Datawhale/article/deta ...

  3. 一文讲解安卓应用软件开发有什么优势?

    Android系统软件是目前市场上比较常见的应用软件,为了更好地适应市场的需求,很多企业都开发了自己独有的安卓系统软件,安卓应用软件开发一般要花多少钱?还有什么好处呢? 一文讲解安卓应用软件开发有什么 ...

  4. 一文讲解电源技术中的安森美深力科NCP1680AAD1R2G CrM PFC控制器IC 详情讲解

    一文讲解电源技术中的安森美深力科NCP1680AAD1R2G NCP1680是一个CrM PFC控制器IC,用于驱动无桥图腾柱PFC拓扑结构.无桥图腾柱PFC是一种功率因数校正结构,包括一个以PWM开 ...

  5. 一文讲解单片机、ARM、MCU、DSP、FPGA、嵌入式错综复杂的关系

    一文讲解单片机.ARM.MCU.DSP.FPGA.嵌入式错综复杂的关系 首先,"嵌入式"这是个概念,准确的定义没有,各个书上都有各自的定义.但是主要思想是一样的,就是相比较PC机这 ...

  6. 手写Vuex核心原理,再也不怕面试官问我Vuex原理

    手写Vuex核心原理 文章目录 手写Vuex核心原理 一.核心原理 二.基本准备工作 三.剖析Vuex本质 四.分析Vue.use 五.完善install方法 六.实现Vuex的state 七.实现g ...

  7. 一文说尽 MySQL 优化原理

    一文说尽 MySQL 优化原理 说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些 ...

  8. 【一文讲解深度学习】语言自然语言处理(NLP)第一篇

    [一文讲解深度学习]语言自然语言处理(NLP) 博主介绍 自然语言处理概述 NLP 的定义 NLP的主要任务 分词 词义消歧 识别物体识别(NER) 词性标注(PoS) 文本分类 语言生成 问答(QA ...

  9. 面试挂在JVM?别慌,图文讲解JVM工作原理,看完还不懂我跪键盘

    本文转载自:面试挂在JVM?别慌,图文讲解JVM工作原理,看完还不懂我跪键盘 JDK,JRE,JVM的联系是啥? JVM Java Virtual Machine JDK Java Developme ...

最新文章

  1. 【Git】Git 基础命令 ( 查看提交记录 git log | 版本回滚 git reset | 撤销回滚 git reflog )
  2. 彻底理解宽带信号在频域分解为窄带信号
  3. 选择结构_穿透的switch语句
  4. html超文本链接本页面,从HTML语言到网上家园 第三章 超文本链接(1)-网页设计,HTML/CSS...
  5. code删除前两个_听说用python来批量删除说说也挺快乐的呢~
  6. cdi 2.7.5_集成测试CDI 1.0和Spring 3.1中的作用域bean
  7. IBM软件服务创新运用 提升市民生活质量
  8. java 中violate_Java中的Volatile关键字
  9. openstack社区_OpenStack社区中发生了什么?
  10. 关于bn层的进一步认识
  11. jdk版本修改不生效
  12. CodeMirror自动提醒配置
  13. python word处理_Python 处理word期间遇到的问题
  14. 提高WordPress访问速度的十种方法
  15. html16进制颜色三位,十六进制RGB颜色表
  16. SpringMVC入门案例【三层架构和MVC、SpringMVC的概述和入门程序】(超详细)
  17. (数字IC)低功耗设计入门(二)——功耗的分析+Comments
  18. [JavaScript]基础知识复习题附答案
  19. Excel工作表单保护密码忘记如何找回
  20. 大厂的职级晋升答辩是什么 · 职级晋升系列

热门文章

  1. 四个/24地址块,试进行最大可能的聚合
  2. SQL Server 复制表及数据的两种方法
  3. Java内功心法,创建型设计模式包括哪些
  4. 配置 nginx 解析 php
  5. JMeter进行并发测试参数化
  6. 共享汽车倒闭大讨债:打砸办公室、围堵创始人...途歌的1500元你退了吗?
  7. Wi-Fi感知应用逐步进入实际生活---乐鑫公司推出的ESP-WIFI-CSI智能人体感知方案
  8. B站av_BV号转换算法(C语言版)
  9. MTK平台AEE_AED分析
  10. 摄像头网页服务器,js调用本地摄像头拍照并上传到web服务器