ブログアプリのページ設計とNuxt.jsの動的ルーティングについて理解しよう
  • 2022.01.16に公開
  • ブログ構築TS
  • 7. コンテンツページ構築
  • No.1 / 8

今回達成すること

カテゴリーのコンテンツページを作成し、Nuxtの動的ルーティングについて理解します。

新しいブランチを切っておきましょう。

% git checkout -b 20220113_add_content_pages

ブログアプリのページ設計

今回作成するブログで構築するページは以下の通りです。

  1. カテゴリー個別ページ

    • カテゴリーに関連づくブログ記事一覧を表示

    • パス /categories/<category.fields.slug>

    • Vue pages/categories/_slug.vue

  2. ブログ記事個別ページ

    • ブログ記事表示

    • パス /posts/<category.fields.slug>/<post.fields.slug>

    • Vue pages/posts/_category/_slug.vue

  3. タグ一覧ページ

    • 全てのタグ表示
    • パス /tags
    • Vue pages/tags/index.vue
  4. タグ個別ページ

    • タグに関連づくブログ記事一覧を表示
    • パス /tags/<tag.fields.slug>
    • Vue pages/tags/_slug.vue
  5. 検索結果表示ページ

    • 検索結果のブログ記事一覧を表示
    • パス /search
    • Vue pages/search.vue
  6. プライバシーポリシー

    • サイトポリシー
    • パス /privacy
    • Vue pages/privacy.vue

Nuxtの動的ルーティング生成

Nuxtの動的なルーティングの値は、_から始まるVueファイルで表示します。

ファイルパス 生成されるルート
categories/_slug.vue /categories/<動的な値>
posts/_category/ _slug.vue /posts/<動的な値>/<動的な値>
user/_id/account.vue /user/<動的な値>/account

ここのファイル名は何でも良いですが、ルートのパラメーター名と一致する必要があります。

ルートのパラメーター名とは、下記でいうslugです。

{ name: 'categories-slug', params: { slug: category.fields.slug } }

動的ルーティングの挙動を確認する

カテゴリーのコンテンツページを作成して挙動を確認してみましょう。

pagesディレクトリにcategories/_slug.vueを作成します。

% mkdir pages/categories && touch $_/_slug.vue

# 確認
% tree pages
pages
├── categories
│   └── _slug.vue
└── index.vue

作成した_slug.vueを仮編集します。

pages/categories/_slug.vue
<template>
  <v-container>
    <nuxt-link
      to="/"
    >
      Home
    </nuxt-link>

    <div>
      categories/_slug.vue
    </div>

    params: {{ params }}
  </v-container>
</template>

<script lang="ts">
import { Context } from '@nuxt/types'
import { Component, Vue } from 'nuxt-property-decorator'

@Component
export default class CategoriesSlugPage extends Vue {
  asyncData ({ params }: Context): any {
    return {
      params
    }
  }
}
</script>

index.vueの今現在のカテゴリーページへのリンクはこのようになっています。

pages/index.vue
<v-card
  max-width="300"
  class="mx-auto"
  :to="`/categories/${category.fields.slug}`"
>
</v-card>

上記リンクは以下と同等です。

:to="{ name: 'categories-slug', params: { slug: category.fields.slug } }"

それぞれのリンクの書き方で、カテゴリーコンテンツページにアクセスすると動的なルーティングが生成され、パラメーターslugも取得できています。

2022-01-16 17-25-35

paramsのキーを書き換えると動的ルートは生成されない

試しにparamsのキーをtestに書き換えて、カテゴリーのコンテンツページにアクセスしてみます。

:to="{ name: 'categories-slug', params: { test: category.fields.slug } }"

そうするとパラメーターは取得できるものの、動的なルーティングは生成されません。

2022-01-16 17-36-22

このように、Nuxtで動的なルーティングを生成する場合は、paramsのキーとVueファイル名を一致させる必要があります。

  • { params: { slug: '' } }の場合、Vueファイルは_slug.vueとする。

文字列で動的ルートを指定する場合

ちなみに、ルートを文字列で指定する場合は、Vueファイル名がparamsのキーとなります。

<!-- ルートを文字列で指定する場合 -->
:to="`/categories/${category.fields.slug}`"

