The sky is the limit

ハイブリッドアプリ開発、PWAなど効率の良いiOSアプリ、Androidアプリ開発の情報を共有したい。アプリ開発は楽しい。【PWA、AngularJS、Monaca、Cordova、OnsenUI】

【Vue.js】Vue.jsで共通ヘッダーを作る【header】

【Vue.js】Vue.jsで共通ヘッダーを作る【header】

f:id:duo-taro100:20160218004611p:plain

もともとのソースは、以下の手順で取得してきたもの。
作業したい箇所で以下を実施。
(npmはインストール済みであるとして進める)

vue-cliをインストール

$ npm install -g vue-cli

プロジェクトを作成

$ vue init webpack my-app

いろいろな質問が聞かれるが、

「Install vue-router?」と聞かれる箇所だけは、yを押してenter(return)

それ以外はひたすらenterで問題ない。
これで、開発環境の準備は完了。

$ cd my-app

作成したプロジェクトに移動して、以下を実施。

$ npm install
$ npm run dev

f:id:duo-taro100:20170913114415p:plain

これでブラウザが開いて、サンプルの画面が表示されるはず。
今回は、これに共通headerを追加する。

ファイルの修正・追加

追加したファイルは

・src/components/HeaderItem.vue
・src/components/Game.vue
・src/components/Info.vue
・src/components/Gift.vue

修正したファイルは

・src/App.vue
・src/router/index.js

HeaderItem.vueの追加

componentsの下に、HeaderItem.vueを新規作成。

<template>
  <header id="header">
    <h1>This is the header.</h1>
    <nav id="header-nav">
      <ul>
        <router-link tag="li" id="home-nav" to="/" exact><a>ホーム</a></router-link>
        <router-link tag="li" id="game-nav" to="/game"><a>ゲーム</a></router-link>
        <router-link tag="li" id="info-nav" to="/info"><a>情報</a></router-link>
        <router-link tag="li" id="gift-nav" to="/gift"><a>お土産</a></router-link>
      </ul>
    </nav>
  </header>
</template>
<!-- style中身は省略 -->
<style scoped>
</style>
<router-link tag="li" id="home-nav" to="/" exact><a>ホーム</a></router-link>

router-linkはデフォルトだと、aタグ扱いだけど今回はliタグにしたかったので、「tag="li"」を追加。
exactでアクティブクラスの設定に必要。

<style scoped>
<style>

styleタグに「scoped」をつけると、cssがこのComponent内だけでしか適応されない。
これ、地味にいいなあって思った。

その他追加ファイル

これはちゃんと遷移できてるよね、っていう確認のためなので適当。

Game.vue
<template>
  <div class="game">Game</div>
</template>
Info.vue
<template>
  <div class="info">Info</div>
</template>
Gift.vue
<template>
  <div class="gift">Gift</div>
</template>

App.vueの修正

修正前
<template>
  <div id="app">
    <img src="./assets/logo.png">
    <router-view></router-view>
  </div>
</template>

<script>
export default {
  name: 'app'
}
</script>
<!-- styleは省略 -->
修正後
<template>
  <div id="app">
    <headerItem></headerItem>
    <img src="./assets/logo.png">
    <router-view></router-view>
  </div>
</template>

<script>
import headerItem from './components/HeaderItem'

export default {
  name: 'app',
  components : {
    headerItem
  }
}
</script>
<!-- styleは省略 -->

注目箇所は
template内に、headerとなるコンポーネントを記載。

  <headerItem></headerItem>

上記のコンポーネントを使うために、importして、componentの読み込み

import headerItem from './components/HeaderItem'

// name: 'app'のうしろに追加
export default {
  name: 'app',
  components : {
    headerItem
  }
}

index.jsの修正

修正前
import Vue from 'vue'
import Router from 'vue-router'
import Hello from '@/components/Hello'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'Hello',
      component: Hello
    }
  ]
})
修正後
import Vue from 'vue'
import Router from 'vue-router'
import Hello from '@/components/Hello'
import Game from '@/components/Game'
import Info from '@/components/Info'
import Gift from '@/components/Gift'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'Hello',
      component: Hello
    },
    {
      path: '/game',
      name: 'ゲーム',
      component: Game
    },
    {
      path: '/info',
      name: '情報',
      component: Info
    },
    {
      path: '/gift',
      name: 'お土産',
      component: Gift
    },
  ]
})

追加したComponentをインポート

import Game from '@/components/Game'
import Info from '@/components/Info'
import Gift from '@/components/Gift'

routerに追加

  {
    path: '/game',
    name: 'ゲーム',
    component: Game
  },
  {
    path: '/info',
    name: '情報',
    component: Info
  },
  {
    path: '/gift',
    name: 'お土産',
    component: Gift
  },

これで完成。