一、Vuex是什么

Vuex是专门为Vuejs应用程序设计的状态管理工具。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

1、Vuex的构成

由上图,我们可以看出Vuex有以下几个部分构成:

1)state

state是存储的单一状态,是存储的基本数据。

2)Getters

getters是store的计算属性,对state的加工,是派生出来的数据。就像computed计算属性一样,getter返回的值会根据它的依赖被缓存起来,且只有当它的依赖值发生改变才会被重新计算。

3)Mutations

mutations提交更改数据,使用store.commit方法更改state存储的状态。(mutations同步函数)

4)Actions

actions像一个装饰器,提交mutation,而不是直接变更状态。(actions可以包含任何异步操作)

5)Module

Module是store分割的模块,每个模块拥有自己的state、getters、mutations、actions。

const moduleA = {state: { ... },mutations: { ... },actions: { ... },getters: { ... }
}const moduleB = {state: { ... },mutations: { ... },actions: { ... }
}const store = new Vuex.Store({modules: {a: moduleA,b: moduleB}
})store.state.a // -> moduleA 的状态
store.state.b // -> moduleB 的状态

6)辅助函数

Vuex提供了mapState、MapGetters、MapActions、mapMutations等辅助函数给开发在vm中处理store。

2、Vuex的使用

import Vuex from 'vuex';
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的设计思想,借鉴了Flux、Redux,将数据存放到全局的store,再将store挂载到每个vue实例组件中,利用Vue.js的细粒度数据响应机制来进行高效的状态更新。

看了Vuex设计思想,心里难免会有这样的疑问:

  • vuex的store是如何挂载注入到组件中呢?
  • vuex的state和getters是如何映射到各个组件实例中响应式更新状态呢?

三、Vuex的原理解析

我们来看下vuex的源码,分析看看上面2个疑惑的问题:

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

1、在vue项目中先安装vuex,核心代码如下:

import Vuex from 'vuex';
Vue.use(vuex);// vue的插件机制

2、利用vue的插件机制,使用Vue.use(vuex)时,会调用vuex的install方法,装载vuex,install方法的代码如下:

export function install (_Vue) {if (Vue && _Vue === Vue) {if (process.env.NODE_ENV !== 'production') {console.error('[vuex] already installed. Vue.use(Vuex) should be called only once.')}return}Vue = _VueapplyMixin(Vue)
}

3、applyMixin方法使用vue混入机制,vue的生命周期beforeCreate钩子函数前混入vuexInit方法,核心代码如下:

Vue.mixin({ beforeCreate: vuexInit });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}
}

分析源码,我们知道了vuex是利用vue的mixin混入机制,在beforeCreate钩子前混入vuexInit方法,vuexInit方法实现了store注入vue组件实例,并注册了vuex store的引用属性$store。store注入过程如下图所示:

疑问2:vuex的state和getters是如何映射到各个组件实例中响应式更新状态呢?

store实现的源码在src/store.js

1、我们在源码中找到resetStoreVM核心方法:

function resetStoreVM (store, state, hot) {const oldVm = store._vm// 设置 getters 属性store.getters = {}const wrappedGetters = store._wrappedGettersconst computed = {}// 遍历 wrappedGetters 属性forEachValue(wrappedGetters, (fn, key) => {// 给 computed 对象添加属性computed[key] = partial(fn, store)// 重写 get 方法// store.getters.xx 其实是访问了store._vm[xx],其中添加 computed 属性Object.defineProperty(store.getters, key, {get: () => store._vm[key],enumerable: true // for local getters})})const silent = Vue.config.silentVue.config.silent = true// 创建Vue实例来保存state,同时让state变成响应式// store._vm._data.$$state = store.statestore._vm = new Vue({data: {$$state: state},computed})Vue.config.silent = silent// 只能通过commit方式更改状态if (store.strict) {enableStrictMode(store)}
}

从上面源码,我们可以看出Vuex的state状态是响应式,是借助vue的data是响应式,将state存入vue实例组件的data中;Vuex的getters则是借助vue的计算属性computed实现数据实时监听。
computed计算属性监听data数据变更主要经历以下几个过程:

小结

Vuex是通过全局注入store对象,来实现组件间的状态共享。在大型复杂的项目中(多级组件嵌套),需要实现一个组件更改某个数据,多个组件自动获取更改后的数据进行业务逻辑处理,这时候使用vuex比较合适。假如只是多个组件间传递数据,使用vuex未免有点大材小用,其实只用使用组件间常用的通信方法即可。

