开发者问题收集

我可以在 Vue 实例方法内部的 mapMutations 中使用“this”吗?

2018-08-29
2393

我想按如下方式设置 Vuex 突变:

export default {
    props: {
        store: String
    },
    methods: {
        ...mapMutations({
            changeModel: `${this.store}/changeModel`
        })
    }
}

但是我发现了错误:

Uncaught TypeError: Cannot read property 'store' of undefined

如何在模块突变名称中正确使用 props

我想映射 this.$store.commit('form1/changeModel') ,其中 form1 是从 props 设置的。

3个回答

Vuex 辅助程序 mapMutations 可与与 this 配合使用的函数一起使用。

似乎没有关于此的文档,但 Vuex 单元测试 helpers.spec.js 说明了该模式。

const vm = new Vue({
  store,
  methods: mapMutations({
    plus (commit, amount) {
      commit('inc', amount + 1)
    }
  })
})

另外,该函数允许将参数传递给突变,这是一个常见的要求。

您的代码更改将是:

export default {
  props: {
    store: String
  },
  methods: {
    ...mapMutations({
      changeModel(commit) { commit(`${this.store}/changeModel`) }
    })
  }
}

您的组件内的调用只是 changeModel() - mapMutations 负责注入 commit 参数。

请注意,我不确定这是否会增加很多内容,除了一些额外的噪音(与简单的 this.$store.commit() 相比),但也许您的要求比示例代码更复杂。

Richard Matsen
2018-09-03

我认为没有办法在 mapActions 上绑定它。但你可以用 $store.dispatch

methods: {
  changeModel() {
    this.$store.dispatch(`${this.store}/changeModel`);
  }
}
调用它
Jae Woo Woo
2018-08-31

这不是您要求的解决方案,但其效果是一样的。由于突变是一个可变参数,因此显然应该将其作为输入参数放入函数中,而不是更改突变名称。我会在商店中创建一个这样的操作:

changeModel ({dispatch, commit, rootGetters}, mutationName) {
 commit(`${mutationName}/changeModel`, {}, {root: true})
})

我会在将突变名称传递给它的组件中使用此操作。

Máté Wiszt
2018-09-05