Vue.js

Vuetifyでヘッダーメニューの作成①【サイドメニューとハンバーガーメニュー】

はじめに

前回の続きの記事となります。

【最新】Vuetify2系のインストールと使い方・書き方Vuetifyを使用するのが初めてという方に向け、Vuetifyの最新バージョンであるVuetify2系のインストール方法や使い方・書き方を解説しております。Vuetifyを使用することでWebサイトに最低限必要な機能を実装することができます。...

今回からVuetifyでレスポンシブなヘッダーを作成していきます。

本記事では、サイドメニューとハンバーガーメニューの作成まで行います。

完成イメージは下記の通りです。

本記事の内容

■ App.vueファイルの初期化

■ ヘッダーのタイトル作成方法

■ ヘッダーのハンバーガーメニュー作成方法

■ ヘッダーのサイドメニュー作成方法

App.vueファイルの初期化

作業内容

① App.vueの内容をクリア

② コンポーネントの3つのタグ(templatescriptstyle)を追加

③ templateタグ内にv-appタグを追加

まず、デフォルトでApp.vueにいろいろと書かれていると思いますが、すべて消して以下のようにコーディングしてください。

そして、今回ほぼすべてのコンポーネントに対し、Vuetifyを使用するため、v-appタグで囲ってください。

v-appタグの正体ですが、こちらはVuetifyのコンポーネントとなります。

以降でもv-で始まるタグがたびたび出現しますが、これらはすべてVuetifyのコンポーネントです。

なお、v-appタグはid=appをデフォルトで含むため、記載する必要はありません。(記載してもエラーにはなりません。)

また、補足ですが、templateタグ直下には複数の子要素を置くことができません。
templateタグ直下でなければ、通常通り子要素を置くことができます。

以下が今回のポイントとなります。

■ Vuetifyのコンポーネントは必ずv-appタグで囲む必要がある。

■ Vuetifyのコンポーネントは必ずv-から始まる。

v-appタグにはid=appが含まれている。

templateタグ直下には子要素は必ずひとつだけ。

ヘッダーのタイトル作成方法

次に下図のようなヘッダーのタイトルを表示させます。

ヘッダータイトル

作業内容

headerタグ追加

v-app-barタグ追加(appディレクティブとdarkディレクティブ指定)

v-toolbar-titleタグ追加

headerタグ追加

ヘッダー部分はHTML5から追加されたタグであるheaderタグを使用します。

divタグでもエラーになったり、デザインが崩れることはないのですが、検索エンジンのクロールを向上させるSEO対策コードの可読性UPという保守性の観点からHTML5から追加されたタグは積極的に使用してください。

以降の記事でも積極的にHTML5から追加されたタグを使用します。

HTML5から追加されたタグにはどんなものがあるか知りたい方は、以下の記事をご参考にしてください。

HTML5から追加されたタグ

v-app-barタグ追加

v-app-barタグを使用することでヘッダーのナビゲーションバーのスタイルを実現することができます。

以下に今回使用しているオプションをまとめました。

app v-app-barのオプション。
高さをいい感じに自動調整してくれる。ヘッダーのナビゲーションバーを実現する際は、v-app-barタグと必ずセットで使用。
dark v-app-barのオプション。
v-app-barディレクティブに適用するデザインテーマの種類。darkテーマを設定すると、バーの背景色が黒色になり、文字の色は白に変わる。他にもlightやprimaryが指定可能。他にもどんなテーマがあるか気になる方は、こちら

今回ご紹介したオプション以外に何があるか確認したい方は、以下の公式ドキュメントをご参照ください。

【公式ドキュメント】v-app-bar

v-toolbar-titleタグ

ヘッダーに上記のサンプル画像のようなタイトルを表示したいときはv-toolbar-titleを使用します。

以下が今回のポイントとなります。

■ SEO対策と保守性向上のため、HTML5以降に追加されたタグを積極的に使用する。

■ ヘッダーのナビゲーションバーを実装するときは、v-app-barタグとappディレクティブを使用する。

■ ヘッダーのナビゲーションバーのタイトルはv-toolbar-titleタグを使用する。

ヘッダーのハンバーガーメニュー作成方法

次にヘッダーに下図のようなハンバーガーメニューを表示させます。

ハンバーガーメニュー

作業内容

v-app-bar-nav-iconタグを追加

② クリックイベントを追加

scriptタグ内にデータ定義

v-app-bar-nav-iconタグ

v-app-bar-nav-iconタグを使用することで、ハンバーガーメニューのアイコンを表示することができます。

