什么是Vuex?
专门为Vue开发的状态管理模式。采用集中存储管理应用的所有组件状态。在没有用Vuex的时候,我们在进行组件化开发时,数据(也就是状态一般都分散在各个组件中。加入我们要使用这些状态是,我们就得在不同组件中去取状态值,然后进行状态修改,最后还要相互读取对方状态值。
父子组件中:
我们可以通过事件触发/props进行状态传递。
子组件之间:
由于Vue本身组件之间有作用域,他们之间无法相互通信。这里就必须用单一时间管理(event bus)或者在所有组件和Vue对象下使用一个统一的Object作为数据,来实现。(实质:引用)。
如果项目较小还好,中大型项目,组件通信复杂频繁的时候,这两种方式管理起来就会十分麻烦,而且容易出错。
有了Vuex,它将数据单独放在一个store里,并提供给外部操作内部数据的方法。让我们能更好的管理项目里的状态。这也是Vuex出现的意义吧。就像官网说的:
Flux 架构就像眼镜:您自会知道什么时候需要它
正文
基本就是按官网的教程撸了一遍。记录一下自己觉得重要的内容。
Vuex 应用的核心就是 store(仓库)。”store” 基本上就是一个容器,它包含着你的应用中大部分的状态(state)。当然,在使用Vuex的同时,各个组件仍保有局部的状态:
使用Vuex,并不意味着你需要将所有的状态放入Vuex。
下面我们来按搭建一个小例子:
源码:https://github.com/laclys/vuex-demo
在Vue脚手架里面,在main.js中:
1 | import Vuex from 'vuex'; |
这里我们就创建了一个最简单的store,并且挂载在了Vue实例上。配置其实和vue-router挺像的。
State:就是单一状态树,将我们需要管理的状态在这里定义。
Mutations:更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutations 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。
要想在组件中使用。由于 Vuex 的状态存储是响应式的,从 store 实例中读取状态最简单的方法就是在计算属性中返回某个状态。
1 | computed: { |
通过要唤醒一个 mutation handler,你需要以相应的 type 调用 store.commit 方法。
在组件中:
1 | methods: { |
Getters:这个在上面的例子没有涉及到。我们可以认为Getters是Vuex在store中的计算属性。(Getters 接受 state 作为其第一个参数)
1 | const store = new Vuex.Store({ |
组件中调用:
1 | computed: { |
Actions: 类似于 mutation,不同在于:
1)Action 提交的是 mutation,而不是直接变更状态。
2)Action 可以包含任意异步操作。
Mutations中对状态的操作只能是同步操作,不能是异步操作。
1 | actions: { |
在组件中:
1 | methods: { |
说到异步,当然是支持promise以及 async / await 这个 JavaScript 即将到来的新特性:
这里说一下promise:
store.dispatch 可以处理被触发的action的回调函数返回的Promise,并且store.dispatch仍旧返回Promise
1 | decrementAsync({commit}) { |
组件中 我们就可以用链式then了:
1 | decrementAsync() { |
之后还有一个核心概念叫做Modules,顾名思义模块化。当项目非常的庞大,那么状态可能本身还需要进行分模块分类管理,这个时候就需要用到模块了。这里就不再赘言了。
以上