Могу ли я использовать "это" в mapMutations, распространяемых внутри методов экземпляра Vue?

Я хочу установить мутации Vuex следующим образом:

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

но я ловлю ошибку:

Uncaught TypeError: не удается прочитать свойство "store" неопределенного

Как правильно использовать реквизит внутри имени мутации модуль?

Я хочу карту this.$store.commit('form1/changeModel'), где form1 С реквизит.

3 ответов


Vuex helper mapMutations может использоваться с функцией, которая работает с this.

для этого, похоже, нет документа, но модульный тест Vuex помощников.спекуляция.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 является заботясь о инъекции


Я думаю, что нет способа связать это на mapActions. Но вы можете назвать это с $store.dispatch

methods: {
  changeModel() {
    this.$store.dispatch(`${this.store}/changeModel`);
  }
}

это не точное решение, которое вы спросили, но его эффект тот же. Поскольку мутация является переменным параметром, очевидно, что вместо изменения имени мутации ее следует поместить в функцию в качестве входного параметра. Я бы создал действие в магазине следующим образом:

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

и я бы использовал это действие в компоненте, передающем в него mutationName.