【Nuxt.js × Contentful】ブログ記事に関連付くカテゴリーを表示する
  • 2019.10.11に公開
  • 2019.10.19に更新
  • ブログ構築
  • 6. カテゴリーページの構築
  • No.2 / 3
「ブログ構築」では、Nuxt.js v2.14未満が使用されています。 Nuxt.jsはv2.13~14で大きなバージョンアップがありました。それに伴い、書き方も大きく変化しています。 v2.14以上で書かれた「ブログ構築」の続編は、カテゴリー「 ブログ構築TS 」 で公開しています。

今回達成すること

今回は記事に関連付くカテゴリーを表示していきます。

トップページ には

  1. 各記事に関連付くカテゴリーを表示し、
  2. カテゴリーごとにチップの色を変更する

2019-10-11 14-05-12

記事ページには

  1. パンくずリストにカテゴリーのリンクを表示します

2019-10-11 14-06-54

Contentfulの関連付けの方法は前回の記事を参考にしてください。

【Contentful】カテゴリーモデルとブログ記事モデルの関連付け

記事に関連づいたカテゴリーはどこに存在するのか

まず先にContentfulから返されるJSONデータを確認しましょう。

この画像は、console.log で記事のオブジェクトを表示したものです。

2019-10-11 12-26-25

カテゴリーが存在する場所

post.fieldsに新たにcategoryと言うオブジェクトが作られていますね。

その中にカテゴリーの情報が入っています。

category.sysには、idフィールドが存在します。

このidフィールドは一意性(重複しない値)なので、カテゴリー検索に利用できます。

カテゴリーを表示する

結果、カテゴリーを表示するには以下のようになります。

post.fields.category.fields.name       // カテゴリー名
post.fields.category.fields.slug       // Path
post.fields.category.fields.sort       // 並び順
post.fields.category.fields.definition // カテゴリーの詳細

index.vueにカテゴリーを表示する

それではカテゴリーを表示しましょう。

まず、pages/index.vueの記事一覧にカテゴリー名を表示します。

pages/index.vue
<template>
	...
  <v-img
    :src="setEyeCatch(post).url"
    :alt="setEyeCatch(post).title"
    :aspect-ratio="16/9"
    max-height="200"
    class="white--text"
  >
    
   	<!-- 追記 -->
    <v-card-text>
      <v-chip
        small
        dark
        :color="categoryColor(post.fields.category)"
        to="#"
        class="font-weight-bold"
      >
        {{ post.fields.category.fields.name }}
      </v-chip>
    </v-card-text>
    <!-- 追記終了 -->
    
  </v-img>

  <!-- 追記 -->
  <v-card-title>
    <nuxt-link
      :to="linkTo('posts', post)"
    >
      {{ post.fields.title }}
    </nuxt-link>
  </v-card-title>
  <!-- 追記終了 -->

 ...
</template>

<script>
export default {

  computed: {
    
		// 追記
    categoryColor() {
      return (category) => {
        switch (category.fields.name) {
          case 'RubyOnRails': return '#C73A31'
          case 'Nuxt.js': return '#236244'
          case 'コラム': return 'primary'
          default: return 'grey darken-3'
        }
      }
    }
    // 追記終了
  }
}
</script>

  • :color="categoryColor(post.fields.category)"

    Vuetifyのchipコンポーネントに渡す色に算出プロパティを渡しています。

    このcategoryColorは引数の カテゴリー名によって、返す色が変化します。

  • 記事のタイトル

    記事タイトルは、画像の下に表示するようにしました。

    同時にnuxt-linkタグで囲み、記事ページに飛べるのリンクをつけました。

  • categoryColor()

    返す色は、Vuetifyのカラー名、もしくはcssのカラーコードを設定することが出来ます。

    お好きな色を設定してください。

    Vuetify Color

index.vueを確認してみる

Nuxt.jsを起動して"http://localhost:3000/"にアクセスしてみてください。

このように表示されれば成功です。

2019-10-11 14-05-12

posts/_slug.vueにカテゴリーを表示する

続いて、記事ページも表示しましょう。

今回は、Vuetifyのv-breadcrumbsコンポーネントを使って、パンくずリスト風に表示します。

pages/posts/_slug.vue
<template>
  <v-container fluid>
    <template v-if="currentPost">
      
      <!-- 追記 -->
      <v-breadcrumbs :items="breadcrumbs">
        <template #divider>
          <v-icon>mdi-chevron-right</v-icon>
        </template>
      </v-breadcrumbs>
      <!-- 追記終了 -->
      
</template>

<script>

export default {

  computed: {
		
    // 追記
    breadcrumbs() {
      const category = this.currentPost.fields.category
      return [
        { text: 'ホーム', to: '/' },
        { text: category.fields.name, to: '#' }
      ]
    }
    // 追記終了
  }
}
</script>

  • パンくずリストの区切り文字

    今回はicon mdi-chevron-right を渡していますが、これは自由に変更することが出来ます。

    例えば「/」にする場合は、dividerに文字列を渡します。

パンくずリストの区切り文字を「/」にする場合
<v-breadcrumbs :items="items" divider="/"></v-breadcrumbs>
  • breadcrumbs()

    各ナビのオブジェクトが格納された配列を返します。

    このオブジェクトには、他のプロパティも渡せます。↓

    Breadcrumbs - Vuetify

