背景
有这么一个登录页面,相关功能如下:
- 支持双语言,点击切换语言
- 表单内部有一个自定义的select,里面option的label、value都是的名字由外部提供;其中预设的option的label使用this.$t(...)提供
问题
在点击切换语言的时候,页面上翻译的文件都能够正常转换、唯独预设option的label不能,如下图,在切换到英文的时候,页面中其余部分都能够转换成英文,除了选择框里面的“xx中心”
原因
data里面的数据($t('m.txt_001'))会在created的时候根据当前语言转换成对应语言的文字(数据中心);
点击语言切换,其它地方会正常执行翻译,而data里面的数据已经是中文了,不会再改变成英文,
=> 除非刷新页面、或者重新为data赋值
方案
-
点击切换语言的时候,同时刷新页面,让整个页面重新加载
-
重新为data赋值
一.
使用this.$router.go(0),或者window.reload();
但是使用该方法有一个明显的问题,那就是在手机上面会让页面产生明显的闪烁,用户体验很不好
二.
在网上看到一个销毁,重建组件的方法,有人说可以,但是在我这会产生问题。方案如下:
通过v-if来控制组件是否创建。
1 <mt-popup v-model="selectboxShow" position="bottom" v-if="hackReset">
2 <mt-picker :slots="options" :showToolbar="showToolbar" valueKey="label" ref="picker" v-if="hackReset">
3 <mt-button @click="cancel">{{$t('m.btn_0004')}}</mt-button>
4 <mt-button @click="check" class="fr">{{$t('m.btn_0005')}}</mt-button>
5 </mt-picker>
6 </mt-popup>
1 data() {
2 return {
3 hackReset: true, // 是否重建组件
4 }
5 }
1 methods: {
2 changeLangen() {
3 this.changeLang("EN");
4 localStorage.setItem('language','EN')
5 this.isCn = false;
6 this.isEn = true;
7 this.hackReset = false // 销毁组件
8 this.$nextTick(() => {
9 this.hackReset = true
10 })
11 }
12 }
上面这种做法,对于要翻译data里面数据的情况,貌似并不能起到作用,正如前面所说,在登录页面组件created的时候,data里面的数据已经固定了
那么使用v-if销毁整个登录页面组件呢?
1 <template>
2 <div class="login" v-if="hackReset">
3 <div class="head">
4 <span class="title">{{$t('m.tit_0001')}}</span>
5 <img src="../../../assets/images/logo.png" />
6 </div>
7 <mt-popup>
8 ...
9 </mt-potup>
10 </div>
11 </template>
这样做,我遇到的问题是:
点击切换后,hackReset设置为false,当然,当前登录组件也就被销毁。后面的切换函数里面的代码根本没有this 好嘛。白瞎忙活
这样,我就只能用重新赋值这条路了吧?
三.
因为我需要设置预设值,所以新建一个js文件,在点击时使用bus提交一个事件;在新建的js文件里监听这个事件,把data暴露出来
登录组件引入这个js文件,把js文件内的值重新赋值给data
1 import { config } from '../../../assets/js/url_config.js'
1 methods:{
2 changeLangen() {
3 this.changeLang("EN");
4 localStorage.setItem('language','EN')
5 this.isCn = false;
6 this.isEn = true;
7 bus.$emit('getUrlConfig',this)
8 this.options[0] = config
9 }
10 }
js文件
1 import bus from './bus.js'
2 let config = null
3 bus.$on('getUrlConfig',function(vth){
4 config = { // 一个对象就是一个slot
5 values: [{
6 label: vth.$t('m.txt_p_0010'),
7 value: '1'
8 },
9 {
10 label: vth.$t('m.txt_p_0011'),
11 value: '2'
12 },
13 {
14 label: vth.$t('m.txt_p_0009'),
15 value: '3'
16 }
17 ]
18 }
19 })
20 export {config}
试了下,初步实现了功能,貌似还有些问题诶。
新手就只有这样了吧 |