import { useToast } from "vue-toastification";
import { useI18n } from "vue-i18n";
export default function useToastMsg(message, type) {
const { t } = useI18n();
const toast = useToast()
if (type == "success") {
return toast.success(t(`${message}`))
} else if (type == "error") {
return toast.error(t(`${message}`))
}
}
我正在尝试在操作发生后在商店中使用此功能。store.js import useToast from "@/composables/toast"
作用功能:useToast("submit", "success")
错误信息:Uncaught (in promise) SyntaxError: Must be called at the top of a
设置function
我该如何解决这个问题?
5条答案
按热度按时间ig9co6j11#
这让我有些头疼。但最终我还是想出了一个简单的解决方案。
第一步:初始化i18n,如下所示:
步骤2:将上面的i18n示例添加到Vue应用程序中,如下所示:
这就是你目前为止的i18n设置。现在,当你想在pinia中使用它时,你可以这样做:
lskq00tm2#
useI18n()
只能在setup()
函数的顶部使用,因为它需要使用Composition API的inject()
。解决方法是将
$t()
传递到useToastMsg()
:demo
xsuvu9jc3#
在store中定义一个包含i18n示例变量,并定义一个getter来访问它:
在某个地方,最好在应用程序初始化期间,在pinia创建之后,创建i18n,然后分配其示例:
那么商店中的任何地方都可以使用i18n示例:
llycmphe4#
从我的Angular 来看,最好提供整个Vue应用程序的链接来存储。它不需要任何费用,因为它只是链接到对象。对于Vue 3.x,这是官方的方式-属性
app
是链接到您的应用程序,我们可以通过pinia插件为Vue 2.x做同样的事情src/main.js
Vue初始化:src/index.d.ts
让TypeScript知道这个属性:示例-从pinia操作访问:
wkftcu5l5#
如果您使用的是Nuxt 3,例如想在商店更改时更新语言。您可以观察pinia状态的变化,并在组件中执行
setLocale
(或其他任何内容)。最好是始终存在的一个,例如App.vue
或布局(例如layouts/default.vue
)我找到了其他解决hacky/mess的方法,所以这个要干净得多。