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