返回介绍

创建文章存档页

发布于 2024-06-05 21:19:57 字数 8125 浏览 0 评论 0 收藏 0

现在你有一些要展示的博客文章了,是时候配置博客页面来自动创建一个存档列表了!

准备好…

  • 使用 Astro.glob() 一次性访问所有文章的数据
  • 在博客页面上显示动态生成的文章列表
  • 重构以使用 <BlogPost /> 组件来显示每个列表项

动态展示文章列表

  1. 将以下代码添加到 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>
  2. 为了动态生成整个文章列表,展示文章的标题和链接,将个别的 <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() 返回的数组进行映射,你的整个博客文章列表现在是动态生成的。

  3. 通过在 src/pages/posts/ 中创建一个新的 post-4.md 文件并添加一些 Markdown 内容来添加一个新的博客文章。请确保至少包含下面使用的 frontmatter

    ---
    layout: ../../layouts/MarkdownPostLayout.astro
    title: '我的第四篇博客文章'
    author: 'Astro 学习者'
    description: "这篇文章会自己出现在列表中!"
    image:
      url: "https://www.wenjiangs.com/wp-content/uploads/2024/astro/default-og-image.png"
      alt: "The word astro against an illustration of planets and stars."
    pubDate: 2022-08-08
    tags: ["astro", "successes"]
    ---
    这篇文章应该会与其他的博客文章一起显示,因为 `Astro.glob()` 会返回一个包含所有文章的列表,以创建这个文章列表。
  4. 在浏览器预览中重新访问博客页面 http://localhost:4321/blog,并查看更新后的包含四篇文章的列表,其中包括你的新博客文章!

挑战:创建 BlogPost 组件

尝试自己对 Astro 项目进行所有必要的更改,以便你可以使用以下代码来生成博客文章列表:

src/pages/blog.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>
展开以查看步骤
  1. src/components/ 中创建一个新的组件。

    显示文件名
    BlogPost.astro
  2. 编写组件中的代码行,以便它能够接收 titleurl 作为 Astro.props

    显示代码src/components/BlogPost.astro
    ---
    const { title, url } = Astro.props;
    ---
  3. 添加用于创建博客文章列表中的每个项目的模板。

    显示代码src/components/BlogPost.astro
    <li><a href={url}>{title}</a></li>
  4. 将新组件导入到博客页面中。

    显示代码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 学习博客";
    ---
  5. 自己检查:查看已完成的组件代码。

    显示代码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');
---

选出你可以用以下哪种语法来表示:

  1. 你的第三篇博客文章的标题。

  2. 指向你的第一篇博客文章的 URL 的链接。

  3. 每篇文章的上次更新的日期的组件。

任务清单

相关资源

Tutorials

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文