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

如何在Gatsbyjs的allWpCategory中仅显示每个分类的首篇文章标题?

解决Gatsby中每个分类仅展示首篇文章标题的问题

你的代码问题出在遍历posts.nodes时的逻辑错误:post是数组中的单个文章对象,并非数组,所以post[0]无法获取到值;而直接遍历整个数组会输出所有文章标题。下面提供两种可行的解决方式:

方式一:前端直接提取首篇文章(无需修改查询)

直接从category.node.posts.nodes数组中取出第一个元素,不需要遍历整个数组,同时添加空值判断避免报错:

const { allWpCategory : data } = myCategoryQuery();
{data.edges.map(category => {
  // 获取当前分类下的第一篇文章
  const firstPost = category.node.posts.nodes[0];
  return (
    <div key={category.node.id}>
      {category.node.name}
      {/* 仅当存在文章时才渲染 */}
      {firstPost && <div key={firstPost.id}>{firstPost.title}</div>}
    </div>
  )
})}

方式二:在GraphQL查询时限制返回首篇文章(性能更优)

在查询阶段就给每个分类的posts字段添加limit:1,只拉取第一篇文章,减少不必要的数据传输:

修改查询钩子:

export const myCategoryQuery = () => {
  const data = useStaticQuery(graphql`
    query AllCategoryQuery {
      allWpCategory(limit: 10) {
        edges {
          node {
            id
            name
            posts(limit: 1) { # 添加limit限制只返回第一篇文章
              nodes {
                title
                uri
              }
            }
          }
        }
      }
    }
  `)
  return data;
}

前端渲染代码(同方式一):

const { allWpCategory : data } = myCategoryQuery();
{data.edges.map(category => {
  const firstPost = category.node.posts.nodes[0];
  return (
    <div key={category.node.id}>
      {category.node.name}
      {firstPost && <div key={firstPost.id}>{firstPost.title}</div>}
    </div>
  )
})}

两种方式中,方式二更推荐,因为它从数据源层面减少了数据量,提升页面加载性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:55:20