vuex

<!-- store.js -->
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 0
  },
  // 只有 mutations 中定义的函数,才有权利修改 state 中的数据
  mutations: {
    add(state) {
      // 不要在 mutations 函数中,执行异步操作
      state.count++
    },
    addN(state, step) {          //函数传参
      state.count += step
    }
  },
  actions: {
    addAsync(context) {
      setTimeout(() => {
        // 在 actions 中,不能直接修改 state 中的数据;
        // 必须通过 context.commit() 触发某个 mutation 才行
        context.commit('add')
      }, 1000)
    },
    addNAsync(context, step) {
      setTimeout(() => {
        context.commit('addN', step)
      }, 1000)
    }
  },
  getters: {         //包装数据   //Getter 可以对 Store 中已有的数据加工处理之后形成新的数据,类似 Vue 的计算属性。
    showNum(state) {              //Store 中数据发生变化,Getter 的数据也会跟着变化。
      return '当前最新的数量是【' + state.count + '】'
    }
  }
})

<!--组件调用修改公共数据数据方式一  Addition.vue -->
<template>
  <div>
    <!-- <h3>当前最新的count值为:{{$store.state.count}}</h3> -->
    <h3>{{$store.getters.showNum}}</h3>
    <button @click="btnHandler1">+1</button>     //组件点击事件改变公共数据
    <button @click="btnHandler2">+N</button>
    <button @click="btnHandler3">+1 Async</button>
    <button @click="btnHandler4">+N Async</button>
  </div>
</template>
<script>
export default {
  data() {
    return {}
  },
  methods: {
    btnHandler1() {
      this.$store.commit('add')
    },
    btnHandler2() {
      // commit 的作用,就是调用 某个 mutation 函数
      this.$store.commit('addN', 3)
    },
    // 异步地让 count 自增 +1
    btnHandler3() {
      // 这里的 dispatch 函数,专门用来触发 action
      this.$store.dispatch('addAsync')
    },
    btnHandler4() {
      this.$store.dispatch('addNAsync', 5)
    }
  }
}
</script>

<!--组件调用修改公共数据数据方式二  Addition.vue -->
<template>
    <div>
      <!-- <h3>当前最新的count值为:{{count}}</h3> -->
      <h3>{{showNum}}</h3>
      <button @click="btnHandler1">+1</button>
      <button @click="addN(3)">+N</button>
      <button @click="addAsync">+1 Async</button>
      <button @click="addNAsync(5)">+N Async</button>   //异步传参
    </div>
  </template>
  <script>
  import { mapState, mapMutations, mapActions, mapGetters } from 'vuex'   
  export default {
    data() {
      return {}
    },
    computed: {
      ...mapState(['count']),       //相当于自己组件的数据
      ...mapGetters(['showNum'])
    },
    methods: {
      ...mapMutations(['add', 'addN']),   //映射声明,结构后,相当于自己的函数
      ...mapActions(['addAsync', 'addNAsync']),
      btnHandler1() {
        this.add()
      }
    }
  }
  </script>
原文地址:https://www.cnblogs.com/xm0328/p/13783107.html