背景

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

  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}

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

新手就只有这样了吧

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

  1. 使用vue国际化中出现内置的组件无法切换语言的问题(element-ui、ivew)

    在main.js中引入对应组件的语言包 eg: import VueI18n from 'vue-i18n'; // 引入国际化 import elementEn from 'element-ui/l ...

  2. 【原创】DESTOON做中英双语言(多语言)切换版本具体详解

    第一次发原创好激动,该注意点什么? 在开发过程中用户有许多要求,比如这个多语言切换就是一个需求. 首先讲解一下DESTOON(DT)后台系统如何做这个中英.甚至多语言切换的这个功能. DT本身不自带多 ...

  3. Android程序中,内嵌ELF可执行文件-- Android开发C语言混合编程总结

    前言 都知道的,Android基于Linux系统,然后覆盖了一层由Java虚拟机为核心的壳系统.跟一般常见的Linux+Java系统不同的,是其中有对硬件驱动进行支持,以避开GPL开源协议限制的HAL ...

  4. vue组件中data为什么必须是个函数

    <body> <div id="app"> <counter></counter> </div> <templat ...

  5. 〖Android〗Android App项目资源字符串检查(检查是否缺少对应的翻译,导致系统切换语言后崩溃)

    Android项目开发过程中,容易出现缺少对应中英文翻译的情况,这个Python脚本是用于检查字符串是否缺少了对应的翻译 #!/usr/bin/env python # encoding: utf-8 ...

  6. 通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制

    通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制 前言说明 本篇为网易云课堂Linux内核分析课程的第四周作业,我将通过调用C语言的库函数与在C代码中 ...

  7. vue.js 中 data, prop, computed, method,watch 介绍

    vue.js 中 data, prop, computed, method,watch 介绍 data, prop, computed, method 的区别 类型 加载顺序 加载时间 写法 作用 备 ...

  8. 十、Vue:Vuex实现data(){}内数据多个组件间共享

    一.概述 官方文档:https://vuex.vuejs.org/zh/installation.html 1.1vuex有什么用 Vuex:实现data(){}内数据多个组件间共享一种解决方案(类似 ...

  9. dart系列之:dart语言中的内置类型

    目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...

随机推荐

  1. WordPress 去掉底部的自豪的采用WordPress

    WordPress 去掉底部的自豪的采用WordPress  

  2. 决策树(中)-集成学习、RF、AdaBoost、Boost Tree、GBDT

    参考资料(要是对于本文的理解不够透彻,必须将以下博客认知阅读): 1. https://zhuanlan.zhihu.com/p/86263786 2.https://blog.csdn.net/li ...

  3. 逻辑卷LVM

    1.理解LVM http://www.cnblogs.com/gaojun/archive/2012/08/22/2650229.html 2.创建LVM 根据“理解LVM”提供的原理思路搞 a)建立 ...

  4. scrapy_redis分布式爬虫

    文章来源:https://github.com/rmax/scrapy-redis Scrapy-Redis Documentation: https://scrapy-redis.readthedo ...

  5. Ubuntu改坏sudoers后无法使用sudo的解决办法

    练习安装odoo的时候,创建了一个odoo用户,想把它赋予sudo权限,然而,编辑的时候不留意,改坏了,导致sudo无法使用,无法编辑sudoers文件修改回来. 总提示如下信息: >>& ...

  6. inventory

    1.设置主机的默认inventory mode. 2. 设置自动Populate 数据

  7. Python算法——《算法图解》笔记

    算法目录 二分查找 大O表示法 选择排序 递归 快速排序,分而治之(D&C) 散列表——字典 广度优先搜索——BFS Dijkstra算法 贪婪算法 二分查找 # 要求list是有序表,num ...

  8. SCAU-1076 K尾相等数

    代码借鉴SCAU-OJ(感谢!!) 题目:1076 K尾相等数 时间限制:500MS  内存限制:65536K提交次数:251 通过次数:80 题型: 编程题   语言: G++;GCC   Desc ...

  9. PostGIS 查询点在线上

    1.缓冲区法:查询数据库fm表里,与坐标(12989691.512 4798962.444)相距0.0001米的数据(3857坐标系) ),),),),geom) ; --如果坐标系统一,不用tran ...

  10. 2019-11-28:ssrf基础学习,笔记

    ssrf服务端请求伪造ssrf是一种由恶意访问者构造形成由服务端发起请求的一个安全漏洞,一般情况下,ssrf访问的目标是从外网无法访问的内部系统,正式因为它是由服务端发起的,所以它能请求到它相连而外网 ...