解决pinia中的i18n切换语言不生效的问题
在我的项目中,使用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',
},
];
},
}
虽然解决方法很简单,却花了我不少时间捏。