创建一个博客文章存档
现在你已经有几篇博客文章可以链接了,是时候配置博客页面来自动创建它们的列表了!
准备好……
- 使用
import.meta.glob()
一次性访问所有文章的数据 - 在你的博客页面上显示一个动态生成的文章列表
- 重构为每个列表项使用
<BlogPost />
组件
动态地展示文章列表
标题为“动态地展示文章列表”的部分-
将以下代码添加到
blog.astro
中,以返回有关所有 Markdown 文件的信息。import.meta.glob()
将返回一个对象数组,每个对象对应一篇博客文章。src/pages/blog.astro ---import BaseLayout from '../layouts/BaseLayout.astro'const allPosts = Object.values(import.meta.glob('./posts/*.md', { eager: true }));const pageTitle = "My Astro Learning Blog";---<BaseLayout pageTitle={pageTitle}><p>This is where I will post about my journey learning 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></ul></BaseLayout> -
要使用文章标题和 URL 动态生成整个文章列表,请用以下 Astro 代码替换你原来的
<li>
标签src/pages/blog.astro ---import BaseLayout from '../layouts/BaseLayout.astro'const allPosts = Object.values(import.meta.glob('./posts/*.md', { eager: true }));const pageTitle = "My Astro Learning Blog";---<BaseLayout pageTitle={pageTitle}><p>This is where I will post about my journey learning 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: any) => <li><a href={post.url}>{post.frontmatter.title}</a></li>)}</ul></BaseLayout>现在,你的整个博客文章列表是使用 Astro 内置的 TypeScript 支持,通过映射
import.meta.glob()
返回的数组动态生成的。 -
通过在
src/pages/posts/
中创建一个新的post-4.md
文件并添加一些 Markdown 内容来添加一篇新的博客文章。请确保至少包含下面用到的 frontmatter 属性。---layout: ../../layouts/MarkdownPostLayout.astrotitle: My Fourth Blog Postauthor: Astro Learnerdescription: "This post will show up on its own!"image:url: "https://docs.astro.js.cn/default-og-image.png"alt: "The word astro against an illustration of planets and stars."pubDate: 2022-08-08tags: ["astro", "successes"]---This post should show up with my other blog posts, because `import.meta.glob()` is returning a list of all my posts in order to create my list. -
在浏览器预览中重新访问你的博客页面
https://:4321/blog
,你会看到一个更新后的列表,其中包含四项,包括你的新博客文章!
挑战:创建 BlogPost 组件
标题为“挑战:创建 BlogPost 组件”的部分尝试自己对你的 Astro 项目进行所有必要的更改,以便你可以改用以下代码来生成你的博客文章列表
<ul> {allPosts.map((post: any) => <li><a href={post.url}>{post.frontmatter.title}</a></li>)} {allPosts.map((post: any) => <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 = Object.values(import.meta.glob('../pages/posts/*.md', { eager: true }));const pageTitle = "My Astro Learning Blog";--- -
自查:查看完成的组件代码。
显示代码
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 = Object.values(import.meta.glob('../pages/posts/*.md', { eager: true }));const pageTitle = "My Astro Learning Blog"---<BaseLayout pageTitle={pageTitle}><p>This is where I will post about my journey learning Astro.</p><ul>{allPosts.map((post: any) => <BlogPost url={post.url} title={post.frontmatter.title} />)}</ul></BaseLayout>
知识测验
标题为“知识测验”的部分如果你的 Astro 组件包含以下代码行
---const myPosts = Object.values(import.meta.glob('./posts/*.md', { eager: true }));---
选择可以表示以下内容的语法
-
你的第三篇博客文章的标题。
-
一个指向你第一篇博客文章 URL 的链接。
-
为每篇文章提供一个组件,显示其最后更新的日期。