記事ページの確認

タイトル上にこのように表示されたら成功です。

2019-10-11 14-06-54

まだリンクは機能していませんが、次回、カテゴリーページを作成した後に飛べるように設定します。

変更をコミットしとく

ここまでの変更をコミットして、本番環境でも確認しましょう。

$ git commit -am "show_category_name"
$ git push

まとめ

今回は、記事に関連付くカテゴリーを表示していきました。

無事表示できましたか?

エラーが発生して身動きが取れないようであればTwitterからご連絡ください。

これでやっとブログサイトっぽくなってきましたね。

次回は?

さて次回は、 カテゴリーページを作成して、そのカテゴリーの記事一覧を表示します。

そして、今回表示したカテゴリー名にもリンクをつけていきましょう。

それではまた。

あなたの力になれること
私自身が独学でプログラミングを勉強してきたので、一人で学び続ける苦しみは痛いほど分かります。そこで、当時の私がこんなのあったら良いのにな、と思っていたサービスを立ち上げました。周りに質問できる人がいない、答えの調べ方が分からない、ここを聞きたいだけなのにスクールは高額すぎる。そんな方に向けた単発・短期間メンターサービスを行っています。
独学プログラマのサービス
ブログ構築の投稿
1
  • 更新情報
  • /
  • #01
ブログ構築カテゴリーの記事修正、更新情報【2020/05/19追記: このカテゴリーの更新を一旦終了といたします】
2
  • 更新情報
  • /
  • #02
Nuxt.js v2.13.0新機能メモの公開とv2.12.2にダウングレードする方法
1
  • 今回作るアプリケーション
  • /
  • #01
Nuxt.jsとContentfulで作るマイブログ
1
  • 開発環境にNuxt.jsを立ち上げる
  • /
  • #01
Nuxt.jsを動かす環境を構築する
2
  • 開発環境にNuxt.jsを立ち上げる
  • /
  • #02
Nuxt.jsのプロジェクトを作成する
3
  • 開発環境にNuxt.jsを立ち上げる
  • /
  • #03
Hello Nuxtを表示する
1
  • Nuxt.jsアプリを公開する
  • /
  • #01
Nuxt.jsをデプロイする前の事前準備を行う
2
  • Nuxt.jsアプリを公開する
  • /
  • #02
Netlifyの初期セットアップとNuxt.jsのデプロイを行う
3
  • Nuxt.jsアプリを公開する
  • /
  • #03
NetlifyにデプロイしたNuxt.jsに独自ドメインを設定する
1
  • Contentfulのセットアップ
  • /
  • #01
【Nuxt.js Universal】Vuetify2.0にバージョンアップしよう
2
  • Contentfulのセットアップ
  • /
  • #02
【画像で説明】Contentfulの使い方。初期設定と各メニューについて学ぶ
3
  • Contentfulのセットアップ
  • /
  • #03
Contentfulにブログ記事モデルを作成していこう
4
  • Contentfulのセットアップ
  • /
  • #04
ContentfulからAPIを取得してNuxt.jsで記事一覧を表示する
1
  • ブログ記事周りの構築
  • /
  • #01
Nuxt.jsにContentfulのブログ記事を表示する
2
  • ブログ記事周りの構築
  • /
  • #02
Contentfulから取得した下書き記事を開発環境に表示する
3
  • ブログ記事周りの構築
  • /
  • #03
Nuxt.jsのgenerateプロパティに動的なルーティングを追加する
4
  • ブログ記事周りの構築
  • /
  • #04
【Nuxt.js】middlewareを活用しブログ記事取得のパフォーマンスを改善する
1
  • カテゴリーページの構築
  • /
  • #01
【Contentful】カテゴリーモデルとブログ記事モデルの関連付け
2
  • カテゴリーページの構築
  • /
  • #02
【Nuxt.js × Contentful】ブログ記事に関連付くカテゴリーを表示する
3
  • カテゴリーページの構築
  • /
  • #03
【Nuxt.js × Contentful】カテゴリー記事一覧ページを作成する
1
  • タグ機能の構築
  • /
  • #01
Contentfulにタグモデルを作成し関連付けを行う
2
  • タグ機能の構築
  • /
  • #02
【Nuxt.js × Contentful】タグに関連付いたブログ記事を表示する
3
  • タグ機能の構築
  • /
  • #03
Contentfulのincludesを使って関連モデルを取得しタグ一覧ページを作成する
4
  • タグ機能の構築
  • /
  • #04
Vuetify2のdata-tableの使い方を学んで、タグ一覧ページをレイアウト
1
  • Nuxt.jsブログカスタマイズ
  • /
  • #01
Twitterシェアボタン、フォローボタンの作り方【Nuxt.js Universalモード編】
2
  • Nuxt.jsブログカスタマイズ
  • /
  • #02
Contentfulの全文検索を使ったNuxt.jsブログ内検索の実装
独学プログラマ
独学でも、ここまでできるってよ。
CONTACT
Nuxt.js制作のご依頼は下記メールアドレスまでお送りください。