Могу ли я использовать "this" в распространении mapMutations внутри методов экземпляра Vue?
Я хочу установить мутации Vuex следующим образом:
export default {
props: {
store: String
},
methods: {
...mapMutations({
changeModel: `${this.store}/changeModel`
})
}
}
Но я ловлю ошибку:
Uncaught TypeError: Невозможно прочитать свойство store из неопределенного
Как правильно использовать реквизит внутри имени мутации модуля?
Я хочу на карту this.$store.commit('form1/changeModel')
, где form1
устанавливается из реквизита.
3 ответа
Я думаю, что нет способа связать это с mapActions. Но вы можете позвонить с $store.dispatch
methods: {
changeModel() {
this.$store.dispatch(`${this.store}/changeModel`);
}
}
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()
), но, возможно, ваше требование сложнее, чем пример кода.
Это не то решение, о котором вы просили, но его эффект тот же. Поскольку мутация является переменным параметром, очевидно, что вместо изменения имени мутации его можно поместить в функцию в качестве входного параметра. Я хотел бы создать действие в магазине, как это:
changeModel ({dispatch, commit, rootGetters}, mutationName) {
commit(`${mutationName}/changeModel`, {}, {root: true})
})
И я бы использовал это действие в компоненте, передавая в него mutationName.