一文讲解Vuex实现原理
前言
对于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实现原理相关推荐
- 一文讲解图像插值算法原理!附Python实现
Datawhale学习 作者:姚童,Datawhale优秀学习者 寄语:本文梳理了最近邻插值法.双线性插值法和三次样条插值法的原理,并以图像缩放为例,对原理进行了C++及Python实现. 在图像处理 ...
- 转载:一文讲解图像插值算法原理
最近在研究插值算法,看到这篇CSDN博主Datawhale学习介绍的博文,觉得介绍得挺不错,转载过来.原文地址:https://blog.csdn.net/Datawhale/article/deta ...
- 一文讲解安卓应用软件开发有什么优势?
Android系统软件是目前市场上比较常见的应用软件,为了更好地适应市场的需求,很多企业都开发了自己独有的安卓系统软件,安卓应用软件开发一般要花多少钱?还有什么好处呢? 一文讲解安卓应用软件开发有什么 ...
- 一文讲解电源技术中的安森美深力科NCP1680AAD1R2G CrM PFC控制器IC 详情讲解
一文讲解电源技术中的安森美深力科NCP1680AAD1R2G NCP1680是一个CrM PFC控制器IC,用于驱动无桥图腾柱PFC拓扑结构.无桥图腾柱PFC是一种功率因数校正结构,包括一个以PWM开 ...
- 一文讲解单片机、ARM、MCU、DSP、FPGA、嵌入式错综复杂的关系
一文讲解单片机.ARM.MCU.DSP.FPGA.嵌入式错综复杂的关系 首先,"嵌入式"这是个概念,准确的定义没有,各个书上都有各自的定义.但是主要思想是一样的,就是相比较PC机这 ...
- 手写Vuex核心原理,再也不怕面试官问我Vuex原理
手写Vuex核心原理 文章目录 手写Vuex核心原理 一.核心原理 二.基本准备工作 三.剖析Vuex本质 四.分析Vue.use 五.完善install方法 六.实现Vuex的state 七.实现g ...
- 一文说尽 MySQL 优化原理
一文说尽 MySQL 优化原理 说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些 ...
- 【一文讲解深度学习】语言自然语言处理(NLP)第一篇
[一文讲解深度学习]语言自然语言处理(NLP) 博主介绍 自然语言处理概述 NLP 的定义 NLP的主要任务 分词 词义消歧 识别物体识别(NER) 词性标注(PoS) 文本分类 语言生成 问答(QA ...
- 面试挂在JVM?别慌,图文讲解JVM工作原理,看完还不懂我跪键盘
本文转载自:面试挂在JVM?别慌,图文讲解JVM工作原理,看完还不懂我跪键盘 JDK,JRE,JVM的联系是啥? JVM Java Virtual Machine JDK Java Developme ...
最新文章
- 【Git】Git 基础命令 ( 查看提交记录 git log | 版本回滚 git reset | 撤销回滚 git reflog )
- 彻底理解宽带信号在频域分解为窄带信号
- 选择结构_穿透的switch语句
- html超文本链接本页面,从HTML语言到网上家园 第三章 超文本链接(1)-网页设计,HTML/CSS...
- code删除前两个_听说用python来批量删除说说也挺快乐的呢~
- cdi 2.7.5_集成测试CDI 1.0和Spring 3.1中的作用域bean
- IBM软件服务创新运用 提升市民生活质量
- java 中violate_Java中的Volatile关键字
- openstack社区_OpenStack社区中发生了什么?
- 关于bn层的进一步认识
- jdk版本修改不生效
- CodeMirror自动提醒配置
- python word处理_Python 处理word期间遇到的问题
- 提高WordPress访问速度的十种方法
- html16进制颜色三位,十六进制RGB颜色表
- SpringMVC入门案例【三层架构和MVC、SpringMVC的概述和入门程序】(超详细)
- (数字IC)低功耗设计入门(二)——功耗的分析+Comments
- [JavaScript]基础知识复习题附答案
- Excel工作表单保护密码忘记如何找回
- 大厂的职级晋升答辩是什么 · 职级晋升系列