#javascript #vue.js #nuxt.js
#javascript #vue.js #nuxt.js
Вопрос:
Я использую модуль nuxt / content для создания сайта документации.
В блоге Nuxt у них есть один пост, отображающий содержимое на отдельной странице index.vue и сведения о публикации на странице _slug.vue.
То, что я пытаюсь сделать, это показать список статей / сообщений на той же странице, используя другой макет.
Вот структура папок, которую я использую:
content (folder)
articles (folder)
article1.md
article2.md
article3.md
pages (folder)
blog (folder)
_slug.vue
index.vue
И это файл my_slug.vue:
<template>
<div class="flex">
<aside class="w-1/3">
<ul>
<li v-for="article in articles" :key="article.slug">
<NuxtLink :to="{ name: 'blog-slug', params: { slug: article.slug } }">
<div>
<h2>{{ article.title }}</h2>
</div>
</NuxtLink>
</li>
</ul>
</aside>
<main class="w-full">
<h1>{{ article.title }}</h1>
<p>Article last updated: {{ formatDate(article.updatedAt) }}</p>
<nuxt-content :document="article" />
<prev-next :prev="prev" :next="next" />
</main>
<aside class="w-1/3">
<h4>On this page</h4>
<nav>
<ul>
<li v-for="link of article.toc" :key="link.id">
<NuxtLink :to="`#${link.id}`" :class="{ 'py-2': link.depth === 2, 'ml-2 pb-2': link.depth === 3 }">{{ link.text }}</NuxtLink>
</li>
</ul>
</nav>
</aside>
</div>
</template>
<script>
export default {
async asyncData({ $content, params }) {
const articles = await $content('articles', params.slug)
.only(['title', 'slug'])
.sortBy('createdAt', 'asc')
.fetch()
const article = await $content('articles', params.slug).fetch()
const [prev, next] = await $content('articles')
.only(['title', 'slug'])
.sortBy('createdAt', 'asc')
.surround(params.slug)
.fetch()
return {
articles,
article,
prev,
next
}
},
methods: {
formatDate(date) {
const options = { year: 'numeric', month: 'long', day: 'numeric' }
return new Date(date).toLocaleDateString('en', options)
}
}
}
</script>
Если я использую фрагмент кода «Отобразить все статьи» на странице index.vue, это работает, но вместе на _slug.vue список теперь пуст.
Вот индекс, в котором сообщения отображаются правильно:
<template>
<div>
<h1>Blog Posts</h1>
<ul>
<li v-for="article of articles" :key="article.slug">
<NuxtLink :to="{ name: 'blog-slug', params: { slug: article.slug } }">
<div>
<h2>{{ article.title }}</h2>
</div>
</NuxtLink>
</li>
</ul>
</div>
</template>
<script>
export default {
async asyncData({ $content, params }) {
const articles = await $content('articles', params.slug)
.only(['title', 'slug'])
.sortBy('createdAt', 'asc')
.fetch()
return {
articles
}
}
}
</script>
<style>
</style>
Я что-то упускаю?
Ответ №1:
Статьи не извлекаются, поскольку ваш запрос неверен, вы должны выполнить поиск в articles
папке:
const articles = await $content('articles') // instead of $content('articles', params.slug)
.only(['title', 'slug'])
.sortBy('createdAt', 'asc')
.fetch()