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

  在我看来vuex就是把需要共享的变量全部存储在一个对象里面,然后将这个对象放在顶层组件中供其他组件使用。换种说法,将vue想作是一个js文件、组件是函数,那么vuex就是一个全局变量,只是这个“全局变量”包含了一些特定的规则而已。
  在vue的组件开发中,经常会遇到需要将当前组件的状态传递给其他组件。父子间通信时,我们会采用props + emit 这种方式,但当通信双方不是父子组件甚至压根不存在相关联系,或者一个状态需要共享给多个组件时,就会非常麻烦,数据也会难维护,这对开发不友好。vuex这个时候就很实用,不过在使用vuex之后也带来了更多的概念和框架。

 1 const store = new Vuex.Store({
 2     state: {
 3         name: 'wangjk',
 4         age: 22
 5     },
 6     getters: {
 7         personInfo(state) {
 8             return `My name is ${state.name}, I am ${state.age}`;
 9         }
10     }
11     mutations: {
12         SET_AGE(state, age) {
13             commit(age, age);
14         }
15     },
16     actions: {
17         nameAsyn({commit}) {
18             setTimeout(() => {
19                 commit('SET_AGE', 18);
20             }, 1000);
21         }
22     },
23     modules: {
24         a: modulesA
25     }
26 }

 

上面的就是一份最基本也是最完整的vuex代码;vuex包含有五个基本的对象:
(1)state : 存储状态,也就是变量;
(2)getters : 派生状态,也就是set 、get 中的get , 有两个可选的参数 : state 、getters分别可以获取state中的变量和其他的getters。外部调用方式:store.getters.personInfo()。就和vue的computed差不多;
(3)mutations : 提交状态修改。也就是set、get中的set,这是vuex中唯一修改state的方式。但不支持异步操作。第一个参数默认是state。外部调用方式:store.commit('SET_AGE',18)。和vue中的methods类似。
(4)actions : 和mutations类似。不过actions支持异步操作。第一个参数默认是和store具有相同参数属性的对象。外部调用方式:store.dispatch('nameAsyn')
(5)mudules : store的子模块,内容就相当于是store的一个实例。调用方式和前面介绍的相似,只是要加上当前子模块名,如:store.a.getters.xxx()

vue-cli中使用vuex的方式

一般来讲,我们都会采用vue-cli来进行实际的开发,在vue-cli中,开发和调用方式稍微不同。

 1 ├── index.html
 2 ├── main.js
 3 ├── components
 4 └── store
 5 ├── index.js # 我们组装模块并导出 store 的地方
 6 ├── state.js # 跟级别的 state
 7 ├── getters.js # 跟级别的 getter
 8 ├── const.js # 根级别的mutations名称(官方推荐mutions方法名使用大写)
 9 ├── mutations.js # 根级别的 mutation
10 ├── actions.js # 根级别的 action
11 └── modules
12 ├── m1.js # 模块1
13 └── m2.js # 模块2

下面为示例:

state.js

1 const state = {
2     name : 'yuandd',
3     age : 23    
4 } 
5 
6 export default state;

getter.js(我们一般使用getters来获取state的状态,而不是直接使用state)

 1 export const name = (state) => {
 2     return state.name;
 3 }
 4 
 5 export const age = (state) =>{
 6     return state.age;
 7 }
 8 
 9 export const other = (state) =>{
10     return 'My name is ${state.name}, I am ${state.age}'
11 }

const.js(我们会将所有mutations的函数名放在这个文件里)

1 const SET_NAME = 'SET_NAME';
2 const SET_AGE = 'SET_AGE';
3
4 export {
5 SET_NAME,
6 SET_AGE
7 }

mutations.js

 1 import const SET_NAME = 'SET_NAME';
 2 
 3 export default {
 4     [types.SET_NAME](state,name){
 5         state.name = name;
 6     },
 7     [types.SET_AGE](state,age){
 8         state.age = age;
 9     }
10 }

actions.js

 1 import {
 2     SET_NAME,
 3     SET_AGE,
 4 }  from "./const"
 5 
 6 export default {
 7     nameAsyn({commit}, {age, name}) {
 8         commit(types.SET_NAME, name);
 9         commit(types.SET_AGE, age);
10     }
11 };

index.js

1 import state from "./state";
2 import actions from "./actions";
3 import mutations from "./mutations";
4 
5 export default {
6     state,
7     actions,
8     mutations
9 }

 

最后将store实例挂载到main.js里面的vue上去就好了;

1 import Router from "./router";
2 import store from './store';
3 
4 new Vue({
5   Router,
6   store,
7   render: h => h(App)
8 }).$mount('#app')

 

在vue组件中使用时,我们通常会使用mapGetters、mapActions、mapMutations,然后就可以按照vue调用methods和computed的方式去调用这些变量或函数,示例如下:

 1 import {mapGetters, mapMutations, mapActions} from 'vuex';
 2 
 3 /* 只写组件中的script部分 */
 4 export default {
 5     computed: {
 6         ...mapGetters([
 7             'name',
 8             'age'
 9         ])
10     },
11     methods: {
12         ...mapMutations({
13             setName: 'SET_NAME',
14             setAge: 'SET_AGE'
15         }),
16         ...mapActions([
17             nameAsyn
18         ])
19     }
20 };

   以上就是我对vuex的理解。