カテゴリーのコンテンツページを作成しよう【Nuxt.js×Contentful】
  • 2022.02.02に公開
  • ブログ構築TS
  • 7. コンテンツページ構築
  • No.2 / 8

今回達成すること

カテゴリーのコンテンツページ(pages/categories/_slug.vue)を作成します。

コンテンツページの要件

カテゴリーコンテンツページの要件は以下の3つです。

  1. タイトルや詳細などのカテゴリーデータの表示
  2. 存在しないパスが投げられた場合に404エラーを発生させる
  3. カテゴリーに関連づくブログ記事一覧を表示する

この記事では上記、1, 2を実装します。

paramsからカテゴリーを取得する

コンテンツページに投げられたparamsから、カテゴリーオブジェクトを取得します。

前回作成したcategories/_slug.vueasyncData()内で、Vuexの配列からカテゴリーを取得します。

pages/categories/_slug.vue
<template>
  <v-container>
    ...
    <!-- 追加 -->
    category: {{ category }}
  </v-container>
</template>

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

type AsyncData = {
  category: BlogCategory
}

@Component
export default class CategoriesSlugPage extends Vue {
  asyncData ({ app: { $accessor }, params }: Context): AsyncData {
    const category: BlogCategory | undefined =
      $accessor.categories.find((category: BlogCategory) =>
        category.fields.slug === params.slug
      )

    return {
      category
    }
  }
}
</script>
  • asyncData({ params }) ... asyncDataの引数にはリンクに含まれるパラメータ(params)を取得できる。
  • $accessor.categories.find() ... Vuexに保存したカテゴリー配列から、find()メソッドを使用してparams.slugと一致するカテゴリーを取得している。

カテゴリーが存在しない場合は404を返す

上記のままでは、存在しないパラメーターが投げられた場合に categoryundefinedを返します。

そこでcategoryが存在しない場合は404エラーを返すように編集します。

pages/categories/_slug.vue
<script lang="ts">
import { Context } from '@nuxt/types'
import { Component, Vue } from 'nuxt-property-decorator'
import { BlogCategory } from '~/store/types'

// void 追加
type AsyncData = void | {
  category: BlogCategory
}

@Component
export default class CategoriesSlugPage extends Vue {
  // ({ ..., error }) 追加
  asyncData ({ app: { $accessor }, params, error }: Context): AsyncData {
    const category: BlogCategory | undefined =
      $accessor.categories.find((category: BlogCategory) =>
        category.fields.slug === params.slug
      )

    // 追加
    if (!category) {
      return error({ 
        statusCode: 404, 
        message: 'This page could not be found' 
      })
    }

    return {
      category
    }
  }
}
</script>
  • type AsyncData = void | { category: BlogCategory } ... Nuxtのerror()メソッドはvoidを返すのでvoid型を追加している。
  • message: 'This page could not be found' ... Nuxtの404エラーメッセージと同じメッセージにしている。これは404エラーメッセージに日本語化を容易にする目的がある。

カテゴリーのコンテンツページにアクセスして、オブジェクトが表示できているか確認してください。

2022-01-16 22-25-30

存在しないパスにアクセスすると404エラーが返されることも確認します。

2022-01-16 22-28-28

パラメーターが存在しない場合は404を返す

リンクにパラメーターが存在しない時点で、カテゴリーが見つからないのは明白です。

そこで、Nuxtのvalidate()メソッドを使用して、params.slugが存在しない時点で404エラーを返すよう設定します。

Nuxtのvalidate()メソッドは、asyncData()に実行されるので一番上に追加します。

参考: Nuxt Lifecycle

@Component
export default class CategoriesSlugPage extends Vue {
  // 追加
  validate ({ params }: Context): boolean {
    return !!params.slug
  }
}
  • validate() ... メソッド内の式がtrueを返す場合にページを表示する。falseの場合は404エラーを返す。

これで、パラメーターが付かないパス /categories で404エラーが返されるようになりました。

最終的なカテゴリーコンテンツページのコード

最終的なコードは以下の通りです。

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

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

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

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

type AsyncData = void | {
  category: BlogCategory
}

@Component
export default class CategoriesSlugPage extends Vue {
  validate ({ params }: Context): boolean {
    return !!params.slug
  }

  asyncData ({ app: { $accessor }, params, error }: Context): AsyncData {
    const category: BlogCategory | undefined =
      $accessor.categories.find((category: BlogCategory) =>
        category.fields.slug === params.slug
      )

    if (!category) {
      return error({
        statusCode: 404,
        message: 'This page could not be found'
      })
    }

    return {
      category
    }
  }
}
</script>

今回の作業は以上です。コミットしておきましょう。

% git commit -am "Add process of get category content for categories/_slug.vue"

まとめと次回

今回はcategories/_slug.vueにカテゴリーのコンテンツを表示する実装を行いました。

次回は、このコンテンツページにカテゴリーに関連づく記事一覧を表示します。

あなたの力になれること
私自身が独学でプログラミングを勉強してきたので、一人で学び続ける苦しみは痛いほど分かります。そこで、当時の私がこんなのあったら良いのにな、と思っていたサービスを立ち上げました。周りに質問できる人がいない、答えの調べ方が分からない、ここを聞きたいだけなのにスクールは高額すぎる。そんな方に向けた単発・短期間メンターサービスを行っています。
独学プログラマのサービス
ブログ構築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制作のご依頼は下記メールアドレスまでお送りください。