vue项目使用vue-i18n国际化后,点击切换语言时部分内容语言切换失败,刷新页面后又生效
切换
·
开发中遇到个问题。在点击切换语言时,同一个页面中有的内容可以切换成功,有的则没有反应。在页面刷新后却又发现全部内容都已经切换成功。个人分析了一下原因,如果有误还请各位大佬指正。
1、原因分析
1.1、直接在差值表达式中渲染,在这种情况下直接去切换语言时可以成功切换的。
![]()
1.2、在定义变量时使用国际化定义,然后在插值表达式中去渲染该变量。
比如定义了一个变量typeList,使用循环渲染,可以正常显示,在这种情况下直接去切换语言时则没有效果。如图:

1.3、原因总结
当在切换语言时,只是修改了 VueI18n 的实例状态,但 Vue 可能没有察觉到这个变化,所以不会自动更新页面。
2、解决办法
2.1、使用计算属性
把需要定义的国际化变量通过computed计算属性返回,这样在切换时可以生效。例如把1.2的 typeList通过计算属性返回。这样虽然可以解决,但是有局限性,接下来看第二种方法。

2.2、刷新组件重新加载
点击切换语言时,触发当前组件刷新。 在组件刷新时,会重新加载从而确保在模板中的显示能及时响应语言变化。以下是几种刷新组件的方法:
1、使用key属性, 在模板中为组件添加一个动态的 key 属性:

2、使用动态组件并通过改变组件的名称来触发重新渲染

3、结合自身解决问题
以我当前系统为原型做了一个小demo。页面分为典型的三部分,头部导航栏,左侧菜单栏以及中间的组件视图部分。在头部导航栏有语言按钮,在点击时实现切换语言并刷新当前渲染的组件。
1、在头部导航栏Header组件中定义刷新方法。
<script setup>
import { ref } from 'vue';
import { emit } from 'vue';
const changeLanguage = () => {
emit('refreshComponent');
};
</script>
<template>
<button @click="changeLanguage">切换</button>
</template>
2、在父组件中监听这个事件,并根据当前路由对应的组件进行刷新操作。
<script setup>
import { ref } from 'vue';
import Header from './Header.vue';
import Sidebar from './Sidebar.vue';
import { useRouter } from 'vue-router';
import { useI18n } from 'vue-i18n';
const { locale } = useI18n();
const router = useRouter();
const componentKey = ref(0);
const handleRefreshComponent = () => {
//切换国际化语言
locale.value === 'zh-CN'? (locale.value = 'en-US') : (locale.value = 'zh-CN');
componentKey.value++;
};
</script>
<template>
<Header @refreshComponent="handleRefreshComponent" />
<Sidebar />
<router-view :key="componentKey" />
</template>
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)