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