1.首先,我们先了解什么是Vuex,Vuex 是一个专为 Vue.js 应用程序开发的**状态管理模式**。
这个状态自管理应用包含以下几个部分:
* **state**,驱动应用的数据源;
* **view**,以声明方式将**state**映射到视图;
* **actions**,响应在**view**上的用户输入导致的状态变化。
如果您的应用够简单,您最好不要使用 Vuex。一个简单的[store 模式](https://cn.vuejs.org/v2/guide/state-management.html#%E7%AE%80%E5%8D%95%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86%E8%B5%B7%E6%AD%A5%E4%BD%BF%E7%94%A8)就足够您所需了。但是,如果您需要构建一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。
2.接下来,我们开始安装Vuex,使用命令:`npm install vuex --save`
安装成功后,我们在src目录下新建 store 文件夹,然后新建 index.js 文件,目录结构如下
![](https://img.kancloud.cn/91/1b/911b9227ee95e01f24755ab40e9d2b63_246x195.png)
在store/index.js文件中,创建vuex实例
```
~~~
import Vue from 'vue' // 引入vue
import Vuex from 'vuex' // 引入vuex
// 使用vuex
Vue.use(Vuex)
// 创建vuex实例
const store = new Vuex.Store({
})
export default store // 导出store
~~~
```
![](https://img.kancloud.cn/d8/58/d8588fcbe97202acec72729613ab0602_571x289.png)
3.然后,在main.js中引入该文件
![](https://img.kancloud.cn/54/c3/54c3f2ff96d298701c10e5e89ab0d651_686x527.png)
4.开始我们的vuex业务代码
### State
vuex的数据源,我们需要保存的数据保存在这里,在页面通过 this.$store.state来获取数据
![](https://img.kancloud.cn/f8/d0/f8d030d5fed02988b055a61ad2161363_504x274.png)
*****
![](https://img.kancloud.cn/1c/64/1c648360e374d1eb3fbacf7a6d8dcc74_662x137.png)
*****
![](https://img.kancloud.cn/01/a1/01a1ba568ce83a3b4be46f0dd85d6e18_516x237.png)
当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余,我们可以使用`mapState`辅助函数帮助我们生成计算属性。
![](https://img.kancloud.cn/7f/d0/7fd005b4059aeebfabdec10b0b55b13e_596x451.png)
这样就简便很多啦
### Getter
Vuex 允许我们在 store 中定义“getter”(可以认为是 store 的[计算属性](https://cn.vuejs.org/v2/guide/computed.html)))。就像计算属性一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
![](https://img.kancloud.cn/62/98/6298b6a20d8f19fbb4e6c0be7b3a961d_630x384.png)
*****
![](https://img.kancloud.cn/d9/15/d9157e83603c2dd4f3bcd17f30803e65_1090x169.png)
*****
![](https://img.kancloud.cn/f9/a6/f9a69e6318115ea442c7da66546cb341_468x198.png)
`mapGetters`辅助函数
![](https://img.kancloud.cn/7b/48/7b48a31cad3df3a25e8f2de013735b4a_829x520.png)
### Mutation
如果我们需要修改count值,那就需要mutation,更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。
![](https://img.kancloud.cn/30/44/3044763cbb431582786e73f83bef0002_611x558.png)
count加1,减1
![](https://img.kancloud.cn/42/c5/42c5acaa35b26416c41c2b0e11a0e8f6_1096x569.png)
点击按钮运行效果
![](https://img.kancloud.cn/4f/b3/4fb399bc876dd2633066bfecfd961b15_700x380.gif)
### Action
Action 类似于 mutation,不同在于:
* Action 提交的是 mutation,而不是直接变更状态。
* Action 可以包含任意异步操作。
* mutation 必须同步执行,Action 就不受约束!我们可以在 action 内部执行异步操作
![](https://img.kancloud.cn/dc/29/dc294f1af0634b127e80077b619e8905_977x703.png)
![](https://img.kancloud.cn/f8/b8/f8b85e8eff2bf422ce6c15bcea968a2d_1066x610.png)
运行结果
![](https://img.kancloud.cn/ea/14/ea1451b11a72eb2c6a4b774d6ad898f9_700x380.gif)
我们还可以自定义参数,控制每次点击增加或减少的数量
![](https://img.kancloud.cn/54/44/544464d3dd05feb2b2c54b553231714f_952x748.png)
![](https://img.kancloud.cn/c5/eb/c5ebb0198ebfd45b87b7532cb2318ab3_1027x598.png)
运行结果
![](https://img.kancloud.cn/b5/43/b543fa964687ef740f0e92ab959f2595_700x380.gif)