1. Vuex的基本原理
    图片说明
    三个主要属性:

State:状态数据,保存了可供所有组件公用的数据,严格模式下只可由mutation触发改变
Mutations:定义了一些列方法,用于同步修改state保存的数据,提供了一个默认参数state
Actions:定义了一系列方法,用于异步触发mutation,间接修改state保存的数据,有一个默认参数commit,触发mutation的函数
两个重要方法:
dispatch:触发action的函数,写法:this.$store.dispatch('action方法名',参数)

commit:触发mutation的函数,写法:this.$store.commit('mutations方法名',参数)
总结:state保存的变量,mutation通过一系列的计算,马上更新这些变量;action里封装一些异步操作,完了触发commit进而改变state保存的变量。
2. 一个基本的例子
1)首先用vue-cli创建一个带vuex(store)的基本工程
2)在store/index.js中定义一个基本的Store对象:

import Vuex from 'vuex'
import Vue from 'vue'
import returnCount from '../api/returnCount'

Vue.use(Vuex)

export default new Vuex.Store({
    state:{
        count:0
    },
    mutations:{
        mutateCount:(state,count1)=>{
            state.count+=count1
        }
    },
    actions:{
        actionCount:async({commit},param)=>{
            let newCount=await returnCount()
            console.log('异步获取后台数据', newCount)
            commit('mutateCount',param*newCount)
        }
    },
    // getters:{

    // }
})

3)在App.vue中定义一个按钮,绑定一个鼠标点击书简changeCount(),并在其中用{{ this.$store.state.count }}显示state保存的count变量:

<template>
  <div id="app">
    {{ this.$store.state.count }}
    <button @click="changeCount">改变count</button>
  </div>
</template>

<script>
export default {
  name: 'App',
  methods:{
    changeCount(param){
      this.$store.dispatch('actionCount',param)
    }
  }
}
</script>
...

其中按钮事件changeCount触发了一个actionCount方法,传递了一个参数10,action方法中使用async/await函数异步调用了写的一个模拟后台数据生成的api(src/api/returnCount):

export default function returnCount(){
  return new Promise((resolve,reject)=>{
    console.log('后台生成数据中')
    setTimeout(()=>{
      resolve(5)
    },3000)
  })
}

这个异步操作是一个Promise对象,用于3秒后返回一个数字10
await等到获取到这个数字5,将其传给mutateCount方法,然后利用commit触发mutateCount,mutateCount方法直接改变count的值。
控制台输出结果:
图片说明
点击按钮触发action,并传递一个参数“10”,action打印“后台数据生成中”,等3s后拿到后台数据5,计算得到一个新参数“50”,通过commit触发mutation,更新state的count为“50”