更改 Vuex 的 store 中的状态的惟一方法是提交 mutation。Vuex 中的 mutation 很是相似于事件:每一个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。vue
接下来咱们仍是用上一篇文章在state中存放的count为例,来看利用Mutation修改state的count属性。vuex
在mutation函数中添加count的add函数bash
const mutations = {
addNum (state) {
state.num++
},
add (state) {
state.count += 2
}
}
export default mutations
复制代码
在组件中使用mutation进行实现叠加器函数
<template>
<div class="mutation">
<p>{{ count }}</p>
<button @click="addCount">+ADD</button>
</div>
</template>
<script>
import store from '@/store/store'
export default {
computed: {
count () {
return this.$store.state.count
}
},
methods: {
addCount () {
store.commit('add')
}
}
}
</script>
复制代码
你能够向store.commit传入额外的参数,即mutation的载荷(payload):咱们仍是以上面累加器的例子来实现mutation函数的传参,来动态定义累加的数量。工具
在mutation.js中修改add方法post
const mutations = {
addNum (state) {
state.num++
},
add (state, n) {
state.count += n
}
}
export default mutations
复制代码
在组件中store.commit如何传参ui
<template>
<div class="mutation">
<p>{{ count }}</p>
<button @click="addCount">+ADD</button>
</div>
</template>
<script>
import store from '@/store/store'
export default {
computed: {
count () {
return this.$store.state.count
}
},
methods: {
addCount () {
store.commit('add', 5)
}
}
}
</script>
复制代码
在mutation传参(载荷)能够传递一个参数也能够传递一个对象。让咱们修改下上面的例子this
mutation.js文件中修改以下spa
const mutations = {
addNum (state) {
state.num++
},
add (state, payload) {
state.count += payload.amount
}
}
export default mutations
复制代码
组件中修改以下code
<template>
<div class="mutation">
<p>{{ count }}</p>
<button @click="addCount">+ADD</button>
</div>
</template>
<script>
import store from '@/store/store'
export default {
computed: {
count () {
return this.$store.state.count
}
},
methods: {
addCount () {
store.commit('add', { amount: 10 })
}
}
}
</script>
复制代码
依据上面的例子,咱们将组件中内容修改以下
<template>
<div class="mutation">
<p>{{ count }}</p>
<button @click="addCount">+ADD</button>
</div>
</template>
<script>
import store from '@/store/store'
export default {
computed: {
count () {
return this.$store.state.count
}
},
methods: {
addCount () {
store.commit({
type: 'add',
amount: 8
})
}
}
}
</script>
复制代码
使用常量替代mutation事件类型在各类Flux实现中是很常见的模式。这样可使 linter之类的工具发挥做用,同时把这些常量放在单独的文件中可让你的代码合做者对整个项目包含的mutation一目了然。这在在须要多人协做的大型项目中,这会颇有帮助。
咱们在store中新建mutation-types.js文件,文件内容以下
export const SOME_MUTATION = 'SOME_MUTATION'
复制代码
在mutation.js文件内容以下
import { ADD } from './mutation-types'
const mutations = {
addNum (state) {
state.num++
},
[ADD] (state) {
state.count++
}
}
export default mutations
复制代码
在组件中内容和以前一致
<template>
<div class="mutation">
<p>{{ count }}</p>
<button @click="addCount">+ADD</button>
</div>
</template>
<script>
import store from '@/store/store'
export default {
computed: {
count () {
return this.$store.state.count
}
},
methods: {
addCount () {
store.commit('add')
}
}
}
</script>
复制代码
<template>
<div class="mutation">
<p>{{ count }}</p>
<button @click="add">+ADD</button>
</div>
</template>
<script>
export default {
computed: {
count () {
return this.$store.state.count
}
},
methods: {
add () {
this.$store.commit('add')
}
}
}
</script>
复制代码
<template>
<div class="mutation">
<p>{{ count }}</p>
<button @click="add">+ADD</button>
</div>
</template>
<script>
import { mapMutations } from 'vuex'
export default {
computed: {
count () {
return this.$store.state.count
}
},
methods: {
...mapMutations(['add'])
}
}
</script>
复制代码