タグインデックスページを作成する
各タグの個別ページができたので、それらへのリンクを作成しましょう。
ここで学ぶことは…
/pages/folder/index.astro
というルーティングパターンを使って新しいページを追加する- ユニークなタグのリストを表示し、各タグページにリンクする
- 新しいタグページへのナビゲーションリンクを追加してサイトを更新する
/pages/folder/index.astro
ルーティングパターンを使う
セクションタイトル: /pages/folder/index.astroルーティングパターンを使うウェブサイトにタグインデックスページを追加するには、src/pages/tags.astro
に新しいファイルを作成すればできます。
しかし、すでに/tags/
ディレクトリがあるので、Astroの別のルーティングパターンを利用して、タグに関連するファイルをすべてまとめてみましょう。
やってみよう - タグインデックスページを作る
セクションタイトル: やってみよう - タグインデックスページを作る-
src/pages/tags/
ディレクトリに新しいファイルindex.astro
を作成します。 -
http://localhost:4321/tags
に移動して、サイトにこのURLのページが含まれていることを確認します。中身は空ですが、ページは存在します。 -
src/pages/tags/index.astro
に、レイアウトを使用して最小限のページを作成します。これは以前にもやりましたね!手順を表示
-
src/pages/tags/
に新しいページコンポーネントを作成します。ファイル名を表示
index.astro -
<BaseLayout>
をインポートして使用します。コードを表示
src/pages/tags/index.astro ---import BaseLayout from '../../layouts/BaseLayout.astro';---<BaseLayout></BaseLayout> -
ページタイトルを定義し、コンポーネント属性としてレイアウトに渡します。
コードを表示
src/pages/tags/index.astro ---import BaseLayout from '../../layouts/BaseLayout.astro';const pageTitle = "タグインデックス";---<BaseLayout pageTitle={pageTitle}></BaseLayout>
-
-
ブラウザのプレビューを再度確認すると、フォーマットされたページが表示されるはずです。これでコンテンツを追加する準備ができました!
タグの配列を作成する
セクションタイトル: タグの配列を作成する以前もmap()
を使って、配列からリストの項目を表示していました。すべてのタグの配列を定義し、このページにリストとして表示するにはどうすればよいでしょうか?
コードを表示
---import BaseLayout from '../../layouts/BaseLayout.astro';const allPosts = await Astro.glob("../posts/*.md");const tags = [...new Set(allPosts.map((post) => post.frontmatter.tags).flat())];const pageTitle = "タグインデックス";---<BaseLayout pageTitle={pageTitle}> <ul> {tags.map((tag) => <li>{tag}</li>)} </ul></BaseLayout>
こうすることもできますが、将来ブログ記事で新しいタグを使用するたびに、このファイルに戻って配列を更新しなければいけません。
幸いなことに、1行のコードですべてのMarkdownファイルからデータを取得し、すべてのタグのリストを返す方法をあなたはもう知っているはずです。
-
src/pages/tags/index.astro
のフロントマタースクリプトに、すべての.md
ブログ記事ファイルのデータにページからアクセスできるようにするコードを追加します。コードを表示
src/pages/tags/index.astro ---import BaseLayout from '../../layouts/BaseLayout.astro';const allPosts = await Astro.glob('../posts/*.md');const pageTitle = "タグインデックス";--- -
次に、以下のJavaScriptをページコンポーネントに追加します。これは、ユニークなタグのリストを返すために
src/pages/tags/[tag].astro
で使用したものと同じです。src/pages/tags/index.astro ---import BaseLayout from '../../layouts/BaseLayout.astro';const allPosts = await Astro.glob('../posts/*.md');const tags = [...new Set(allPosts.map((post) => post.frontmatter.tags).flat())];const pageTitle = "タグインデックス";---
タグのリストを作成する
セクションタイトル: タグのリストを作成する今回は順序なしリストの項目を作成するのではなく、<div>
の中に各項目の<p>
を作成します。お馴染みのパターンですね!
-
コンポーネントテンプレートに次のコードを追加します。
src/pages/tags/index.astro <BaseLayout pageTitle={pageTitle}><div>{tags.map((tag) => <p>{tag}</p>)}</div></BaseLayout>ブラウザのプレビューで、タグがリスト表示されていることを確認します。
-
各タグをそれぞれのページにリンクさせるには、次の
<a>
リンクを各タグ名に追加します。src/pages/tags/index.astro <BaseLayout pageTitle={pageTitle}><div>{tags.map((tag) => (<p><a href={`/tags/${tag}`}>{tag}</a></p>))}</div></BaseLayout>
タグリストにスタイルを追加する
セクションタイトル: タグリストにスタイルを追加する-
<div>
と生成される各<p>
にスタイルを追加するために、次のCSSクラスを記述します。Astroではクラス名を追加するためにHTML構文を使用することに注意してください!src/pages/tags/index.astro <BaseLayout pageTitle={pageTitle}><div class="tags">{tags.map((tag) => (<p class="tag"><a href={`/tags/${tag}`}>{tag}</a></p>))}</div></BaseLayout> -
このページに次の
<style>
タグを追加して、新しいCSSクラスのスタイルを定義します。src/pages/tags/index.astro <style>a {color: #00539F;}.tags {display: flex;flex-wrap: wrap;}.tag {margin: 0.25em;border: dotted 1px #a1a1a1;border-radius: .5em;padding: .5em 1em;font-size: 1.15em;background-color: #F8FCFD;}</style> -
ブラウザのプレビューで
http://localhost:4321/tags
を開き、新しいスタイルが適用されていること、ページの各タグがそれぞれのタグページへのリンクとして機能していることを確認します。
コードの確認
セクションタイトル: コードの確認新しいページのコードは以下のようになっているはずです。
---import BaseLayout from '../../layouts/BaseLayout.astro';const allPosts = await Astro.glob('../posts/*.md');const tags = [...new Set(allPosts.map((post) => post.frontmatter.tags).flat())];const pageTitle = "Tag Index";---<BaseLayout pageTitle={pageTitle}> <div class="tags"> {tags.map((tag) => ( <p class="tag"><a href={`/tags/${tag}`}>{tag}</a></p> ))} </div></BaseLayout><style> a { color: #00539F; }
.tags { display: flex; flex-wrap: wrap; }
.tag { margin: 0.25em; border: dotted 1px #a1a1a1; border-radius: .5em; padding: .5em 1em; font-size: 1.15em; background-color: #F8FCFD; }</style>
このページをナビゲーションに追加する
セクションタイトル: このページをナビゲーションに追加する今の時点で、http://localhost:4321/tags
に移動してこのページを表示できます。そしてこのページから、個々のタグページへのリンクをクリックできます。
しかし、このページをウェブサイトの他のページから見つけられるようにする必要がまだあります。
-
Navigation.astro
コンポーネントに、この新しいタグインデックスページへのリンクを追加します。コードを表示
src/components/Navigation.astro <a href="/">ホーム</a><a href="/about/">概要</a><a href="/blog/">ブログ</a><a href="/tags/">タグ</a>
チャレンジ: ブログ記事レイアウトにタグを含める
セクションタイトル: チャレンジ: ブログ記事レイアウトにタグを含めるこれで、ブログの各記事にタグのリストを表示し、タグページにリンクするために必要なすべてのコードを書きましたが、これを再利用して既存のコードで使用してみましょう!
以下の手順に沿って作業を進め、出来上がった自分のコードを最終的なコードサンプルと比較して確認してください。
<div class="tags">...</div>
と<style>...</style>
をsrc/pages/tags/index.astro
からコピーしてMarkdownPostLayout.astro
内で再利用します。
---import BaseLayout from './BaseLayout.astro';const { frontmatter } = Astro.props;---<BaseLayout pageTitle={frontmatter.title}> <p><em>{frontmatter.description}</em></p> <p>{frontmatter.pubDate.slice(0,10)}</p>
<p>著者: {frontmatter.author}</p>
<img src={frontmatter.image.url} width="300" alt={frontmatter.image.alt} />
<div class="tags"> {tags.map((tag) => ( <p class="tag"><a href={`/tags/${tag}`}>{tag}</a></p> ))} </div>
<slot /></BaseLayout><style> a { color: #00539F; }
.tags { display: flex; flex-wrap: wrap; }
.tag { margin: 0.25em; border: dotted 1px #a1a1a1; border-radius: .5em; padding: .5em 1em; font-size: 1.15em; background-color: #F8FCFD; }</style>
このコードが機能するには、MarkdownPostLayout.astro
に貼り付けたコードを1箇所だけ編集する必要があります。どこを編集すればいいかわかりますか?
ヒントが欲しい
タイトルや著者など、他のpropsはレイアウトテンプレートでどのように書かれていますか?レイアウトは個々のブログ記事からどのようにpropsを受け取っているでしょうか?
もっとヒントが欲しい
.md
ブログ記事から受け取ったタグなどのprops(渡された値)をレイアウトで使用するには、ある単語を値の前に付ける必要があります。
コードを表示
<div class="tags"> {frontmatter.tags.map((tag) => ( <p class="tag"><a href={`/tags/${tag}`}>{tag}</a></p> ))} </div>
MarkdownPostLayoutのコードの確認
セクションタイトル: MarkdownPostLayoutのコードの確認ここまでの自分の作業内容を確認したい場合や、MarkdownPostLayout.astro
にコピーするための完全で正しいコードが欲しい場合のために、現段階でのAstroコンポーネントを以下に示します。
---import BaseLayout from './BaseLayout.astro';const { frontmatter } = Astro.props;---<BaseLayout pageTitle={frontmatter.title}> <p><em>{frontmatter.description}</em></p> <p>{frontmatter.pubDate.slice(0,10)}</p>
<p>著者: {frontmatter.author}</p>
<img src={frontmatter.image.url} width="300" alt={frontmatter.image.alt} />
<div class="tags"> {frontmatter.tags.map((tag) => ( <p class="tag"><a href={`/tags/${tag}`}>{tag}</a></p> ))} </div>
<slot /></BaseLayout><style> a { color: #00539F; }
.tags { display: flex; flex-wrap: wrap; }
.tag { margin: 0.25em; border: dotted 1px #a1a1a1; border-radius: .5em; padding: .5em 1em; font-size: 1.15em; background-color: #F8FCFD; }</style>
確認テスト
セクションタイトル: 確認テスト与えられたファイルパスと同じルートにページを作成する別のファイルパスを選択してください。
-
src/pages/categories.astro
-
src/pages/posts.astro
-
src/pages/products/shoes/index.astro