vue 双语言切换中,data内翻译文字不正常切换的解决方案
背景
有这么一个登录页面,相关功能如下:
- 支持双语言,点击切换语言
 - 表单内部有一个自定义的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来控制组件是否创建。
<mt-popup v-model="selectboxShow" position="bottom" v-if="hackReset">
<mt-picker :slots="options" :showToolbar="showToolbar" valueKey="label" ref="picker" v-if="hackReset">
<mt-button @click="cancel">{{$t('m.btn_0004')}}</mt-button>
<mt-button @click="check" class="fr">{{$t('m.btn_0005')}}</mt-button>
</mt-picker>
</mt-popup>
  data() {
       return {
                 hackReset: true, // 是否重建组件
     }
 }
 methods: {
    changeLangen() {
         this.changeLang("EN");
                 localStorage.setItem('language','EN')
         this.isCn = false;
         this.isEn = true;
         this.hackReset = false // 销毁组件
         this.$nextTick(() => {
                   this.hackReset = true
 })
       }
 }
上面这种做法,对于要翻译data里面数据的情况,貌似并不能起到作用,正如前面所说,在登录页面组件created的时候,data里面的数据已经固定了
那么使用v-if销毁整个登录页面组件呢?
<template>
<div class="login" v-if="hackReset">
<div class="head">
<span class="title">{{$t('m.tit_0001')}}</span>
<img src="../../../assets/images/logo.png" />
</div>
<mt-popup>
...
</mt-potup>
</div>
</template>
这样做,我遇到的问题是:
点击切换后,hackReset设置为false,当然,当前登录组件也就被销毁。后面的切换函数里面的代码根本没有this 好嘛。白瞎忙活

这样,我就只能用重新赋值这条路了吧?
三.
因为我需要设置预设值,所以新建一个js文件,在点击时使用bus提交一个事件;在新建的js文件里监听这个事件,把data暴露出来
登录组件引入这个js文件,把js文件内的值重新赋值给data
     import { config } from '../../../assets/js/url_config.js'
 methods:{
   changeLangen() {
         this.changeLang("EN");
                 localStorage.setItem('language','EN')
         this.isCn = false;
         this.isEn = true;
                 bus.$emit('getUrlConfig',this)
                 this.options[0] = config
       }
 }
js文件
import bus from './bus.js'
let config = null
bus.$on('getUrlConfig',function(vth){
config = { // 一个对象就是一个slot
values: [{
label: vth.$t('m.txt_p_0010'),
value: '1'
},
{
label: vth.$t('m.txt_p_0011'),
value: '2'
},
{
label: vth.$t('m.txt_p_0009'),
value: '3'
}
]
}
})
export {config}
试了下,初步实现了功能,貌似还有些问题诶。
新手就只有这样了吧
vue 双语言切换中,data内翻译文字不正常切换的解决方案的更多相关文章
- 使用vue国际化中出现内置的组件无法切换语言的问题(element-ui、ivew)
		
在main.js中引入对应组件的语言包 eg: import VueI18n from 'vue-i18n'; // 引入国际化 import elementEn from 'element-ui/l ...
 - 【原创】DESTOON做中英双语言(多语言)切换版本具体详解
		
第一次发原创好激动,该注意点什么? 在开发过程中用户有许多要求,比如这个多语言切换就是一个需求. 首先讲解一下DESTOON(DT)后台系统如何做这个中英.甚至多语言切换的这个功能. DT本身不自带多 ...
 - Android程序中,内嵌ELF可执行文件-- Android开发C语言混合编程总结
		
前言 都知道的,Android基于Linux系统,然后覆盖了一层由Java虚拟机为核心的壳系统.跟一般常见的Linux+Java系统不同的,是其中有对硬件驱动进行支持,以避开GPL开源协议限制的HAL ...
 - vue组件中data为什么必须是个函数
		
