创建文章存档页
既然你有一些要展示的博客文章了,是时候搭建博客页面,自动创建一个存档列表来展示它们吧!
准备好…
- 使用
Astro.glob()
一次性访问所有文章的数据 - 在博客页面上显示动态生成的文章列表
- 重构以使用
<BlogPost />
组件来显示每个列表项
动态展示文章列表
段落标题 动态展示文章列表-
将以下代码添加到
blog.astro
中,以返回关于所有 Markdown 文件的信息。Astro.glob()
将返回一个对象数组,每个博客文章对应一个对象。src/pages/blog.astro ---import BaseLayout from '../layouts/BaseLayout.astro'const allPosts = await Astro.glob('../pages/posts/*.md');const pageTitle = "我的 Astro 学习博客";---<BaseLayout pageTitle={pageTitle}><p>在这里,我将分享我的学习 Astro 的之旅。</p><ul><li><a href="/posts/post-1/">第一篇文章</a></li><li><a href="/posts/post-2/">第二篇文章</a></li><li><a href="/posts/post-3/">第三篇文章</a></li></ul></BaseLayout> -
为了动态生成整个文章列表,展示文章的标题和链接,将个别的
<li>
标签替换为以下 Astro 代码:src/pages/blog.astro ---import BaseLayout from '../layouts/BaseLayout.astro'const allPosts = await Astro.glob('../pages/posts/*.md');const pageTitle = "我的 Astro 学习博客";---<BaseLayout pageTitle={pageTitle}><p>在这里,我将分享我的学习 Astro 的之旅。</p><ul><li><a href="/posts/post-1/">Post 1</a></li><li><a href="/posts/post-2/">Post 2</a></li><li><a href="/posts/post-3/">Post 3</a></li>{allPosts.map((post) => <li><a href={post.url}>{post.frontmatter.title}</a></li>)}</ul></BaseLayout>通过对
Astro.glob()
返回的数组进行映射,你的整个博客文章列表现在是动态生成的。 -
通过在
src/pages/posts/
中创建一个新的post-4.md
文件并添加一些 Markdown 内容来添加一个新的博客文章。请确保至少包含下面使用的 frontmatter---layout: ../../layouts/MarkdownPostLayout.astrotitle: '我的第四篇博客文章'author: 'Astro 学习者'description: "这篇文章会自己出现在列表中!"image:url: "https://docs.astro.build/default-og-image.png"alt: "The word astro against an illustration of planets and stars."pubDate: 2022-08-08tags: ["astro", "successes"]---这篇文章应该会与其他的博客文章一起显示,因为 `Astro.glob()` 会返回一个包含所有文章的列表,以创建这个文章列表。 -
在浏览器预览中重新访问博客页面
http://localhost:4321/blog
,并查看更新后的包含四篇文章的列表,其中包括你的新博客文章!
挑战:创建 BlogPost 组件
段落标题 挑战:创建 BlogPost 组件尝试自己对 Astro 项目进行所有必要的更改,以便你可以使用以下代码来生成博客文章列表:
<ul> {allPosts.map((post) => <li><a href={post.url}>{post.frontmatter.title}</a></li>)} {allPosts.map((post) => <BlogPost url={post.url} title={post.frontmatter.title} />)}</ul>
展开以查看步骤
-
在
src/components/
中创建一个新的组件。显示文件名
BlogPost.astro -
编写组件中的代码行,以便它能够接收
title
和url
作为Astro.props
。显示代码
src/components/BlogPost.astro ---const { title, url } = Astro.props;--- -
添加用于创建博客文章列表中的每个项目的模板。
显示代码
src/components/BlogPost.astro <li><a href={url}>{title}</a></li> -
将新组件导入到博客页面中。
显示代码
src/pages/blog.astro ---import BaseLayout from '../layouts/BaseLayout.astro';import BlogPost from '../components/BlogPost.astro';const allPosts = await Astro.glob('../pages/posts/*.md');const pageTitle = "我的 Astro 学习博客";--- -
自己检查:查看已完成的组件代码。
显示代码
src/components/BlogPost.astro ---const { title, url } = Astro.props---<li><a href={url}>{title}</a></li>src/pages/blog.astro ---import BaseLayout from '../layouts/BaseLayout.astro';import BlogPost from '../components/BlogPost.astro';const allPosts = await Astro.glob('../pages/posts/*.md');const pageTitle = "我的 Astro 学习博客"---<BaseLayout pageTitle={pageTitle}><p>在这里,我将分享我的学习 Astro 的之旅。</p><ul>{allPosts.map((post) => <BlogPost url={post.url} title={post.frontmatter.title} />)}</ul></BaseLayout>
检验你的知识
段落标题 检验你的知识如果你的 Astro 组件包含以下代码行:
---const myPosts = await Astro.glob('../pages/posts/*.md');---
选出你可以用以下哪种语法来表示:
-
你的第三篇博客文章的标题。
-
指向你的第一篇博客文章的 URL 的链接。
-
每篇文章的上次更新的日期的组件。