Vue3 组合式 API 使用 i18n 实现本地化

Vue3 使用选项式 API 较容易,按文档上手就行,这里就不多说。组合式 API 上手会比较麻烦一点。

创建实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// app.js
import { createApp } from 'vue';
import { createI18n } from 'vue-i18n';
import App from './App.vue';

const i18n = createI18n({
locale: 'cn', // 设置当前语言
legacy: false, // 要支持组合式API,此项必须设置为false;
// globalInjection: true, // 全局vue视图中注册$t方法,vue-i18n v9.2 之后默认是 true
messages: {
cn: {
message: {
hello: '你好',
},
},
en: {
message: {
hello: 'hello',
},
},
},
});

const app = createApp(App);
app.use(i18n);
app.mount('#app')

基本使用

1
2
3
4
5
6
7
8
9
10
<!-- App.vue -->
<script setup>
import { useI18n } from 'vue-i18n';
const { t } = useI18n(); // 组合式 API 使用 vue-i18n,关键是 createI18n 的 legacy 参数要设置成 false
console.log(t('message.hello'));
</script>

<template>
<div>在视图中使用语言: {{ $t('message.hello') }}</div>
</template>

自定义全局方法使用 vue-i18n

组合式 API 每次要 import 又要导出要用的函数,需要频繁使用,这样太麻烦了。
我们可以定义 window.$t 全局函数,这样在 setup 中也能直接用 $t()取得语言信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// app.js
import { createApp } from 'vue';
import { createI18n } from 'vue-i18n';
import App from './App.vue';

const i18n = createI18n({
locale: 'cn',
messages: {
cn: {
hello: '你好',
},
en: {
hello: 'hello',
},
},
});

window.$t = function() {
return i18n.global.t(...arguments);
}

const app = createApp(App);
app.use(i18n);
app.mount('#app')

备注

更多用法见官方文档: https://vue-i18n.intlify.dev/guide/

ElementPlus 开发 SPA 应用 dev 模式加载太慢的原因及解决办法

问题复现

开发 SPA 应用用到 ElementPlus,官方推荐用 自动导入 方式来引用。

如果你用笔记本开发,那么预览时 js 的加载速度会极慢,node 占 CPU 超过100%,非常影响开发体验,恨不得换到 MPA 模式开发。

原因

因为自动自动导入方式预览时,要加载一百多个js文件。如果你用的是强劲的台式机,用这个方式没发现有明细的卡。笔记本 CPU 顶不住。

解决办法

完整引入按需导入 就没这个问题。

建议使用 完整引入 方式,ElementPlus 相关 js 就只引入了一个 /node_modules/.vite/deps/element-plus.js,而不是自动导入的上百的js文件。

编译后 element-plus 后的 js gz 后需要多传输 100k 左右,如果你受不了,可以另外加一个自动加载的 vite 配置,在增加一个创建不用全局引入 ElementPlus 的入口文件给 vite 引用。

如:build 时使用 vite.build.js 配置,在 vite.build.js 中引用使用 自动导入 的js入口文件。再把 package.jsonscripts.build 改为 vite build --config vite.build.js,这样就可以实现 dev 时使用完整引入ElementPlus,build 时使用自动导入减少编译文件的大小。

在 Vue3 <script setup> + 组合式 API 之 怎用使用响应式变量

什么是响应式?

Vue3 的响应式是:当更改响应式对象的值改变时,视图会随即自动更新。

ref()

ref() 返回一个响应式对象,可以用 value 属性来访问或更改对象的值。
ref 对象在模板中会自动解包,用变量名不需要加 .value 就能访问。

1
2
3
4
5
6
7
8
9
10
11
<script setup>
import { ref } from 'vue';

const say = ref('hi'); // 定义值为 hi 的响应式变量 say
say.value = 'hello'; // 把 say 的值改为 hello
</script>

<template>
<!-- 自动解包,不需要些成 {{ say.value }} -->
<p>{{ say }}</p>
</template>

reactive()

阅读更多

Vue3(单文件组件 + <script setup> + 组合式 API)组件实例常用内置属性、方法、函数

本文总结 Vue3 组件实例在模板中暴露的常用公共属性和方法,以及对应的 组合式 API 函数。

$data/$props/$options 属性在 组合式 API 下几乎用不到。
$el 不建议用。
$slots 表示父组件所传入插槽的一个对象,很少用,有兴趣可查看官方文档

$parent

模板中用 $parent 获取父组件实例,可访问父组件用 defineExpose() 显式暴露的绑定。

组合式 API 先在 setup 中用 getCurrentInstance() 获取到当前组件实例,再用 parent 属性访问父组件。getCurrentInstance().parent 除了能访问父组 defineExpose() 暴漏的绑定外,能访问父组件更多的属性和方法,多用于组件的开发,在应用开发中一般不建议用。

1
2
3
4
5
import { getCurrentInstance } from 'vue';

const parent = getCurrentInstance().parent; // 获取父组件的实例
parent.exposed // 访问父组件 defineExpose() 暴露的绑定
parent.refs // 父组件中的模板引用,在模板中用 $parent.$refs

$root

阅读更多

Vue3 组件间相互访问(单文件 + <script setup> + 组合式 API 举例)

父组件传参数到子组件 - props

<script setup> 中用 defineProps() 声明组件的属性,在父组件模板中引用子组件时,就可以给通过属性给子组件传参数(可以是值、变量、函数、对象等)。

defineProps 是编译器宏,Vue3 编译器宏不需要导入,并且只能在 <script setup> 中使用。

ex: 子组件声明、调用属性

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- HelloWorld.vue 子组件-->
<script setup>
// 声明属性
defineProps([{
msg: String
}])
</script>

<template>
<div>
{{ msg }}
</div>
</template>

ex: 父组件使用属性

1
2
3
4
5
6
7
8
<!-- Demo.vue 父组件 -->
<script setup>
import HelloWorld from './HelloWorld.vue'
</script>

<template>
<HelloWorld msg="Welcome"/>
</template>

父组件传递事件到子组件

阅读更多

VueRouter 后退页面刷新问题解决方案

用 VueRouter hash 模式时,点击浏览器上的后退按钮,浏览器显示上一次浏览页面的时候,会重新执行页面,像页面刷新一样。

跟微信小程序不一样,微信小程序后退的时候不会重新执行,只是给我们一个 onShow 事件,这样如果需要刷新数据,我们就可以在 onShow 里面解决。

阅读更多

在 Vue3 单文件组件中使用 <script setup> + 组合式 API

<script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖。当同时使用 SFC 与组合式 API 时该语法是默认推荐。

基本语法

<script> 标签上添加 setup 属性启用该语法,里面的代码会背编译成组件 setup() 函数的内容,每次组件实例被创建时执行。

1
2
3
<script setup>
// 组合式 API 写在这里
</script>

如果要使用 TypeScript,加上 lang="ts" 属性即可。

1
2
<script lang="ts" setup>
</script>

当使用 <script setup> 的时候,任何在 <script setup> 声明的顶层的绑定 (包括变量,函数声明,以及 import 导入的内容) 都能在模板中直接使用。

响应式

响应式即变量数据变化的时候,视图跟着变化。
响应式状态需要明确使用 响应式 API 来创建.
常用 API:

  • ref()
  • reactive()
  • computed()
  • watch()
  • watchEffect()
  • readonly()
阅读更多