เปลี่ยนพารามิเตอร์เริ่มต้นของ Axios ไม่เปลี่ยนแปลงในเหตุการณ์ Vuex Action

ฉันกำลังติดตั้งเว็บไซต์ที่ผู้ใช้สามารถสลับการเลือกภาษาได้ การตั้งค่าภาษาที่เลือกจึงถูกส่งไปยัง API พร้อมด้วยพารามิเตอร์ lang

  1. หากตั้งค่าภาษาเป็นภาษาอังกฤษ

/api/test?lang=th

  1. หากตั้งค่าภาษาเป็นภาษาไทย

/api/test?lang=th

ฉันได้จัดเก็บภาษาไว้ใน localstorage และการจัดการสถานะ Vuex

เนื่องจากจำเป็นต้องมีพารามิเตอร์ ?lang เพื่อส่งในทุกคำขอ ฉันจึงตัดสินใจใช้พารามิเตอร์ lang เป็นพารามิเตอร์เริ่มต้นของ axios

การกลายพันธุ์.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>

person Lizesh Shakya    schedule 24.08.2020    source แหล่งที่มา
comment
เหตุใดคุณจึงเริ่มต้น axios ในการกลายพันธุ์   -  person sugars    schedule 24.08.2020
comment
ฉันได้เปลี่ยนพารามิเตอร์คำขอ axios lang ทุกครั้งที่ผู้ใช้เปลี่ยน lang   -  person Lizesh Shakya    schedule 24.08.2020


คำตอบ (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
}

การกลายพันธุ์.js

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

actions.js

let actions = {
  updateLanguagePreference({commit}, language) {
    commit('UPDATE_LANGUAGE_PREFERENCE', language)
  }
}
person sugars    schedule 24.08.2020
comment
?lang ไม่มาในคำขอ - person Lizesh Shakya; 24.08.2020
comment
axios ของคุณเป็นเวอร์ชันอะไร? สิ่งนี้ใช้ได้กับ axios 0.18.1 มันใช้งานไม่ได้กับ axios 0.19 - person sugars; 24.08.2020
comment
config.params['lang'] = 'test'. เมื่อฉันลองด้านบน if(state.getters.languagePreference) มันไม่ทำงาน ใช่ เวอร์ชัน axios คือ ^0.19 - person Lizesh Shakya; 24.08.2020
comment
มีวิธีอื่นสำหรับเวอร์ชัน 0.19 หรือไม่? - person Lizesh Shakya; 24.08.2020
comment
เมื่อดูรหัสของคุณ ฉันพบปัญหาในรหัสของฉัน ฉันควรใช้ config.params['lang'] = store.getters.languagePreference ภายใน $http.interceptors.request แทนที่จะเริ่มต้นในตัวแปรสำหรับ store.getters.languagePreference ใช้วิธี Vue.prototype.$http = axios ใน 0.19 หรือไม่ - person Lizesh Shakya; 24.08.2020
comment
ปัจจุบันฉันยังไม่ได้คิดถึงวิธีอื่น คุณสามารถย้อนกลับไปใช้เวอร์ชัน 0.18.1 ได้ และคุณสามารถตรวจสอบ ปัญหา - person sugars; 24.08.2020