vue2使用国际化vue-i18n详解+ES6的import和export区别
1.安装vue-i18n:
npm install vue-i18n@6 -s
坑大了,我用vue2写一开始没考虑到兼容性,直接npm i vue-i18n装了最新的9.2.2版本的,装完控制台有
兼容性警告,说9.2只适用于vue3,但我没注意到,就一直出错,很奇怪,人麻了,后面重新安装
才注意到那句警告的话
所以以后安装第三方模块(包)还是要认真看控制台给出的警告,要不然踩坑直接怀疑自己哈哈
当然你也可以这样:
<script src="https://unpkg.com/vue-i18n/dist/vue-i18n.js"></script>
2.项目配置vue-i18n:
在src目录下创建i18n文件夹,在i18n文件夹内添加基础配置及各语言文本配置文件;
在index.js进行如下设置:
import Vue from 'vue';
import VueI18n from 'vue-i18n';
Vue.use(VueI18n);
// 引入各个语言配置文件
import zh from './config/zh';
import en from './config/en';
// 创建vue-i18n实例i18n
const i18n = new VueI18n({// 设置默认语言locale: localStorage.getItem('locale') || 'zh', // 语言标识,页面对应显示相同的语言// 添加多语言(每一个语言标示对应一个语言文件)messages: {zh,en,}
})
// 暴露i18n
export default i18n;
在各个语言配置文件中设置对应语言文案。注意:也就是说将页面中所有的文字都做成相应的语言的文件
//zh.js
const zh = {name: '姓名',info: {sex: '男'}
}
export default zh;
//en.js
const en = {name: 'name',info: {sex: 'male'}
}
export default en;
最后在外层main.js引入i18n,并挂载至vue实例:
import Vue from 'vue';
import App from './App.vue';
/*** 引入i18n国际化*/
import i18n from './i18n/index'; Vue.config.productionTio = false; new Vue({el: '#app',i18n, //创建根实例时,带上参数i18nrender: h => h(App)
});
3.项目使用:通过$t()方法
<p>{{$t("name")}}</p>
<p>{{$t("info.sex")}}</p>
<span v-text="$t('index')"></span>
4.修改语言:this.$i18n.locale = 语言编码;
这句是关键
vue中 .native修饰符: 可以在某个组件的根元素上监听一个原生事件。
通俗点讲:就是在父组件中给子组件绑定一个原生的事件,就将子组件变成了普通的HTML标签,不加. native事件是无法触发的
<template><div id="test-ka"><h3>{{lan}}</h3><p>{{$t("name")}}</p><p>{{$t("info.sex")}}</p><p><button @click="changeType('zh')">切换中文</button><button @click="changeType('en')">切换英文</button></p></div>
</template>
<script>export default {date() {return {lan:""}},beforeCreate() {console.log(this.$i18n.locale ); //zhconsole.log( localStorage.getItem('locale')); //zh},created() {this.lan=this.$i18n.locale //$i18n在实例刚创建完成就有了,这不是$el要在mounted时才能取到console.log(this.$i18n.locale ); //zhconsole.log( localStorage.getItem('locale')); //zh},methods:{changeType(type){// 此处做了语言选择记录,存在localStorage中,这里的作用只有一个当我重新请求页面
//的时候先取localStorage的记录值localStorage.setItem('locale',type)this.$i18n.locale = type; // 修改页面需要显示的语言this.lan=this.$i18n.locale}}
}
</script>
vue-i18n的原理:
首先,引入VueI18n,然后注册到Vue中。
Vue.use(VueI18n)
注册的过程,会执行一段代码:
Object.defineProperty(Vue.prototype, '$i18n', {get () { return this._i18n }
})
最开始this._i18n是没有赋值的,上述代码只是简单对数据劫持监听。
beforeCreate: function beforeCreate () {var options = this.$options;options.i18n = options.i18n || (options.__i18n ? {} : null);if (options.i18n) {} else if (this.$root && this.$root.$i18n && this.$root.$i18n instanceof VueI18n) {// root i18n 根vue实例this._i18n = this.$root.$i18n;this._i18n.subscribeDataChanging(this);this._subscribing = true;}
}
可以看到,以options为判断,最开始取值取的是options.i18n,而这个值并不存在,但是,在根实例this.$root中,i18n是存在的。
因为在创建根实例时,带上了参数i18n。
new Vue({el: '#app',i18n, // 我在这里render: h => h(App)
})
切换语言后,i18n是怎样起作用的?需要运行代码:
this.$i18n.locale = lang
然后在Vuei18n中,有一个监听local的方法
watchLocale (): ?Function {/* istanbul ignore if */if (!this._sync || !this._root) { return null }const target: any = this._vm // vue 实例return this._root.$i18n.vm.$watch('locale', (val) => {// 重新对 locale 赋值target.$set(target, 'locale', val) // 迫使 Vue 实例重新渲染target.$forceUpdate() }, { immediate: true })}
可以看到,当local改变的时候,会用forceUpdate方法强制Vue重新渲染页面。
$forceUpdate():这是vue的一个方法,是强制更新的意思,更新视图和数据,触发updated生命周期。
参考了这篇文章
参考了这篇文章
i18n的原理参考这篇文章
附:
用vue脚手架创建项目时虽然vue create prejectName是脚手架3的写法,但你用这个命令创建不代表你安装的是脚手架3,你的脚手架是已经被全局安装过了,cmd可以查到对应的版本,所以你安装的就是cmd查到的对应的版本。后面安装过程中让你选vue2.0或者vue3.0指的就是vue语法了
//vue可以配置import导入用@替换相应的路径而不考虑层级
import {i18n} from "@/i18n" //vue有时候用@表示路径,默认只表示.,但正常在vue.config.js中重新配置//vue.config.js
const path = require('path')
module.exports = {configureWebpack: {resolve: {alias: {'@': path.resolve(__dirname, 'src') //即@代表src,还可以配置其他符号来代表其他路径}}}
}
ES6的import和export区别:
export const def=function(){} //必须声明变量,不能把const去掉,而一旦声明变量就只能export,不能export default,语法不支持import * as mod from "./utils.js"; //直接导出的可以用*作为模块导入console.log(mod.def);
或者 import {def} from "./utils.js" //解构赋值,因为不是默认导出,只能解构对应
export default function(){} //默认导出的
import obser from "./observe.js"; //导入可以任意命名
或者
import *as modobser from "./observe.js"; //用as作为模块导入
console.log(modobser.default); //只不过要这样取结果
总结:
export default和export 都可以用* as作为模块导入,同时export导出还能用解构赋值import,而 export default还可以任意命名import
vue2使用国际化vue-i18n详解+ES6的import和export区别相关推荐
- Vue实例详解与生命周期
Vue实例详解与生命周期 http://www.jianshu.com/p/b5858f1e6e76 Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理. ...
- Vue中 Vue.prototype 详解及使用——作用:避免和已被定义的数据、方法、计算属性产生冲突
Vue中 Vue.prototype 详解及使用--作用:避免和已被定义的数据.方法.计算属性产生冲突 **应用场景:**在很多组件里用到数据/实用工具,但是不想污染全局作用域.这种情况下,可以通过在 ...
- 七、Vue cli详解学习笔记——什么是Vue cli ,Vue cli的使用(安装,拉取2.x模板,初始化项目),Vue cli2详解,Runtime-Compiler和Runtime-only区别
一.什么是Vue CLI 如果你只是简单写几个Vue的Demo程序, 那么你不需要Vue CLI. 如果你在开发大型项目, 那么你需要, 并且必然需要使用Vue CLI 使用Vue.js开发大型应用时 ...
- Linux运行脚手架vue,Linux Nodejs与vue脚手架详解
本篇教程介绍了Linux Nodejs与vue脚手架详解,希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入. < https://nodejs.org/dist/v8.9 ...
- vue路由详解 --基础
vue路由详解 --基础 1.router-link 和router-view组件 router-link相当于封装了一个a标签 router-view为组件显示的位置 <router-link ...
- Electron vue使用详解
Electron vue使用详解 Electron是什么? Electron 是一个框架,可以让您使用 JavaScript, HTML 和 CSS 创建桌面应用程序. 然后这些应用程序可以打包在m ...
- findindex遍历 js_详解ES6数组方法find()、findIndex()的总结
本文主要讲解ES6数组方法find()与findIndex(),关于JS的更多数组方法,可参考以下: 1. find() 该方法主要应用于查找第一个符合条件的数组元素,即返回通过测试(函数内判断)的数 ...
- 【Vue组件详解(一)】
Vue组件详解(一) 简介 对组件的理解 传统方式编写页面 组件方式编写页面 非单文件组件 完整代码 总结 简介 组件的定义其实就是实现应用中局部功能代码(html,css,js)和资源(MP3 ,M ...
- [CSS]详解display:inline | block |inline-block的区别
2019独角兽企业重金招聘Python工程师标准>>> [CSS]详解display:inline | block |inline-block的区别[点评网站][发布新闻][申请专栏 ...
最新文章
- java培训学习阶段步骤讲解
- python基础常用语句-python爬虫之python一条语句分析几个常用函数和概念
- 【Android 插件化】现有的针对插件化恶意应用的解决方案 | 插件化应用开发推荐方案
- oracle ogg00423,ogg实现Oracle到SQL Server 2005的同步
- [转] Web前端优化之 内容篇
- JavaScript MVC框架和语言总结[infoq]
- Java设计模式(十四):MVC设计模式
- Java 技术篇 - 从指定的web网页页面中读取html内容实例演示,从http协议下的url地址中读取web页面内容方法
- java.sql.SQLException: Lock wait timeout exceeded --转
- android必须服务,说说在Android如何使用服务(Service)的方法
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- 你增长的年龄,是因为丢掉了快乐吗?
- net java互相调用_Java与.NET的WebServices相互调用
- keil5图标变成白色_平面设计:创建万圣节图标
- 23种设计模式(二十四)领域规则之解析器
- Mac电脑如何从视频中提取帧并将其保存为图像
- Python学习日记之忽略删除字符串空白
- 小腹下面是什么部位_产后新妈妈去掉大肚腩,恢复平坦小腹,不妨试试这4个动作...
- AndroidManifest中android:label与第三方库冲突问题
- 内燃机设计课设 过量空气系数与温度表对应关系自动查询
热门文章
- 对城市名搜索(汉字、拼音)功能的改进 / 小程序城市区县定位模块改进
- 树的高度单位换算 c语言编辑,小数与单位换算的公式(小数长度单位换算口诀)...
- mysql怎么建组合索引_mysql索引及建立组合索引原则
- HEC-HMS水文模型应用教程
- c语言if语句教学设计,c语言if语句教学设计
- JAVA计算机毕业设计企业员工工资管理系统(附源码、数据库)
- 数据库基础面试题-中级32道
- MCE | TGF-β 信号通路
- pacemaker corosync 高可用
- python如何将三维图变成动态_python – 在matplotlib中制作动画三维散点图