Skip to content
On this page

Mutation 的基本使用

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation:

javascript
{
 mutations: {
    increment (state) {
      state.count++
    },
    decrement(state){
      state.count--
    }
  }
}
1
2
3
4
5
6
7
8
9
10

Mutation 携带数据

很多时候我们在提交 mutation 的时候,会携带一些数据,这个时候我们可以使用参数

javascript
{
 mutations: {
    increment (state,payload) {
      state.count += payload
    }
  }
}
1
2
3
4
5
6
7

payload 为对象类型

javascript
{
 mutations: {
    increment (state,payload) {
      state.count += payload.count
    }
  }
}
1
2
3
4
5
6
7

对象提交

javascript
$store.commit({
    type:'increment',
    count:100
})
1
2
3
4

常量类型

mutation-type.js

javascript
export const INCREMENT = 'INCREMENT'
1
javascript
{
 mutations: {
    [INCREMENT] (state,payload) {
      state.count += payload.count
    }
  }
}
1
2
3
4
5
6
7
javascript
$store.commit({
    type:INCREMENT,
    count:100
})
1
2
3
4

mapMutations 辅助函数

我们也可以借助于辅助函数,帮助我们快速映射到对应的方法中:

javascript
 import { mapMutations, mapState } from 'vuex'

  import { INCREMENT } from '../store/mutation-types'

  export default {
    methods: {
      ...mapMutations(["increment", "decrement", INCREMENT]),
      ...mapMutations({
        add: "increment"
      })
    },
    setup() {
      const storeMutations = mapMutations(["increment", "decrement", INCREMENT])

      return {
        ...storeMutations
      }
    }
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

mutation 重要原则

一条重要的原则就是要记住 mutation 必须是同步函数

  • 这是因为 devtool 工具会记录 mutation 的日记;
  • 每一条 mutation 被记录,devtools 都需要捕捉到前一状态和后一状态的快照;
  • 但是在 mutation 中执行异步操作,就无法追踪到数据的变化;
  • 所以 Vuex 的重要原则中要求 mutation 必须是同步函数
沪ICP备20006251号-1