我有一个可组合项,可以获取并存储全局变量:
// useRandomEmoji.ts
export default async function() {
const { data, refresh, execute } = await useAsyncData(
'randomEmoji',
() => $fetch("/api/emojis/random"),
{ immediate: false }
)
if (!data.value) execute()
return {
randomEmoji: data,
refreshRandomEmoji: refresh
}
}
然后,我动态分配标题,每当值更改时,它应该仅在页面重新加载时更改:
// app.vue
const { randomEmoji } = await useRandomEmoji()
watch(() => randomEmoji.value, () => {
useHead({
title: `Nuxt ESR Emojis ${parseEmoji(randomEmoji.value?.htmlCode)}`
})
})
它工作得很好,但是,如果你:
浏览器似乎记住了每个页面的标题是什么。然而,在 html 检查模式下,标题在每个页面上显示实际值。
我尝试过的:
您可以在这里重现它: https://nuxt-esr-emojis.pages.dev
源代码: https://github.com/frontendlegend/nuxt-esr-emojis
使用的浏览器:Google Chrome
如何使浏览器选项卡在每个页面上显示实际的标题,即使您在其他页面上重新加载并使用浏览器按钮导航也是如此?
出现此问题的原因是,在使用后退和前进按钮导航时,浏览器缓存了页面(包括其标题)。即使 Nuxt 在客户端正确更新
document.title
,浏览器选项卡可能并不总是立即反映它。
所以,只要添加一个简单的手表,就可以直接设置
document.title
。每当您的数据发生变化时,直接更新浏览器标题:
watch(() => randomEmoji.value, (newValue) => {
document.title = `Nuxt ESR Emojis ${parseEmoji(newValue?.htmlCode)}`;
}, { immediate: true });
希望这有帮助! 🌷