Как я могу ссылаться на именованные действия vuex 'constant' с переменными?

У меня есть такое действие в моем магазине 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);

Как я могу получить доступ к «постоянным» именованным действиям с переменными?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
466
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы пробовали использовать 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 a string. 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. Если вы абсолютно уверены, что ваш ввод дезинфицирован перед его передачей, это не должно быть проблемой.

Другие вопросы по теме