タグページを生成する
ここで学ぶことは…
- 複数のページを生成するためのページを作成する
- どのページルートをビルドするかを指定し、各ページに個別のプロパティを渡す
動的なページルーティング
getStaticPaths()
関数をエクスポートする.astro
ファイルを使用して、ページの集まりを動的に作成できます。
動的にページを作成する
-
src/pages/tags/[tag].astro
に新しいファイルを作成します。(まず新しいフォルダを作成する必要があります。)ファイル名([tag].astro
)に角括弧が含まれていることに注意してください。以下のコードをファイルに貼り付けます。getStaticPaths
関数はページのルートの配列を返します。各ルートに対応するページは、このファイルで定義されたものと同じテンプレートを使用します。 -
ブログ記事をカスタマイズしている場合は、個々のタグの値(たとえば「astro」、「成功」、「コミュニティ」など)を、記事で使用されているタグに置き換えます。
-
すべてのブログ記事が少なくとも1つのタグを含んでいることを確認します。
tags: ["ブログ"]
のように、配列として書く必要があります。 -
ブラウザのプレビューで
http://localhost:4321/tags/astro
にアクセスすると、[tag].astro
から動的に生成されたページが表示されるはずです。/tags/成功
、/tags/コミュニティ
、/tags/公開学習
など、その他の各カスタムタグについてページが作成されていることも確認してください。これらの新しいページを表示するには、まず開発サーバーを終了して再起動する必要があるかもしれません。
動的ルートでpropsを使用する
-
以下のpropsを
getStaticPaths()
関数に追加して、すべてのブログ記事のデータを各ページルートで利用できるようにします。配列内の各ルートに新しいpropsを定義し、そのpropsを関数の外側のコンポーネントテンプレートで利用できるようにしてください。
-
記事のリストを、ページのタグを含む記事のみへとフィルタリングします。
-
以上により、HTMLテンプレートを更新して、ページのタグを含むブログ記事のリストを表示できるようになりました。以下のコードを
[tag].astro
に追加します。 -
<BlogPost />
コンポーネントを使用するよう、さらにリファクタリングしてみましょう!([tag].astro
の先頭でこのコンポーネントをインポートするのを忘れないでください。) -
ブラウザのプレビューで各タグページを確認すると、特定のタグを含むブログ記事のリストが表示されるはずです。
パターンを分析する
以下の各項目について、コードがgetStaticPath()
関数の内側に書かれるか、それとも外側に書かれるか選択してください。
-
.md
ファイルに関する情報を受け取り、各ページルートに渡すためのAstro.glob()
の呼び出し。 -
getStaticPaths()
によって生成(返却、return)されるルートのリスト。 -
HTMLテンプレートで使用する、
props
とparams
を受け取るための値。
ページルートを構成するための情報が必要な場合は、getStaticPaths()
の内側に書きます。
ページルートのHTMLテンプレートで情報を受け取るには、getStaticPaths()
の外側に書きます。
高度なJavaScript: 既存のタグからページを生成する
これで、各タグページは[tag].astro
において静的に定義されました。ブログ記事に新しいタグを追加する場合は、このページを再度開きページルートを更新する必要があります。
以下では、このページのコードを、ブログページで使用されている各タグを取得してページを自動的に生成するコードへと置き換える例を示します。
難しく見えるかもしれませんが、この関数を完成させるための各ステップを自分で追ってみましょう!必要となるJavaScriptについての説明を今読みたくない場合は、完成版のコードまで進み、既存のコンテンツを置き換えてプロジェクトで直接使用しても構いません。
1. すべてのブログ記事にタグが含まれていることを確認する
既存のMarkdownページをそれぞれ再度開き、すべての記事のフロントマターにtags
配列が含まれていることを確認します。1つのタグしかない場合でも、tags: ["blogging"]
のように配列として書く必要があります。
2. すべての既存タグの配列を作成する
以下のコードを追加して、ブログ記事で使用されているすべてのタグのリストを取得します。
このコードに関する詳細を表示
こうしたコードを今まで自分で書いたことがなくても大丈夫です!
ここではまず1つずつMarkdownの投稿を処理し、タグの配列を1つの大きな配列へと結合しています。次に、(繰り返される値を無視するために)見つかったすべてのタグから新しいSet
を作成します。最後に、その集合(Set)を配列に変換します(この段階で重複はなくなっています)。これで、ページにタグのリストを表示するために使用するための配列ができました。
以上により、"astro"
、"成功"
、"コミュニティ"
、"ブログ"
、"後退"
、"公開学習"
という要素をもつ配列uniqueTags
ができました。
3. getStaticPaths
関数のreturn
値を置き換える
getStaticPaths
関数は、params
(各ページルートの名前)を含むオブジェクトのリストを常に返す必要があります。また、任意でprops
(各ページに渡したいデータ)を含めることもできます。先ほどまでは、ブログで使用されている各タグ名を自分で指定し、各ページにすべての記事データをprops
として渡していました。
ここでは、uniqueTags
配列を使用して各パラメータを定義し、このオブジェクトのリストを自動的に生成しています。
さらに、ブログ記事のリストは、各ページにprops
として渡される前にフィルタリングされるようになりました。記事のフィルタリングをおこなっていた以前のコードを削除し、filteredPosts
ではなくposts
を使用するようにHTMLテンプレートを更新してください。
最終的なコードのサンプル
ここまでの自分の作業内容を確認したい場合や、[tag].astro
にコピーするための完全で正しいコードが欲しい場合のために、現段階でのAstroコンポーネントを以下に示します。
これで、ブラウザのプレビューで任意のタグページを表示できるようになりました。
http://localhost:4321/tags/コミュニティ
に移動すると、コミュニティ
というタグが付いたブログ記事のリストが表示されるはずです。同様に、http://localhost:4321/tags/公開学習
では、公開学習
というタグが付いたブログ記事のリストが表示されます。
次のセクションでは、これらのページへのナビゲーションリンクを作成します。
確認テスト
説明文に合う用語を選択してください。
-
ページルートの配列を返す関数。
-
Astroで1つのファイルから複数のページルートを作成するためのプロセス。
-
動的に生成されるページルートの名前を定義する値。