categories/_test.vueのページファイルを作成した場合。

pagesディレクトリ
pages
├── categories
   └── _test.vue

paramsのキーは、自動でtestキーが生成されます。

2022-01-16 17-45-11

ルートをオブジェクトに書き換える

今回のブログでは、動的ルートをオブジェクトで宣言します。

これは人の好みですが、オブジェクトでパラメーター渡すことによって、今どのパラメーターを渡しているかが明確になるためです。

index.vueのカテゴリーリンクは、すべてオブジェクトに書き換えてください。

pages/index.vue
<v-card
  max-width="300"
  class="mx-auto"
  :to="{ name: 'categories-slug', params: { slug: category.fields.slug } }"
>
</v-card>

...
<v-list-item-subtitle>
  <nuxt-link
    :to="{ name: 'categories-slug', params: { slug: post.fields.category.fields.slug } }"
  >
    {{ post.fields.category.fields.title }}
  </nuxt-link>
</v-list-item-subtitle>

今回の作業は以上です。

% git add -A
% git commit -m "Add categories/_slug.vue"

次回は?

カテゴリーのコンテンツページに、paramsから取得したカテゴリーを表示し、カテゴリーに関連づく記事一覧を表示する設定を行います。

あなたの力になれること
私自身が独学でプログラミングを勉強してきたので、一人で学び続ける苦しみは痛いほど分かります。そこで、当時の私がこんなのあったら良いのにな、と思っていたサービスを立ち上げました。周りに質問できる人がいない、答えの調べ方が分からない、ここを聞きたいだけなのにスクールは高額すぎる。そんな方に向けた単発・短期間メンターサービスを行っています。
独学プログラマのサービス
ブログ構築TSの投稿
1
  • Nuxt.js×TypeScript開発環境構築
  • /
  • #01
Nuxt.jsをローカルPCに立ち上げよう
2
  • Nuxt.js×TypeScript開発環境構築
  • /
  • #02
Nuxt.jsプロジェクトをGitHubにPushしよう
3
  • Nuxt.js×TypeScript開発環境構築
  • /
  • #03
nuxt-property-decoratorのインストールとTypeScriptのセットアップ
1
  • Vuetifyセットアップ
  • /
  • #01
TypeScript環境のNuxt.jsにVuetifyを導入しよう
2
  • Vuetifyセットアップ
  • /
  • #02
VuetifyにカスタムCSSを追加してSASS変数を理解しよう
3
  • Vuetifyセットアップ
  • /
  • #03
VuetifyにカスタムSVGアイコンを追加しよう
1
  • NetlifyCLIを使ったNuxtデプロイ
  • /
  • #01
Netlify CLIをインストールして本番環境のサイトを作成しよう
2
  • NetlifyCLIを使ったNuxtデプロイ
  • /
  • #02
netlify.tomlを使ってNuxt.jsをNetlifyに手動デプロイしよう
1
  • Contentfulモデル構築
  • /
  • #01
Contentfulの料金とCommunityプランの無料枠を理解する
2
  • Contentfulモデル構築
  • /
  • #02
Contentfulへ新規会員登録、ロケールの変更、API Keyの発行を行う
3
  • Contentfulモデル構築
  • /
  • #03
Contentful ブログカテゴリーモデルを作成しよう
4
  • Contentfulモデル構築
  • /
  • #04
Contentful カテゴリーモデルに1対1で関連づくblogPostモデルを作成しよう
5
  • Contentfulモデル構築
  • /
  • #05
Contentful ブログ記事に1対多で関連づくplogTagモデルを作成しよう
6
  • Contentfulモデル構築
  • /
  • #06
Contentful カテゴリー・ブログ記事・タグコンテンツを作成しよう
1
  • Nuxt.js×Contentfulセットアップ
  • /
  • #01
Nuxt.js×Contentfulセットアップ。モジュールのインストールからAPI Keyの登録まで
2
  • Nuxt.js×Contentfulセットアップ
  • /
  • #02
Contentful APIリクエストの実行 Nuxt.jsにブログコンテンツを表示しよう
3
  • Nuxt.js×Contentfulセットアップ
  • /
  • #03
ContentfulAPIをNetlifyにデプロイしよう【Nuxt FullStaticのasyncDataとfetch】
1
  • Vuex×TypeScriptセットアップ
  • /
  • #01
