我使用asyncData
来获取页面的当前数据,使用slug来查找我的应用程序接口(Strapi)中的数据。这对于新加载的页面很有效,但在导航到另一种语言(nuxt-i18n)时会失败。当导航到另一种语言时,将调用asyncData,但是由于某些原因,路由没有更新,因此段塞匹配失败。手动刷新页面会更新路由,然后插件会进行匹配。
// pages/_slug/index.vue
<script>
export default {
async asyncData({ params, route, $strapi, error, app, store, i18n }) {
const path = route.params.slug // <- This is not updated on page navigation using language switcher
const page = await $strapi.$pages.find({ slug: path, _locale: i18n.locale })
if (page.length === 0) {
error({ statusCode: 404, message: 'Page not found' })
return {}
}
// Get the slug for this page in every locale.
const localizedSlugs = {}
for (const code of i18n.localeCodes) {
localizedSlugs[code] = {
slug: route.params.slug,
}
}
for (const lang of page[0].localizations) {
const pageLocalized = await $strapi.$pages.find({ id: lang.id, _locale: lang.locale })
if (pageLocalized.length > 0) {
localizedSlugs[lang.locale].slug = pageLocalized[0].slug
}
}
await store.dispatch('i18n/setRouteParams', localizedSlugs)
return { page: page[0] }
}
}
</script>
我使用的语言切换器如下所示:
<template>
<div class="language-switcher">
<nuxt-link
v-for="locale in availableLocales"
:key="locale.code"
:to="switchLocalePath(locale.code)">
{{ locale.code }}
</nuxt-link>
</div>
</template>
<script>
export default {
computed: {
availableLocales() {
return this.$i18n.locales
},
},
}
</script>
你知道为什么在客户端导航到不同的语言后,route.params.slug
(或路由)没有更新吗?
编辑:我目前的解决方法是不使用NuxtLink
组件,而是使用普通的锚标签,如下所示:
<a
v-for="locale in availableLocales"
:key="locale.code"
:href="switchLocalePath(locale.code)">
{{ locale.code }}
</a>
这将重新加载页面并正确加载asyncData
所依赖的路由参数,以便将页面与应用程序编程接口进行匹配。
发布于 2021-05-25 23:40:43
更新:该问题已在vue-i18n@8.24.5
上修复
原始答案
您使用的nuxt-i18n和vue-i18n是什么版本?
我在nuxt中遇到了同样的问题:从nuxt上下文获取路由并将其与vuex存储中的validate()
数据进行匹配失败,因为路由没有更新。
对我来说,降级到vue-i18n@8.24.2
或更低的版本是可行的。看起来这是从8.24.3开始的一个问题。
我在这里提出了一个问题,但我不确定它是由vue-i18n还是https://github.com/kazupon/vue-i18n/issues/1230 -I18N解决的。
https://stackoverflow.com/questions/67240236
复制相似问题