Vuex使用介绍(二)

Mutation

Vuex 通过commit一个mutation来对state进行更改。每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数:

const mutations = {
  increment (state) {
    state.count++
  },
  decrement (state) {
    state.count--
  }
}

通过store.commit方法调用响应的mutation

store.commit('increment')

向mutation中传入额外参数(最好是一个对象)

  incrementNum (state, num) {
    state.count = state.count + num
  }
incrementNum: ({ commit }, num) => commit('incrementNum', num),

对象风格的提交方式
提交 mutation 的另一种方式是直接使用包含 type 属性的对象:

store.commit({
  type: 'increment',
  num: 10
})

Mutation 必须是同步函数
mutation的作用是要该表state状态,mutation函数中的state的状态必须是可追踪的,当使用异步方法的时候,会导致devtools无法定位何时异步回调函数被调用,从而导致state改变不可追踪。
在组件中提交 Mutation
不常用,一般通过actions 的dispatch 分发一个action,在action中进行commit mutation。
你可以在组件中使用 this.$store.commit('xxx') 提交 mutation,或者使用 mapMutations 辅助函数将组件中的 methods 映射为 store.commit 调用(需要在根节点注入 store)。

import { mapMutations } from 'vuex'

export default {
  // ...
  methods: {
    ...mapMutations([
      'increment', // 将 `this.increment()` 映射为 `this.$store.commit('increment')`
      // `mapMutations` 也支持额外参数:
      'incrementNum' // 将 `this.incrementBy(num)` 映射为 `this.$store.commit('incrementBy', num)`,组件中调用此方法的时候传参,此处不需要显示声明参数
    ])
  }
}

Action

Action 类似于 mutation,不同在于:
1.Action 提交的是 mutation,而不是直接变更状态。
2.Action 可以包含任意异步操作。
actions注册:

const actions = {
  incrementNum: ({ commit }, num) => commit('incrementNum', num),
  increment: ({ commit }) => commit('increment'),
  decrement: ({ commit }) => commit('decrement'),
  incrementIfOdd ({ commit, state }) {
    if ((state.count + 1) % 2 === 0) {
      commit('increment')
    }
  },
  incrementAsync ({ commit }) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        commit('increment')
        resolve()
      }, 1000)
    })
  }
}

Action接收context对象作为参数,具有和store相同的方法和属性,如state,getters,commit,dispatch,所以也可以调用这些属性和方法,通常通过结构赋值使用。
分发action
Action 通过 store.dispatch 方法触发:

store.dispatch('increment')

Action内部可以执行异步操作

actions: {
  incrementAsync ({ commit }) {
    setTimeout(() => {
      commit('increment')
    }, 1000)
  }
}

支持提供额外参数:

// 以载荷(额外参数)形式分发
store.dispatch('incrementAsync', {
  amount: 10
})

// 以对象形式分发
store.dispatch({
  type: 'incrementAsync',
  amount: 10
})

store.dispatch 可以处理被触发的 action 的处理函数返回的 Promise,并且 store.dispatch 仍旧返回 Promise

你可能感兴趣的:(Vuex使用介绍(二))