在我的項目中,使用i18n切換語言後,會進行`router.push`來刷新頁面。 但我發現寫在store中的選項(我把它們用作下拉框組件的`options`,例如`options="store.statusOption"`),卻並沒有切換語言。它們需要我手動刷新頁面後才能夠切換語言。然而其它組件中 ...
在我的項目中,使用i18n切換語言後,會進行router.push
來刷新頁面。
但我發現寫在store中的選項(我把它們用作下拉框組件的options
,例如options="store.statusOption"
),卻並沒有切換語言。它們需要我手動刷新頁面後才能夠切換語言。然而其它組件中的語言切換都很正常。
//修改之前
export const selectStore = defineStore('selectOption', {
state: () => {
return {
...
statusOption: [
{
label: `${i18n.global.t('start')}`,
value: 'ENABLE',
},
{
label: `${i18n.global.t('stop')}`,
value: 'DISABLE',
},
],
};
},
個人理解:當翻譯函數直接寫在state
中時,它們會在state
初始化時執行,並將翻譯的結果保存在狀態數據中。這意味著在數據初始化之後,無論後續如何切換語言(即便進行了router.push
),狀態數據中的翻譯結果不會自動更新。然而使用getters,就類似於computed
屬性,在訪問時動態地執行。訪問label
時,執行了翻譯函數,所以能夠獲取到切換語言後的值。
所以,如果寫在state
中,只有在刷新頁面時,state
重新初始化,才能讓state
中的翻譯函數根據當前的locale
正確執行。
//修改之後
export const selectStore = defineStore('selectOption', {
state: () => {
return {
...
};
},
getters: {
statusOption(){
return [
{
label: `${i18n.global.t('start')}`,
value: 'ENABLE',
},
{
label: `${i18n.global.t('stop')}`,
value: 'DISABLE',
},
];
},
}
雖然解決方法很簡單,卻花了我不少時間捏。