У меня есть такое действие в моем магазине vuex:
[FETCH_ADAM_BROWN_LIST](state)({commit}) {
/* Action logic */
},
Я хочу получить доступ к действиям с аналогичным именем, например FETCH_CHRIS_MATHISON_LIST, используя такую переменную:
this.$store.dispatch(`FETCH_${this.person}_LIST`);
Однако это вызывает ошибку:
VM90646:37 [vuex] unknown action type: FETCH_ADAM_BROWN_LIST
Но он будет работать, если я укажу его как константу:
this.$store.dispatch(FETCH_ADAM_BROWN_LIST);
Как я могу получить доступ к «постоянным» именованным действиям с переменными?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы пробовали использовать mapActions? Это может сработать для того, что вы хотите. Полезная ссылка: Как настроить Vue mapActions
Я использую эту структуру в своем магазине Vuex. Многие из моих действий отправляются с использованием конкатенированной строки в качестве аргумента. Но мои действия объявлены так:
setCurrentUser: function ({ dispatch, commit, getters, rootGetters }, userDB) {
commit('setCurrentUser', userDB)
dispatch('resetDashboards', userDB.dashboards)
}
Тогда я могу отправить так:
let type = 'User'
this.$store.dispatch('setCurrent' + type)
Есть ли что-то странное в вашем коде. Удалите (state), потому что действия получит объект context, который в вашем случае вы деструктурируете в params. ({commit}).
Установите это так и дайте мне знать, работает ли это.
[FETCH_ADAM_BROWN_LIST]({commit}) {
/* Action logic */
},
Как вы заметили, когда вы передали FETCH_${this.person}_LIST в dispatch, тип действия, который был отправлен, является конкатенированным именем константы, а не фактическим значением постоянной переменной.
Чтобы получить фактическое значение вашей постоянной переменной, вы можете использовать функцию eval.
Из Документы MDN:
The argument of the
eval()function is astring. If the string represents an expression, eval() evaluates the expression.
Вы можете использовать это так:
const FETCH_ADAM_BROWN_LIST = 'customAction';
const person = 'ADAM_BROWN';
const actionToDispatch = `FETCH_${person}_LIST`;
console.info(eval(actionToDispatch)); // customActionОднако будьте осторожны с использованием eval. Если вы абсолютно уверены, что ваш ввод дезинфицирован перед его передачей, это не должно быть проблемой.