Pular para o conteúdo

Crie um arquivo de postagens do blog

Agora que você tem algumas postagens do blog que podem ser acessadas por links, é hora de configurar a página Blog para criar uma lista de postagens automaticamente!

Se prepare para...

  • Acessar dados de todas as suas postagens de uma vez usando Astro.glob()
  • Mostrar uma lista de postagens gerada dinamicamente na sua página Blog
  • Refatorar para utilizar um componente <BlogPost /> para cada item da lista

Dinamicamente mostre uma lista de postagens

Seção intitulada Dinamicamente mostre uma lista de postagens
  1. Adicione o seguinte código em blog.astro para retornar informação sobre todos os seus arquivos Markdown. Astro.glob() retornará um array de objetos, um para cada postagem do blog.

    src/pages/blog.astro
    ---
    import BaseLayout from '../layouts/BaseLayout.astro'
    const allPosts = await Astro.glob('./posts/*.md');
    const pageTitle = "Meu Blog de Aprendizagem Astro";
    ---
    <BaseLayout pageTitle={pageTitle}>
    <p>Aqui é onde postarei sobre minha jornada aprendendo Astro.</p>
    <ul>
    <li><a href="/posts/post-1/">Postagem 1</a></li>
    <li><a href="/posts/post-2/">Postagem 2</a></li>
    <li><a href="/posts/post-3/">Postagem 3</a></li>
    </ul>
    </BaseLayout>
  2. Para gerar a lista inteira de postagens dinamicamente, utilizando os títulos das postagens e URLs, substitua suas tags <li> individuais com o seguinte código Astro:

    src/pages/blog.astro
    ---
    import BaseLayout from '../layouts/BaseLayout.astro'
    const allPosts = await Astro.glob('./posts/*.md');
    const pageTitle = "Meu Blog de Aprendizagem Astro";
    ---
    <BaseLayout pageTitle={pageTitle}>
    <p>Aqui é onde postarei sobre minha jornada aprendendo Astro.</p>
    <ul>
    <li><a href="/posts/post-1/">Postagem 1</a></li>
    <li><a href="/posts/post-2/">Postagem 2</a></li>
    <li><a href="/posts/post-3/">Postagem 3</a></li>
    {allPosts.map((post) => <li><a href={post.url}>{post.frontmatter.title}</a></li>)}
    </ul>
    </BaseLayout>

    Sua lista inteira de postagens do blog agora está sendo gerada dinamicamente, por mapear o array retornado por Astro.glob().

  3. Adicione uma nova postagem do blog criando um novo arquivo post-4.md em src/pages/posts/ e adicionando algum conteúdo Markdown. Certifique-se de adicionar as propriedades de frontmatter usadas abaixo.

    ---
    layout: ../../layouts/MarkdownPostLayout.astro
    title: Minha Quarta Postagem no Blog
    author: Aluno Astro
    description: "Esta postagem irá aparecer por si mesma!"
    image:
    url: "https://docs.astro.build/default-og-image.png"
    alt: "A palavra astro acima de uma ilustração de planetas e estrelas."
    pubDate: 2022-08-08
    tags: ["astro", "sucessos"]
    ---
    Esta postagem deve aparecer junto das minhas outras postagens do blog, pois `Astro.glob()` está retornando uma lista de todas as minhas postagens para criar minha lista.
  4. Revisite a página do seu blog na pré-visualização do seu navegador em http://localhost:4321/blog e procure por uma lista atualizada com quatro itens, incluindo sua nova postagem no blog!

Tente por si só fazer todas as mudanças necessárias em seu projeto Astro para que você posssa usar o seguinte código para gerar sua lista de postagens do blog:

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>
Expanda para ver as etapas
  1. Crie um novo componente em src/components/.

    Mostre o nome do arquivo
    BlogPost.astro
  2. Escreva a linha de código no seu componente para que ele seja capaz de receber um title e url como Astro.props.

    Mostre o código
    src/components/BlogPost.astro
    ---
    const { title, url } = Astro.props;
    ---
  3. Adicione o template utilizado para criar cada item na sua lista de postagens do blog.

    Mostre o código
    src/components/BlogPost.astro
    <li><a href={url}>{title}</a></li>
  4. Importe o novo componente em sua página Blog.

    Mostre o código
    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 = "Meu Blog de Aprendizagem Astro";
    ---
  5. Verifique você mesmo: veja o código completo do componente.

    Mostre o código
    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 = "Meu Blog de Aprendizagem Astro"
    ---
    <BaseLayout pageTitle={pageTitle}>
    <p>Aqui é onde postarei sobre minha jornada aprendendo Astro.</p>
    <ul>
    {allPosts.map((post) => <BlogPost url={post.url} title={post.frontmatter.title} />)}
    </ul>
    </BaseLayout>

Se o seu componente Astro contém a seguinte linha de código:

---
const minhasPostagens = await Astro.glob('./posts/*.md');
---

Escolha a sintaxe que você pode escrever para representar:

  1. O título da sua terceira postagem do blog.

  2. Um link para a URL da sua primeira postagem do blog.

  3. Um componente para cada postagem, mostrando a data que ele foi atualizado pela última vez.

Contribua

O que passa em sua cabeça?

Comunidade