В компоненте заголовка я хочу загружать ссылки асинхронно. Мне было интересно, почему на начальной (отрисованной на сервере) странице NuxtLinks не было активного класса, поэтому я нашел это сообщение об ошибке в консоли при доступе к localhost:3000/blog
[Vue warn]: Hydration class mismatch on <a href="/blog" class data-v-49fb23b8>Blog</a>
- rendered on server: class = ""
- expected on client: class = "router-link-active router-link-exact-active"
Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.
You should fix the source of the mismatch.
at <RouterLink ref=fn to = "blog" activeClass=undefined ... >
at <NuxtLink to = "blog" >
at <Header>
at <Default ref=Ref< undefined > >
at <LayoutLoader key = "default" layoutProps= {ref: RefImpl} name = "default" >
at <NuxtLayoutProvider layoutProps= {ref: RefImpl} key = "default" name = "default" ... >
at <NuxtLayout>
at <App key=4 >
at <NuxtRoot>
Вот как выглядит компонент <Header>
:
Я использую setTimeout для имитации асинхронного вызова, который хочу сделать.
<template>
<ul>
<li v-for = "link in links" :key = "link.id">
<NuxtLink :to = "link.slug" >
{{ link.name }}
</NuxtLink>
</li>
</ul>
</template>
<script setup>
const {data: links} = await useAsyncData(() => {
return new Promise((resolve, reject) => {
setTimeout(
() => resolve(
[
{ id: 1, slug: 'blog', name: 'Blog' },
{ id: 2, slug: 'about', name: 'About' }
]
), 500)
});
});
</script>
<style scoped>
.router-link-active {
color: red;
}
</style>
Судя по тому, что я прочитал, асинхронный вызов уже должен ожидаться на стороне сервера, и, следовательно, активный класс должен быть установлен уже на сервере (из https://nuxt.com/docs/getting-started/data-fetching #саспенс).
Судя по сообщениям об ошибках, в части, отображаемой на сервере, отсутствует активный класс?
Я не уверен, что делаю неправильно, я все еще немного отвык от Nuxt3 и Vue.
Возможно, я мог бы попробовать использовать пользовательскую выборку (https://nuxt.com/docs/guide/recipes/custom-usefetch), но я не уверен, почему она не должна работать и с useAsyncData()
Установлен ли на вашем компьютере класс router-link-active при обновлении, например? на localhost:3000/blog
? Редактировать: спасибо за отзыв, тогда я проверю, что я делаю на своей странице не так!
С помощью комментария Рейгана я узнал, что на моей странице нужно что-то сделать.
Воспроизвести это было немного сложнее, поскольку ошибка возникала только при новом запуске сервера разработки Nuxt и последующем обновлении.
Для меня это исправило то, что теперь я использовал ref()
там, где он мне действительно был нужен. Казалось, это каким-то образом вызвало конфликт.
Я проверил ваш код и не вижу никаких предупреждений со своей стороны.