<body> <div id="app"> <counter></counter> </div> <templat ...
 - 〖Android〗Android App项目资源字符串检查(检查是否缺少对应的翻译,导致系统切换语言后崩溃)
		
Android项目开发过程中,容易出现缺少对应中英文翻译的情况,这个Python脚本是用于检查字符串是否缺少了对应的翻译 #!/usr/bin/env python # encoding: utf-8 ...
 - 通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制
		
通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制 前言说明 本篇为网易云课堂Linux内核分析课程的第四周作业,我将通过调用C语言的库函数与在C代码中 ...
 - vue.js 中 data, prop, computed, method,watch 介绍
		
vue.js 中 data, prop, computed, method,watch 介绍 data, prop, computed, method 的区别 类型 加载顺序 加载时间 写法 作用 备 ...
 - 十、Vue:Vuex实现data(){}内数据多个组件间共享
		
一.概述 官方文档:https://vuex.vuejs.org/zh/installation.html 1.1vuex有什么用 Vuex:实现data(){}内数据多个组件间共享一种解决方案(类似 ...
 - dart系列之:dart语言中的内置类型
		
目录 简介 Null 数字 字符串 布尔值 列表 set和map 简介 和所有的编程语言一样,dart有他内置的语言类型,这些内置类型都继承自Object,当然这些内置类型是dart语言的基础,只有掌 ...
 
随机推荐
- Docker从入门到实践(1)
			
一.Docker简介 1.1.什么是 Docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多 ...
 - linux网络测试命令
			
一.ping 它通过向目标主机发送一个个数据包以及接受数据包的回应来判断主机和目标主机之间网络连接情况.ping的两个功能:判断网络是否可达.网络性能统计. ping使用的是网络层的ICMP协议. p ...
 - linux内核的preempt抢占调度,preempt_count抢占保护“锁”
			
抢断调度,是调度机制对实时系统需要的支持,是一种快速响应的重调度机制.既然与重调度有关,那么就先回顾一下调度和重调度. 调度分两种情况,1. 一种是自愿调度,由代码主动调用schedule来让度cpu ...
 - postgresql12 b-tree v4空间上和性能上的优化
			
在 pg v11 和 v12 上 常见测试用例 CREATE TABLE rel ( a bigint NOT NULL, b bigint NOT NULL ); ALTER TABLE rel A ...
 - linuxLVM之LV扩大和缩小容量(非xfs文件系统)
			
LVM的基础请见:https://www.cnblogs.com/wxxjianchi/p/9698089.html 一.放大LV的容量.放大容量是由内而外来操作的. 1.设置新的lvm分区:用fdi ...
 - OAuth 2.0 概念及授权流程梳理
			
本文可以转载,但请注明出处https://www.cnblogs.com/hellxz/p/oauth2_process.html OAuth2 的概念 OAuth是一个关于授权的开放网络标准,OAu ...
 - 软件测试必须掌握的抓包工具Wireshark,你会了么?
			
作为软件测试工程师,大家在工作中肯定经常会用到各种抓包工具来辅助测试,比如浏览器自带的抓包工具-F12,方便又快捷:比如时下特别流行的Fiddler工具,使用各种web和APP测试的各种场景的抓包分析 ...
 - Vue之组件及组件通信
			
组件之全局组件 //注意:需要在Vue实例化之前注册全局组件,使用Vue.component("组件名",{ template:`组件模板` }) Vue.component(&q ...
 - 07-kubernetes Ingress 原理 和 Ingress-nginx 案例
			
目录 Service 类型 namespace 名称空间 Ingress Controller Ingress Ingress-nginx 进行测试 创建对应的后端Pod和Service 创建 Ing ...
 - Python的特有的参数传递(*和**)
			
目录 值传递 引用传递 python的传递方式具有两种值传递和引用传递.除此之外,python中还允许包裹方式的参数传递,这未不确定参数个数和参数类型的函数调用提供了基础: 值传递 int.float ...