You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Nuxt Content中按分类获取嵌套Markdown文件并渲染到折叠面板

解决方案

1. 给Markdown文件添加分类标识

先确保content目录下的每篇Markdown文件,都在front matter里声明所属分类,比如:

---
title: "Vue组件优化技巧"
category: "A" # 对应A/B/C其中一个分类
---
正文内容...

2. 在asyncData中按分类分组文章

拿到所有文章后,用reduce把文章按分类归类,生成键为分类名、值为对应文章数组的对象,方便后续直接调用:

export default {
  async asyncData({ $content }) {
    // 获取所有文章数据
    const allArticles = await $content().fetch()
    
    // 按category字段分组
    const groupedArticles = allArticles.reduce((result, article) => {
      const cat = article.category
      if (!result[cat]) {
        result[cat] = []
      }
      result[cat].push(article)
      return result
    }, {})

    // 固定目标分类为A、B、C(如果需要动态获取所有存在的分类,改用Object.keys(groupedArticles))
    const targetCategories = ['A', 'B', 'C']

    return { groupedArticles, targetCategories }
  }
}

3. 折叠面板中渲染对应分类的文章

结合你已有的v-for折叠面板逻辑,在每个面板的插槽内遍历对应分类的文章即可:

<template>
  <div class="category-panels">
    <!-- 遍历A/B/C分类渲染折叠面板 -->
    <collapse-panel 
      v-for="category in targetCategories" 
      :key="category"
      :panel-title="`分类${category}`"
    >
      <!-- 插槽内容:当前分类下的文章列表 -->
      <div class="article-list">
        <div 
          v-for="article in groupedArticles[category] || []" 
          :key="article.slug"
          class="article-item"
        >
          <h4>{{ article.title }}</h4>
          <p class="article-excerpt">{{ article.excerpt || article.text.slice(0, 100) }}...</p>
        </div>
        <!-- 空状态提示 -->
        <p v-if="!groupedArticles[category] || groupedArticles[category].length === 0">
          该分类下暂无文章
        </p>
      </div>
    </collapse-panel>
  </div>
</template>

额外提示

  • 如果你的折叠面板组件有命名插槽(比如#content),记得把文章列表放到对应插槽位置;
  • 要是需要对分类内的文章排序,可以在分组时添加排序逻辑,比如按发布时间倒序:result[cat].sort((a, b) => new Date(b.date) - new Date(a.date))。

内容的提问来源于stack exchange,提问作者Aurore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 09:54:24