クリックイベントを追加

@clickディレクティブはVuejsのディレクティブです。

@clickディレクティブを使用することでJavascriptの実行が可能になります。

また、@clickは省略記法なのですが、省略せずに書くとv-on:clickとなります。

実務では省略記法で書くことが多いため、今回のサンプルでは省略記法で統一します。

なお、click部分はmouseoverなど他のDOMイベントも使用可能です。

今回の@click="drawer = true"部分を解説すると、v-app-bar-nav-icon(ハンバーガーメニュー)がクリックされたら、drawerという変数へtrueという値を代入するという意味になります。

では、drawerという変数はどこで定義するのかということについて、次に説明します。

データ定義

Vue.jsのコンポーネント内で変数を定義したいときは、scriptタグ内に以下のようにコーディングします。

このように変数を定義することでtemplateタグ内から変数を呼び出すことができます。

なお、上記でES5とES6の書き方を両方紹介しましたが、今回のサンプルではES6の記法でコーディングします。

以下が今回のポイントとなります。

■ ハンバーガーメニューのアイコンを表示する際はv-app-bar-nav-iconタグを使用する。

@clickディレクティブを使用することでJavascriptの実行が可能。

■ データ定義する際は、dataプロパティを使用し、return部分にオブジェクト形式でデータ定義する。

ヘッダーのサイドメニュー作成方法

次にヘッダーのハンバーガーメニューを押下すると、下図のように表示されるサイドメニューを作成します。

サイドメニュー

作業内容

v-navigation-drawerタグを追加

v-listタグを追加

v-navigation-drawerタグ

こちらは画像のようなサイドメニューを表示するUIコンポーネントとなります。

以下に今回使用しているオプションをまとめました。

fixed position:fixedのスタイルが効き、サイドメニューが画面左側いっぱいに表示することが可能。
temporary アプリケーションの一番上の層で表示させることが可能。サイドメニューの一部がヘッダーから隠れたりするのを防ぐ。

他にも右側にサイドメニューを表示するためのオプション等ありますので、カスタマイズしたい方は公式ドキュメントをご参照ください。

v-model:双方向データバインディング

v-modelは下図のように双方向にデータを同期する双方向データバインディングを行うことができます。

v-modelイメージ

dataプロパティ側の変数で更新があったら、v-model内で使用してる変数を更新し、v-model内で使用してる変数で更新があったら、dataプロパティ側の変数を更新するというような同期処理が行われます。

v-modelの書き方は以下の通りです。

今回の例でいうと、下図のような双方向データバインディングが行われています。

v-modelイメージ

ただし、v-modelは通常input要素やtextarea要素、select要素などのフォームに使用され、今回のようなユースケースはレアです。

Vuetify特有の書き方なので、「v-navigation-drawerを使用するときは、表示非表示の制御にはv-modelディレクティブを指定するんだなー」ぐらいの理解でOKです。

v-listタグ

v-listタグは以下のような構成となっております。

v-list構成イメージ

コーディングする際は、以下のように書きましょう。

以下に今回使用しているv-listのオプションをまとめました。

nav リストの各アイテムの要素をいい感じに丸みをつけてmarginを設定してくれる。
dense リスト全体のフォントを小さくし、いい感じにmarginを設定してくれる。

カスタマイズしたい方はv-listの公式ドキュメントを参考に様々なオプションを試してみてください。

以下が今回のポイントとなります。

■ サイドメニューを作成する際は、v-navigation-drawerタグを使用する。

v-modelディレクティブを使用することでサイドメニューの表示・非表示の制御が可能。

v-listタグを使用することでいい感じのリストスタイルになる。

v-forディレクティブでソースコードの簡略化

以下のサイドメニューのリストのアイテム(HOME等)ですが、PC時のヘッダーメニューでも同じものを使用するため、共通化しておきましょう。

また、v-forディレクティブを使用することでソースコードを簡略化できます。

それでは、実際にリファクタリングしていきます。

まず、simple-vue-website-sample/srcディレクトリにcommonディレクトリを作成し、変数を管理するconstants.jsを新規作成します。

ちなみにconstantsは変数という意味です。

次に以下のようにname(メニューに表示する名前)とurl(遷移先)を定義します。
遷移先については、vue-routerを導入してから設定するため、一旦#を仮で設定しておいてください。

次に、App.vueのscriptタグに以下のように記述します。

import文で先程作成したconstants.jsを読み込み、menuItemsという変数にリストを格納しております。

constants.menuItemsと指定することで先ほどconstants.jsで定義したオブジェクトのvalueが取得できます。

次にtemplateタグのv-list-item要素をv-forディレクティブを使用して、以下のように修正します。

v-forディレクティブの使い方

v-forディレクティブを下記のように使用することで、ビルドする際に指定したリストの中身をひとつずつ取り出し、要素を作成してくれます。

item 繰り返し処理で一時的にデータを格納するために使用。変数名は何でもOK。また、変数を要素内で使用するには二重カギカッコ{}で囲む必要がある(※)。
items dataプロパティで定義した変数を指定する必要がある。
index 第2引数に指定することで、for文で読み込まれた順番(配列の順番)を取得できる。使用しない場合は省略可能。
:key 一意となる値をセット。

(※) v-for構文内の変数に限らず、dataプロパティ内で定義した変数を要素内で使用する場合にも二重カギカッコ{}で囲む必要があります。

補足:keyに指定すべき値

今回のサンプルプログラムでは、:keyindexを指定しましたが、リストに対し、追加削除したりする場合は、以下のようにデータに一意の値を指定することをおすすめします。

今回のサンプルでは問題ないのですが、リストに対し、追加・削除する場合は、indexが変わってしまうため、予期しない挙動となってしまう可能性があります。

詳しい理由が知りたい方は以下のQiitaの記事をご参照ください。

v-forで項目インデックスをkey属性にしていいのか

さいごに、動作確認して、リファクタリング前と同じ結果になれば、リファクタリング完了です。

以下が今回のポイントとなります。

■ 変数は保守性を考えて外部ファイルで一元化する。

■ 繰り返し処理はv-forディレクティブを使用してソースコード簡略化

さいごに

ここまででスマホのヘッダーのコーディングは完了です!

お疲れ様でした!

少し休憩して、次回はPCのヘッダーを実装していきましょう!

Vuetifyでヘッダーメニューの作成②【ナビゲーションメニュー】Vuetifyでレスポンシブなナビゲーションメニューを作成する方法をご紹介します。実装にあたって必要なVuetifyのコンポーネントの解説やVuetifyで生成されたクラスのスタイルを直接修正する方法、グローバルなscssファイルをあらかじめ読み込ませる方法について詳しく解説しております。...

ES6について基礎から学習したい方は、以下の記事で紹介している教材がおすすめです。

【最新版】JavaScript(ES6)が学べるおすすめ書籍・Udemy講座まとめJavaScript(ES6)が学べるおすすめサイト(無料あり)や書籍、Udemy講座をまとめました。自身が参考にした教材の中でも非常に業務に役立ったものを厳選しております。...

VueJsの基礎知識についてより詳しく網羅的に学習したい方は、以下の記事で紹介している教材がおすすめです。

【これだけでOK!】おすすめのVue.js入門教材「Vue.jsを初めてみたいけど、どの教材から手をつけてよいか分からない」という方や「Vue.jsできるようになるためにどんなことをやったらよいのか?」という疑問をもった方向けにおすすめのVue.js入門教材の紹介とその教材の使い方について詳しく解説しております。...

JavaScriptの基礎からVueJsが学べるスクールは以下の記事で紹介しております。

【2020年最新版】おすすめJavaScriptスクール【未経験からフロントエンドエンジニアへ】未経験からフロントエンドエンジニアになりたいけど、独学で限界を感じている方に向け、客観的審査基準から厳選したおすすめのJavaScriptスクールを公開。実践的でモダンなフロントエンド技術が学べるスクールのみご紹介しております。...

さいごまで読んでいただき、ありがとうございました。

フリーランスエンジニア転職完全ロードマップ

知り合いから
「フリーランスエンジニアになれば、年収800万円以上の高報酬でかつ、自由な働き方をチョイスできる」
というのを聞いて、フリーランスエンジニアに興味を持ったのですが、
当時SIer企業でエンジニアをやっていたボクはなかなか一歩踏みだせませんでした。

というもの以下のような不安があったからです。

■フリーランスエンジニアってかなりの技術力がないとなれないのではないのか?

■フリーランスエンジニアって不安定なのではないのか?

■フリーランスエンジニアって人脈やコネ、営業力が必要なのではないのか?

しかし、実際にフリーランスエンジニアになってみて気づきました。

これらはすべて間違いです。

過去のボクのようにフリーランスエンジニアに興味あるけど一歩踏み出せないという方向けに
『フリーランスエンジニア転職完全ロードマップ』
という記事を書きました。

この記事読めば、どうすればフリーランスになれるのかが分かりますので、ぜひ一読ください。