原文:vuedose.tips/create-a-i1…javascript
在 Vue.js 3 中用 Composition API 编写插件的方式,和传统上经过一个 install
函数并被 Vue.use(plugin)
使用并不同;后者一般会在 Vue 原型上作操做或扩展。html
但在 Composition API 中的组件,操控是不可能操控的,且 i18n 组件要以一种 inject-provide 模式进行编码。举例来讲,能够像这样建立一个 i18n 插件:前端
// i18nPlugin.js
import { ref, provide, inject } from "@vue/composition-api";
const createI18n = config => ({
locale: ref(config.locale),
messages: config.messages,
$t(key) {
return this.messages[this.locale.value][key];
}
});
const i18nSymbol = Symbol();
export function provideI18n(i18nConfig) {
const i18n = createI18n(i18nConfig);
provide(i18nSymbol, i18n);
}
export function useI18n() {
const i18n = inject(i18nSymbol);
if (!i18n) throw new Error("No i18n provided!!!");
return i18n;
}
复制代码
如你所见,函数 provide
和 inject
被用来建立插件实例,并用一种依赖注入机制将其持有。vue
注意咱们在 locale 上使用了 ref
,由于要用到其反应式特性。java
若是你对 i18n 或 Composition API 尚不了解,能够先阅读:web
然后,必须在应用中经过调用 provideI18n
函数,用正确的配置初始化该插件。 这通常是在 App.vue 根组件中进行的:api
<script> import { provideI18n } from "./i18nPlugin"; import HelloWorld from "./HelloWorld"; export default { components: { HelloWorld }, setup() { provideI18n({ locale: "en", messages: { en: { hello_world: "Hello world" }, es: { hello_world: "Hola mundo" } } }); } }; </script>
复制代码
最终,在任何须要国际化的组件中,经过在 setup
入口函数中调用 useI18n
函数,来实现 inject。建立以下的 HelloWorld.vue 组件:ide
<template>
<div>
<h2>{{ i18n.$t('hello_world') }}</h2>
</div>
</template>
<script> import { useI18n } from "./i18nPlugin"; export default { setup() { const i18n = useI18n(); return { i18n }; } }; </script>
复制代码
可是...不能更改语言还差着很大点儿意思嘛~ 在以前的代码中添入这个功能:函数
<template>
<div>
<h2>{{ i18n.$t('hello_world') }}</h2>
<button @click="switchLanguage">Switch language</button>
</div>
</template>
<script> import { useI18n } from "./i18nPlugin"; export default { setup() { const i18n = useI18n(); const switchLanguage = () => { const locale = i18n.locale.value === "en" ? "es" : "en"; i18n.locale.value = locale; }; return { i18n, switchLanguage }; } }; </script>
复制代码
仅仅经过在一个按钮上调用 switchLanguage
函数,就实现了这个特性。单元测试
这就是所有要作的了。我之因此喜好 Composition API ,就是因其易于经过清晰的模式,开发可预测与可维护的代码。
查看更多前端好文
请搜索 fewelife 关注公众号
转载请注明出处