前言

vuex作为vue生态的重要组成部分,是对store进行管理的一柄利剑。简而言之,vuex是vue的状态管理器。使用vuex可用使数据流变得清晰、可追踪、可预测,更可以简单的实现 类似时光穿梭 等高级功能,对于复杂的大型应用来讲,vuex将变得尤为重要,对于 store的切分、store的module化、store的变更、store的追踪 等等 store的管理工作,使用vuex 管理store会大大提高项目的稳定性,扩展性!本篇将通过vuex的源码对vuex 的设计以及实现原理 进行剖析!


注:本篇文章只展示关键核心代码,一来由于篇幅原因,二来展示核心代码更容易让人理解!再者,本篇属于 vuex 高级篇,对于本篇章中 涉及的 vue 相关的机制 以及 vuex的 高级使用 等 不进行过多赘述!请自行前往官网查看!


准备

浅析vuex的构成

vuex 引入 StateGetter 的概念对状态进行定义;使用 MutationAction对状态进行变更;引入Module对状态进行模块化分割;引入插件对状态进行快照、记录、以及追踪等;提供了mapState、mapGetters、 mapActions、 mapMutations 辅助函数方便开发者在vm中处理store。具体构成关系如下:

浅析vuex的使用

vuex的使用方式很简单,具体使用细节请参见 vuex官网,本文为了剖析源码方便,只进行简单介绍!我们只需要利用vue的use机制将 实例化后的store对象 注入vue实例即可!如下图:

核心代码如下:


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的疑问

我们在使用vuex对store进行管理的同时,不禁会问:

  • vuex的store是如何注入到组件中的?
  • vuex的state 和 getter 是如何映射到 各个组件实例中自动更新的?

本篇章旨在解决以上疑问,让我们一起深入vuex的原理,揭开vuex的神秘面纱吧!

探秘原理

本部分将针对以上疑问,通过源码分析,剖析核心代码,对问题进行解答。

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

要解答这个问题,我们先从vuex的使用表象上着手,从上面的介绍我们知道,使用vuex之前我们要对vuex进行安装!核心代码如下:

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

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

Vue.mixin({ beforeCreate: vuexInit });
复制代码

可见,store注入 vue的实例组件的方式,是通过vue的 mixin机制,借助vue组件的生命周期 钩子 beforeCreate 完成的。即 每个vue组件实例化过程中,会在 beforeCreate 钩子前调用 vuexInit 方法。下面,我们将焦点聚焦在 vuexInit 函数。 下面为 vuexInit 的核心代码!

this.$store = typeof options.store === 'function'? options.store(): options.store
复制代码

该代码的核心问题是this的指向,得益于mixin机制,this将指向 vue组件实例!最终,我们可以再 vue组件实例上获得vuex 的store 对象的引用 $store!图示如下:

分析至此,我们已经得出该问题的答案!

结论

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

对于其余问题的解答,请前往 深入vuex原理(下)

转载于:https://juejin.im/post/5c779b7df265da2da771e052

深入vuex原理(上)相关推荐

  1. vuex 源码分析_深入Vuex原理(上)

    原标题:深入Vuex原理(上) 孔维国,2016年加入去哪儿网技术团队.目前在大住宿事业部/增值业务研发中心,参与开发了TMC.CRM.QTA.Auth等项目,负责node框架nomi的设计以及开发. ...

  2. 遇见面试--vuex原理

    遇见面试 Vuex原理解析 一.前言 自从学习了VUE框架,其中必不可少的会用到vuex这个核心插件,而且在做项目的时候,基本都会使用,可能你会使用vuex状态管理,但是对vuex原理存在着或多或少的 ...

  3. Vuex原理理解及实现

    Vuex是什么? 官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 个人理解:Vu ...

  4. Vuex原理解析实现

    Vuex是基于Vue的响应式原理基础,所以无法拿出来单独使用,必须在Vue的基础之上使用. 1.Vuex使用相关解析 main.js import store form './store' // 引入 ...

  5. 组件通信及vuex原理

    组件通信方式 父子组件通信 常用:props/$emit 父传子: 通过props向子组件传值.调用子组件时,可以用 静态传递 或者 使用 v-bind动态传递,子组件用props接受使用. 子传父: ...

  6. 【中级软考】计算能力足够强大,所有加密算法原理上都会被破解吗?

    结论: 是的 但: 在信息技术领域,为达成既定目标选择做某事或不做某事.选择走某路线或不走某路线,性价比是一个极其重要的考虑因素.不做不等于落后. 引用文章:计算能力足够强大,所有加密算法原理上都会被 ...

  7. 从原理上理解MySQL的优化建议

    概述 自从学习 MySQL 以来,我们一直听到或者看到很多优化建议,比如说不要用 select * 查询,用什么字段就查什么字段:建议用自增主键来作为表的主键,等等.这些建议听得很多感觉都成了 MyS ...

  8. 经济学原理上中国故事2019尔雅满分答案

    经济学原理上中国故事2019尔雅满分答案 1.1为什么要学习经济学(上) 1 [单选题]经济学最好的定义是对(A)的研究. A.社会如何管理其稀缺资源 B.如何按最盈利的方式经营企业 C.如何预测通货 ...

  9. 【红外相机和普通网络摄像头夜视功能在夜视原理上的区别)】

    红外相机和普通网络摄像头夜视功能在夜视原理上的区别 提出问题 红外相机 网络摄像头的夜视功能 总结 提出问题 少则上万多则几十万红外相机夜视效果也只能看到物体或人体的轮廓特征,但是那些几十.几百块钱的 ...

最新文章

  1. 2021年大数据Kafka(五):❤️Kafka的java API编写❤️
  2. Reinhold就Jigsaw投票一事向JCP提交公开信
  3. 1.%@Page%中的Codebehind、AutoEventWireup、Inherits有何作用?
  4. 谁能给我提供一个类似下面的网站模板,先谢了
  5. python设计模式4-建造者模式
  6. oracle中的hint是什么,SQL优化过程中常见Oracle中HINT的30个用法
  7. ARM裸机开发(三)SDRAM编程
  8. openlayers5学习笔记-map事件(moveend)
  9. 【机器学习】逻辑回归算法
  10. 电脑网页如何截取全图(长图)
  11. 知识分享之Golang——在Golang中unicode码和中文的互相转换函数
  12. 分治策略-股票获取最大收益-最大子数组问题
  13. 12抽象工厂(Abstract Factory)
  14. C++经典算法题-循序搜寻法(使用卫兵)
  15. 【gym 101991 E】(ACPC 2018) E. Exciting Menus 题解
  16. php memcached 性能测试,多种方法实时监测 Memcached 命中率
  17. 【HTML + CSS】模仿腾讯云页面——细节优化
  18. oracle数据库:查询平均分时,保留小数位数
  19. 推荐16个下载超酷脚本的免费热门网站
  20. Access denied for user 'mysql用户名'@'主机或IP' (using password: YES)'

热门文章

  1. CSS中属性个属性值怎么区分,[CSS] 详细解释 @media 属性与 (max
  2. linux xorg.0.log,Red Hat无法登录,Cannot open log file /var/log/Xorg.0.log
  3. MyEclipse 10.5 安装SVN插件
  4. 学习笔记6-小项目-走迷宫、推箱子
  5. e4a服务器文件,e4a链接网站服务器
  6. 树状数组的相关知识 及 求逆序对的运用
  7. 紧急不代表重要:管理时间的六个秘密
  8. 对比Ruby和Python的垃圾回收(2):代式垃圾回收机制
  9. OpenCL memory object 之 Global memory (2)
  10. 加薪——爱你在心口难开