Vuex的使用方法

核心概念:

State:包含了store中的各个状态

Getters:对State中的数据进行包装然后返回,可以认为是store的计算属性

Mutations:对State中的数据进行操作的一系列方法,只能是同步的方法

Actions:对State中的数据进行操作的一系列方法,可以是异步的方法,通过调用Mutation中的方法实现对数据的操作

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 0
  },
  // 不能直接对state里面的数据进行操作,需要通过mutation
  mutations: {
    add (state) {
      state.count++
    },
    sub (state) {
      state.count--
    },
    addN (state, step) {
      state.count += step
    },
    subN (state, step) {
      state.count -= step
    }
  },
  // 异步方法写在这里,操作state数据,需要调用mutation
  actions: {
    addAsync (context) {
      setTimeout(() => {
        context.commit('add')
      }, 1000)
    },
    // 使用ES6的解构赋值可以简写为:
    // addAsync ({ commit }) {
    //   setTimeout(() => {
    //     commit('addN')
    //   }, 1000)
    // },
    addNAsync (context, step) {
      setTimeout(() => {
        context.commit('addN', step)
      }, 1000)
    },
    // 使用ES6的解构赋值可以简写为:
    // addNAsync ({ commit }, step) {
    //   setTimeout(() => {
    //     commit('addN', step)
    //   }, 1000)
    // },
    subAsync (context) {
      setTimeout(() => {
        context.commit('sub')
      }, 1000)
    },
    subNAsync (context, step) {
      setTimeout(() => {
        context.commit('subN', step)
      }, 1000)
    }
  },
  // getters不会修改数据只是对数据进行包装然后返回,相当于计算属性
  getters: {
    showNum (state) {
      return '当前最新count值为:' + state.count
    }
  },
  modules: {}
})

使用Vuex的第一种方式:

<template>
  <div>
    <button @click="sub">-1</button>
    <button @click="subN(3)">-N</button>
    <button @click="subAsync">-1 async</button>
    <button @click="subNAsync(3)">-N async</button>
    <p>{{showNum}}</p>
    <form action="#">
      <label for="count">最新的count值:</label>
      <input id="count" type="text" :value="count" />
    </form>
  </div>
</template>

<script>
export default {
  data () {
    return {}
  },
  computed: {
    // 使用this.$store.state调用Vuex定义的state
    count () {
      return this.$store.state.count
    },
    // 使用this.$store.getters调用Vuex定义的getters
    showNum () {
      return this.$store.getters.showNum
    }
  },
  methods: {
    // 使用this.$store.commit调用Vuex定义的mutation
    sub () {
      this.$store.commit('sub')
    },
    subN (step) {
      this.$store.commit('subN', step)
    },
    // 使用this.$store.dispatch调用Vuex定义的action
    subAsync () {
      this.$store.dispatch('subAsync')
    },
    subNAsync (step) {
      this.$store.dispatch('subNAsync', step)
    }
  }
}
</script>

使用Vuex的第二种方式:

<template>
  <div>
    <button @click="add">+1</button>
    <button @click="addN(3)">+N</button>
    <button @click="addAsync">+1 async</button>
    <button @click="addNAsync(3)">+N async</button>
    <p>{{showNum}}</p>
    <form action="#">
      <label for="count">最新的count值:</label>
      <input id="count" type="text" :value="count" />
    </form>
  </div>
</template>

<script>
// 1.导入mapState,mapMutations,mapActions,mapGetters
import { mapState, mapMutations, mapActions, mapGetters } from 'vuex'

export default {
  data () {
    return {}
  },
  computed: {
    // 2.把mapState,mapGetters里的全局变量映射为计算属性
    ...mapState(['count']),
    ...mapGetters(['showNum'])
  },
  methods: {
    // 2.把mapMutations,mapActions里的方法映射到methods里面
    ...mapMutations(['add', 'addN']),
    ...mapActions(['addAsync', 'addNAsync'])
  }
}
</script>