vuex初见Mutation

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


每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler),并且接受 state 作为第一个参数。

const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    increment (state) {
      // 变更状态
      state.count++
    }
  }
})

要触发一个类型为 increment 的 mutation 时,需要以相应的 type 调用 store.commit 方法

store.commit('increment')

可以向 store.commit 传入额外的参数,即 mutation 的 载荷(payload)
payload:有效载荷,即记录有效信息的部分。
通常在传输数据时,为了使数据传输更可靠,要把原始数据分批传输,并且在每一批数据的头和尾都加上一定的辅助信息,比如这一批数据量的大小,校验位等,这样就相当于给已经分批原始数据加一些外套,这些外套起到标示作用,使得原始数据不易丢失。一批数据加上它的“外套”,就形成了传输通道中基本的传输单元,叫做数据帧或者数据包(有的地方数据帧和数据包不是同一概念比如网络传输)。
这些数据帧中的记录信息的原始数据就是有效载荷数据,即payload data。而消息体就是外套。即标记着原始数据的大小等的辅助信息。
amount:数量

mutations: {
  increment (state, n) {
    state.count += n
  }
}
store.commit('increment', 10)
mutations: {
  increment (state, payload) {
    state.count += payload.amount
  }
}
store.commit('increment', {
  amount: 10
})
store.commit({
  type: 'increment',
  amount: 10
})

使用常量替代 Mutation 事件类型


使用常量替代 mutation 事件类型在各种 Flux 实现中是很常见的模式(可以不用)。这样可以使 linter 之类的工具发挥作用,同时把这些常量放在单独的文件中可以让你的代码合作者对整个 app 包含的 mutation 一目了然

// mutation-types.js
export const SOME_MUTATION = 'SOME_MUTATION'
// store.js
import Vuex from 'vuex'
import { SOME_MUTATION } from './mutation-types'

const store = new Vuex.Store({
  state: { ... },
  mutations: {
    // 我们可以使用 ES2015 风格的计算属性命名功能来使用一个常量作为函数名
    [SOME_MUTATION] (state) {
      // mutate state
    }
  }
})

在组件中提交 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')`
    })
  }
}

你可能感兴趣的:(vuex学习初见)