Vue组件简单常用的通信方式有以下几种:
1、父子通信:
父向子传值,通过props;子向父传值通过events ($emit);父调用子方法通过ref;provide / inject。
2、兄弟通信:bus
3、跨级嵌套通信:bus;provide / inject等。

作者:小铭子

链接:http://www.imooc.com/article/291242

vuex mapstate_Vuex从使用到原理解析相关推荐

  1. 音乐、视频播放模式切换实现方案及原理解析(基于vue、vuex、h5 audio)

    音乐.视频播放模式切换实现方案及原理解析(基于vue.vuex.h5 audio) 播放模式有三种: 顺序播放 随机播放 单曲循环 定义为一个playMode对象并向外暴露,内含三种播放模式,即为: ...

  2. Vuex原理解析实现

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

  3. Vuex 状态管理的工作原理

    Vuex 状态管理的工作原理 为什么要使用 Vuex 当我们使用 Vue.js 来开发一个单页应用时,经常会遇到一些组件间共享的数据或状态,或是需要通过 props 深层传递的一些数据.在应用规模较小 ...

  4. Kbone原理解析与小程序技术选型

    作者 | 马倩 来源 | https://developers.weixin.qq.com/community/develop/article/doc/0006a6326b8d38e56b998833 ...

  5. Spark Shuffle原理解析

    Spark Shuffle原理解析 一:到底什么是Shuffle? Shuffle中文翻译为"洗牌",需要Shuffle的关键性原因是某种具有共同特征的数据需要最终汇聚到一个计算节 ...

  6. 秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)

    2019独角兽企业重金招聘Python工程师标准>>> 上节概要: 上节 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六)  中, 介绍了 ...

  7. Tomcat 架构原理解析到架构设计借鉴

    ‍ 点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 Tomcat 架构原理解析到架构设计借鉴 Tomcat 发展这 ...

  8. 秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五)...

    文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色 ...

  9. CSS实现元素居中原理解析

    原文:CSS实现元素居中原理解析 在 CSS 中要设置元素水平垂直居中是一个非常常见的需求了.但就是这样一个从理论上来看似乎实现起来极其简单的,在实践中,它往往难住了很多人. 让元素水平居中相对比较简 ...

最新文章

  1. 别光顾着背单词了,每天花18分钟做这件事,英语水平暴增!
  2. 串联矩阵matlab代码,Matlab串联矩阵函数【horzcat】详细解析
  3. scala与python混合调用实验
  4. 私人仓库免费后本地git和远程github首次连接
  5. HighCharts报表 API
  6. 使用STAD研究product搜索和保存的性能
  7. relative布局html,CSS的四种布局方式static/relative/fixed/absolute
  8. java 上传 进度,关于 javaweb的文件上传实时显示进度
  9. 【ElasticSearch】在 ELASTICSEARCH 中使用管道重新索引数据 pipeline
  10. 输出结果为16的python表达式_第一周作业(rayco)
  11. js 去除空格与换行
  12. 幻想三国android官方版,幻想三国ol官方版
  13. 与计算机相关活动主题,计算机文化节活动策划书
  14. 富有哲理的12条大数据金句
  15. 浪潮发布PS Cloud 开源+云ERP会给中小企业带来哪些红利?
  16. python_6_17
  17. Java学习_Day 02(学习内容:狂神说JAVA零基础P12-P17)
  18. OpenERP开发文档 2.1.模块开发
  19. 给菜鸟站长的全面易懂的建站教程!
  20. JAVA 线程池工作原理 图解

热门文章

  1. 网页header 的 meta使用
  2. 更好的设计你的 REST API
  3. 抛弃jQuery 深入原生的JavaScript
  4. linux到windows的ssh,ssh如何使用pxsh从linux到windows
  5. powerdesigner错误提示实体属性名称唯一性_SolidWorks用保存实体创建新零件与装配体...
  6. XML常用的几种解析方式
  7. mysql增加列并增加comment_运城多条高铁线路调整动车列数增加到99列
  8. 优动漫PAINT--草地教程
  9. 深入理解jQuery中的Deferred
  10. soliworks三维机柜布局(三)绘制电气线路图