点击语言切换时,只切换文本语言环境,避免不必要的页面重绘。
pages/login/login.vue)isLanguageSwitching 状态标志const switchLanguage = async () => {
// 防止频繁切换
if (isLanguageSwitching.value) return
isLanguageSwitching.value = true
try {
// 直接切换语言
localeStore.toggleLocale()
// 等待 DOM 更新完成
await nextTick()
// 异步更新导航栏标题
uni.setNavigationBarTitle({
title: t('login.title')
})
} finally {
// 300ms后允许再次切换
setTimeout(() => {
isLanguageSwitching.value = false
}, 300)
}
}
store/locale.js)if (currentLocale.value === locale) {
return true // 语言相同,直接返回,避免无效更新
}
uni.setStorageSync 改为异步执行// 先更新 store 状态
currentLocale.value = locale
// 再更新 i18n
i18n.global.locale.value = locale
// 最后异步持久化
setTimeout(() => {
uni.setStorageSync('locale', locale)
}, 0)
i18n.global.locale 是响应式的$t() 的组件更新如果仍需进一步优化,可以考虑: