Search code examples
javascriptvue.jsthisvuexvuex-modules

Can I use "this" in mapMutations spread inside Vue instance methods?


I want to set Vuex mutations as follows:

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

But I catch the error:

Uncaught TypeError: Cannot read property 'store' of undefined

How do I correctly use props inside the module mutation name?

I want to map this.$store.commit('form1/changeModel'), where form1 is set from props.


Solution

  • Vuex helper mapMutations can be used with a function which works with this.

    There does not seem to be a doc for this, but the Vuex unit test helpers.spec.js illustrates the pattern.

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

    As a bonus, the function allows passing a parameter to the mutation, which is a common requirement.

    Your code changes would be:

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

    The call within your component is just changeModel() - mapMutations is taking care of injecting the commit parameter.

    Note, I am not sure this is adding much except some extra noise (compared to a simple this.$store.commit()), but perhaps your requirement is more complicated than the example code.