vue 雙語言切換中,data內翻譯文字不正常切換的解決方案


背景

有這么一個登錄頁面,相關功能如下:

  1. 支持雙語言,點擊切換語言
  2. 表單內部有一個自定義的select,里面option的label、value都是的名字由外部提供;其中預設的option的label使用this.$t(...)提供

問題

在點擊切換語言的時候,頁面上翻譯的文件都能夠正常轉換、唯獨預設option的label不能,如下圖,在切換到英文的時候,頁面中其余部分都能夠轉換成英文,除了選擇框里面的“xx中心”

 

原因

data里面的數據($t('m.txt_001'))會在created的時候根據當前語言轉換成對應語言的文字(數據中心);

點擊語言切換,其它地方會正常執行翻譯,而data里面的數據已經是中文了,不會再改變成英文,

=> 除非刷新頁面、或者重新為data賦值

 方案

  1. 點擊切換語言的時候,同時刷新頁面,讓整個頁面重新加載

  2. 重新為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}

試了下,初步實現了功能,貌似還有些問題誒。

新手就只有這樣了吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM