こんにちは。
最近、nuxtでの開発にハマっているマークアップエンジニアのkiyoseです。
独学でvue.jsを一ヶ月ほどみっちり勉強したのち、業務でnuxtを使い初めて4ヶ月目になります。
今回は、別々のコンポーネントを作成し、そこに同じ配列を渡してデータを一括管理してみます。
やりたいこと
ヘッダーメニュー、フッターメニュー、ハンバーガーメニュー。。。
表示文字・リンク先 は、だいたい一緒なことが多いので、
①一つの配列にまとめちゃって 、
それぞれのコンポーネントに ②これをimportして 、メニューを生成してみます。
こんな感じ↓

こうすることで、メニューのリンク先変更やテキスト修正が入っても、一箇所修正するだけでOKなので、
変更忘れを防ぐことができますね♪
コンポーネント作成
例として、コーポレートサイトによくある こんなハンバーガーメニューを作ってみます。

↑第二階層と、第三階層がある 第二階層。
両方ありますが、
ポイントは、 すべて一つのコンポーネントとして捉える ことです。
左のように、AとB、別々のコンポーネントが混在している、と考えずに
右のように、 違いは第三階層の有無だけ で、全て同じコンポーネントとして考えます。

では、ソースを見ていきましょう。
1、まずメニューデータ配列.jsをインポートします。
<script>
 import menuDataArray from '~/data/menuData.js'
</script>
2、データオブジェクトで、 importした配列を値に設定します。
<script>
export default {
 data() {
     return {
       menuData: menuDataArray
     }
  }
}
</script>
※データオブジェクトとして定義するプロパティは、
関数の戻り値でオブジェクトとして出す必要がある ので、記法に注意です。
data: {   
   menuData: menuDataArray
 }
としちゃうとエラーになっちゃいますよ。
3、いよいよv-forを使って、
配列から要素を順に取り出して リストレンダリングしていきます!
まず、第二回層からいきます。
<template>
  <!-- 第二階層リスト -->
  <ul>
    <li v-for="(menuDataItem, index) in menuData" :key="index">
      <nuxt-link :to="menuDataItem.link">
        {{ menuDataItem.text }}
      </nuxt-link>
    </li>
  </ul>
</template>
ぐるぐる回して、menuData.js内のlinkとtextを出力します。
4、第三階層を作っていきましょう。
先述したとおり、第三階層の有無  の違いがあるだけで、すべて同じコンポーネントです。
第三階層用のデータ(hierarchy3配列)が あったら表示、なかったら非表示するように作っていきます。
あったら表示、なかったら非表示。。。
そうです!!! DOMを生成したり削除してくれる、v-if の登場です!
<template>
  <!-- 第二階層リスト -->
  <ul>
    <li v-for="(menuDataItem, index) in menuData" :key="index">
      <nuxt-link :to="menuDataItem.link">
        {{ menuDataItem.text }}
      </nuxt-link>
      <!-- 第三階層リスト↓↓ -->
      <ul v-if="menuDataItem.hierarchy3">
        <li v-for="(hierarchy3Item, index2) in menuDataItem.hierarchy3" :key="index2">
          <nuxt-link :to="hierarchy3Item.link">
            {{ hierarchy3Item.text }}
          </nuxt-link>
        </li>
      </ul>
      <!-- 第三階層リスト↑↑ -->
      
    </li>
  </ul>
</template>
↑第二階層リストの中に、第三階層リストを差し込みました。
manuData.jsの中に、hierarchy3配列があれば第三階層を生成するようにします。
<!-- 第三階層リスト↓↓ -->
<ul v-if="menuDataItem.hierarchy3">
これで完成です😋
全体のソースはこちら↓
<template>
  <!-- 第二階層リスト -->
  <ul>
    <li v-for="(menuDataItem, index) in menuData" :key="index">
      <nuxt-link :to="menuDataItem.link">
        {{ menuDataItem.text }}
      </nuxt-link>
      <!-- 第三階層リスト↓↓ -->
      <ul v-if="menuDataItem.hierarchy3">
        <li v-for="(hierarchy3Item, index2) in menuDataItem.hierarchy3" :key="index2">
          <nuxt-link :to="hierarchy3Item.link">
            {{ hierarchy3Item.text }}
          </nuxt-link>
        </li>
      </ul>
      <!-- 第三階層リスト↑↑ -->
      
    </li>
  </ul>
</template>
<script>
import menuDataArray from '~/data/menuData.js'
export default {
  name: 'HamburgerMenu',
  data() {
    return {
      menuData: menuDataArray
    }
  }
}
</script>
ヘッダー・フッターなどでも、
同じようにデータを受け取り、<li> を回すようにコンポーネントを作っておけば、
一箇所の変更だけで済み、又、
第二階層、第三階層が増えたときも、配列にちょちょっと書き足すだけなので簡単です。
vue好き!もっと勉強しよう😀


