Изменить параметры Axios по умолчанию, не изменяющиеся при событии действия Vuex

#vue.js #vuejs2 #axios #vue-component #vuex

#vue.js #vuejs2 #аксиос #vue-компонент #vuex #axios

Вопрос:

Я внедряю веб-сайт, на котором пользователи могут переключать выбор языка. Таким образом, выбранные языковые предпочтения отправляются в API с параметром lang

  1. Если язык установлен на английский

/api/тест?lang=ru

  1. Если язык установлен на тайский

/api/test?lang=th

Я сохранил язык в localstorage и Vuex state management.

Поскольку для отправки в каждом запросе необходим параметр ?lang, я решил использовать параметр lang в качестве параметра axios по умолчанию

mutations.js

 let mutations = {
    UPDATE_LANGUAGE_PREFERENCE(state, language) {
        if (language.toLowerCase() === ENGLISH_LANGUAGE_CODE) {
            state.languagePreference = ENGLISH_LANGUAGE_CODE;
        } else {
            state.languagePreference = THAI_LANGUAGE_CODE;
        }


        Vue.prototype.$http = axios
        let languagePreference = store.getters.languagePreference
        if (!languagePreference) {
            languagePreference = LANGUAGE_PREFERENCE
        }
        Vue.prototype.$http.interceptors.request.use((config) => {
            config.params = config.params || {}
            config.params['lang'] = languagePreference
            return config
        })
    },
}
  

Сделав это, теперь он отправляет начальный язык по умолчанию на каждый запрос. Но это не отражает изменений, когда пользователь переключает язык

NavbarComponent.vue

 <script>
    ...
        methods: {
        updateLanguagePreference() {
            if (!this.isThai) {
                this.$store.dispatch('updateLanguagePreference', THAI_LANGUAGE_CODE)
            } else {
                this.$store.dispatch('updateLanguagePreference', ENGLISH_LANGUAGE_CODE)
            }


            axios.get('/test', {
            })
        }
    },
    ...
</script>
  

Комментарии:

1. Почему вы инициализировали axios в mutations?

2. Я сделал, чтобы изменить параметр запроса axios lang всякий раз, когда пользователь изменяет lang

Ответ №1:

Ниже приведен измененный код, основанный на вашем коде:

main.js

 import store from 'store'

const $http = axios.create()
$http.interceptors.request.use((config) => {
  let params = config.params || {}
  if (store.getters.languagePreference) {
    config.params = {...params, lang: store.getters.languagePreference}
  }
  return config
})

Vue.prototype.$http = axios
  

Поместите операцию инициализации axios в main.js

getters.js

 let getters = {
  languagePreference: state => state.languagePreference // or state.yourModuleName.languagePreference
}
  

mutations.js

 let mutations = {
  UPDATE_LANGUAGE_PREFERENCE(state, language) {
    state.languagePreference = language
  }
}
  

actions.js

 let actions = {
  updateLanguagePreference({commit}, language) {
    commit('UPDATE_LANGUAGE_PREFERENCE', language)
  }
}
  

Комментарии:

1. ? язык не поступает в запросе.

2. Какая у вас версия axios? Это работает с axios 0.18.1. Это не работает с axios 0.19.

3. config.params['lang'] = 'test' . Когда я пробовал выше if(state.getters.languagePreference) , это не сработало. Да, версия axios является ^0.19 .

4. Есть ли какой-либо альтернативный способ для версии 0.19?

5. В настоящее время я не думал о других способах, вы можете вернуться к версии 0.18.1 и проверить проблемы