文章

Astro 内容站:SummaryStatGrid 组件与归档总览卡

把归档页里重复的统计卡结构抽成 SummaryStatGrid,为总条目、文章数、章节数和最近更新时间提供统一的数值卡组件。

归档页里有一块内容特别适合单独拿出来:总览统计卡。

它的任务非常明确:

  • 显示一个 label
  • 显示一个值
  • 用统一的卡片视觉排成网格

这种结构如果继续内联在页面里,后面每次想复用时都得重新写一遍 dl + dt + dd + card styles。所以这次把它抽成了:

  • src/components/content/SummaryStatGrid.astro

输入很小,只服务“统计卡”这件事

这个组件没有试图做复杂的 dashboard,它只认一种输入:

type SummaryStatItem = {
  label: string;
  value: string | number;
};

页面只需要把展示文案整理成数组,再交给组件:

<SummaryStatGrid
  items={[
    { label: copy.archive.totalCountLabel, value: totalItemCount },
    { label: copy.archive.articleCountLabel, value: articleCount },
    { label: copy.archive.chapterCountLabel, value: chapterCount },
    { label: copy.archive.latestUpdateLabel, value: latestUpdate ? formatContentDate(latestUpdate) : "" },
  ]}
/>

这样归档页自己就不再关心 dl 结构和样式细节,只负责提供真正的数据。

为什么它不放进 ArchivePageView 里

因为它的职责其实并不属于“归档”。

它属于一种更通用的页面元素:

  • 一组概览数值
  • 每个数值都带一个小标签
  • 以卡片网格形式出现

今天它先服务归档页,明天也完全可以服务:

  • 关于页的站点统计
  • 系列页的章节/卷数概览
  • 首页的内容总览

把它提前抽出来,后面这些场景就不必重新长一套近似组件。

它帮页面文件减掉了低价值噪音

归档页真正重要的逻辑,其实是这些:

  • 处理分页状态
  • 处理语言切换页码
  • 渲染归档索引列表
  • 组织总览数据

dl 结构和四张卡的样式,对页面来说都只是噪音。

把这层挪进 SummaryStatGrid 之后,ArchivePageView.astro 更接近它应该扮演的角色:

  • 页面级装配
  • 数据整理
  • 组件组合

而不是同时兼任一份小型 UI 组件实现。

为什么这种小组件值得保留

很多重复代码不是大块重复,而是这种“看起来很小,复制起来很快”的结构。

但正因为它小,最容易被反复复制,最后散在多个页面里:

  • 文案层级稍有不同
  • 卡片 padding 稍有不同
  • 响应式列数稍有不同

SummaryStatGrid 的价值,就是尽早阻止这种漂移。

它不是一个复杂组件,却很适合当内容站里的“结构钉子”,把概览类卡片固定成同一种语言。

相关文章

Astro 内容站:PageHero 组件与页面头部统一

把列表页、首页、系列页和详情页里重复的标题区抽成 PageHero,让返回链接、eyebrow、标题和状态文案共用一套骨架。

2026-04-16

Astro 内容站:PageSectionHeader 组件与区块标题复用

把 section 标题、补充说明、右侧动作和分组计数统一到一个组件里,让首页、归档和索引列表共享稳定的区块头结构。

2026-04-16

Astro 内容站:组件组合重构、重复代码清理与文档同步

一次收口页面骨架、分页辅助、概览卡和旧文档漂移,把页面组合整理成更稳定的单组件文件结构。

2026-04-16

Astro 内容站:ArticleShell 组件、详情页元信息与章节前后导航

统一文章和系列章节的详情页外壳,让返回链接、摘要、元信息、相关文章与章节导航都在一处收束。

2026-04-14