Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 706|回复: 0

vue 双语言切换中,data内翻译文字不正常切换的解决方案

[复制链接]
  • TA的每日心情
    奋斗
    4 天前
  • 签到天数: 802 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726006
    发表于 2021-6-8 15:17:23 | 显示全部楼层 |阅读模式

    背景

    有这么一个登录页面,相关功能如下:

    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}

    试了下,初步实现了功能,貌似还有些问题诶。

    新手就只有这样了吧

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-11-15 07:40 , Processed in 0.071414 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表