阅读 328
【快速入门Vue系列】第三十八篇:Vuex的Mutation超细讲解,一看就会

【快速入门Vue系列】第三十八篇:Vuex的Mutation超细讲解,一看就会

Vuex_Mutation

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

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

不能直接调用一个mutation handler。这个选项更像是事件注册:“当触发一个类型为increment的mutation时,调用次函数。”:

this.$store.commit('increment');
复制代码

在组件中提交 Mutation

除了在组件中使用 this.$store.commit('xxx') 提交 mutation之外,还可以使用 mapMutations 辅助函数:

import { mapMutations } from 'vuex'

export default {
   // ... 
  methods: {
    ...mapMutations([
      'increment',  // 将 `this.increment()` 映射为 `this.$store.commit('increment')` 
    ]),
    ...mapMutations({
      add: 'increment'  // 将 `this.add()` 映射为 `this.$store.commit('increment')` 
    })
  }
}
复制代码

提交载荷(Payload)

你可以向store.commit传入额外的参数,即mutation的载荷(payload):

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 的另一种方式是直接使用包含 type 属性的对象:

store.commit({
  type: 'increment',
  amount: 10
})
复制代码

当使用对象风格的提交方式,整个对象都作为载荷传给 mutation 函数,因此 handler 保持不变:

mutations: {
  increment (state, payload) {
    state.count += payload.amount
  }
}
复制代码

使用常量替代 Mutation 事件类型

把这些常量放在单独的文件中可以让你的代码合作者对整个 app 包含的 mutation 一目了然:

 // mutation-types.js
export const COUNT_INCREMENT = 'COUNT_INCREMENT'
复制代码
 // store.js
import Vuex from 'vuex'
import { COUNT_INCREMENT } from './mutation-types'

const store = new Vuex.Store({
  state: { ... },
  mutations: {
    [COUNT_INCREMENT] (state) {
       // ... 
    }
  }
})
复制代码

Mutation 需遵守 Vue 的响应规则

既然 Vuex 的 store 中的状态是响应式的,那么当我们变更状态时,监视状态的 Vue 组件也会自动更新。这也意味着 Vuex 中的 mutation 也需要与使用 Vue 一样遵守一些注意事项:

  • 最好提前在你的 store 中初始化好所有所需属性。

  • 当需要在对象上添加新属性时,你应该

    • 使用 Vue.set(obj, 'newProp', 123), 或者

    • 以新对象替换老对象。例如,利用对象展开运算符我们可以这样写:

      state.obj = { ...state.obj, newProp: 123 }
      复制代码

最后

如果对您有帮助,希望能给个👍评论/收藏/三连!

博主为人老实,无偿解答问题哦❤

文章分类
前端
文章标签