Mutation
更改Vuex的store中的状态的唯一方法就是提交mutation。Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数:
const store = new Vuex.Store({
state: {
count: 1
},
mutations: {
increment (state) {
// 变更状态
state.count++
}
}
})
你不能直接调用一个 mutation handler。这个选项更像是事件注册:“当触发一个类型为 increment 的 mutation 时,调用此函数。”要唤醒一个 mutation handler,你需要以相应的 type 调用 store.commit 方法:
store.commit('increment')
载荷(Payload)
可以向store.commit传入额外的参数,即mutation的载荷:
mutations: {
increment (state, n) {
state.count += n
}
}
store.commit('increment', 10)
在大多数情况下,载荷应该是一个对象,这样可以包含多个字段并记录的mutation更易读:
mutations: {
increment (state, payload) {
state.count += payload.amount
}
}
store.commit('increment', {
amount: 10
})
在组件中提交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` 也支持载荷:
'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.commit('incrementBy', amount)`
]),
...mapMutations({
add: 'increment' // 将 `this.add()` 映射为 `this.$store.commit('increment')`
})
}
}
mutation(提交更改数据的方法,同步!必须是同步函数):
使用vuex修改state时,有两种方法:
(1)可以直接使用this.$store.state.变量 = xxx;
(2)this.$store.dispatch(actionType, payload);
(3)this.$store.commit(commitType, payload)
main.js
const store = new Vuex.Store({
strict: true, // strict: true, 若开启严格模式只要不经过 mutation的函数,则会报错
state: {
cartNum: 0, // 购物车数量
},
mutations: {
// 加1
INCREMENT(state) {
state.cartNum++;
},
}
})
index.vue
import baseStore from '../../../main.js';
methods: {
addCarts () {
baseStore.commit('INCREMENT')
},
}
异同点:
1.共同点:能够修改state里的变量,并且是响应式的(能触发视图更新)
2.不同点:若将vue创建store的时候传入strict:true,开启严格模式,那么任何修改state的操作,只要不经过mutation函数,vue就会 throw error