Vuexの型付け vuex-module-decoratorsとnuxt-typed-vuexどちらを使用するか
2
  • Vuex×TypeScriptセットアップ
  • /
  • #02
nuxt-typed-vuexのインストールとセットアップ。Vuexの型定義と呼び出し方
3
  • Vuex×TypeScriptセットアップ
  • /
  • #03
VuexにContentfulの型定義ファイルとnuxtServerInitを追加しよう
4
  • Vuex×TypeScriptセットアップ
  • /
  • #04
VuexにContentfulAPIレスポンスを保存してVueファイルに表示しよう
1
  • コンテンツページ構築
  • /
  • #01
ブログアプリのページ設計とNuxt.jsの動的ルーティングについて理解しよう
2
  • コンテンツページ構築
  • /
  • #02
カテゴリーのコンテンツページを作成しよう【Nuxt.js×Contentful】
3
  • コンテンツページ構築
  • /
  • #03
カテゴリーに関連付くブログ記事一覧を表示しよう【Nuxt.js×Contentful】
4
  • コンテンツページ構築
  • /
  • #04
injectを使用して共通エラー処理メソッドを作成しよう【Nuxt×TypeScript】
5
  • コンテンツページ構築
  • /
  • #05
NuxtChildを使用してブログ記事ページを作成しよう【Nuxt.js×TypeScript】
6
  • コンテンツページ構築
  • /
  • #06
タグ一覧ページとタグ関連づく記事一覧を表示しよう【Nuxt.js×TypeScript】
7
  • コンテンツページ構築
  • /
  • #07
プライバシーポリシーページを作成しよう【Nuxt.js×TypeScript】
8
  • コンテンツページ構築
  • /
  • #08
@nuxtjs/i18nのインストールとセットアップ。ページタイトルの翻訳化【TypeScript】
1
  • NetlifyFunctionsを使った検索機能
  • /
  • #01
Netlify Functionsを使ってクエリを返す関数を作成しよう【Nuxt.js×TypeScript】
2
  • NetlifyFunctionsを使った検索機能
  • /
  • #02
Netlify Functionsプロジェクトをデプロイしよう【Nuxt.js×TypeScript】
3
  • NetlifyFunctionsを使った検索機能
  • /
  • #03
Nuxt.js × axiosセットアップ Netlify Functionsにリクエストを行う準備をしよう
4
  • NetlifyFunctionsを使った検索機能
  • /
  • #04
オリジン•CORS•プリフライトリクエストを理解する【Nuxt.js×Netlify Functions】
5
  • NetlifyFunctionsを使った検索機能
  • /
  • #05
Netlify Functionsを使ってフォームバリデーション機能を構築しよう【Nuxt.js】
6
  • NetlifyFunctionsを使った検索機能
  • /
  • #06
ツールバーに表示する検索フォームを作成しよう【Nuxt.js×TypeScript】
7
  • NetlifyFunctionsを使った検索機能
  • /
  • #07
検索ページを作成しよう【Vue propsとTypeScriptの書き方 解説】
8
  • NetlifyFunctionsを使った検索機能
  • /
  • #08
Netlify FunctionsからContentfulAPIリクエストを送ろう【Nuxt.js】
9
  • NetlifyFunctionsを使った検索機能
  • /
  • #09
検索ページに「もっと見る」ボタンを実装しよう【Nuxt.js×TypeScript】
1
  • ブログMarkdown対応
  • /
  • #01
@nuxtjs/markdownitのインストールとセットアップ【Nuxt.js×TypeScript】
2
  • ブログMarkdown対応
  • /
  • #02
Nuxt.js×markdown-it 外部リンクを別タブで開くプラグインを追加しよう
3
  • ブログMarkdown対応
  • /
  • #03
Nuxt.js×markdown-it 内部リンクをVueRouterで高速にページ遷移しよう
4
  • ブログMarkdown対応
  • /
  • #04
Nuxt.js×markdown-it アンカーリンクとブログ目次を自動生成しよう
独学プログラマ
独学でも、ここまでできるってよ。
CONTACT
Nuxt.js制作のご依頼は下記メールアドレスまでお送りください。