【Vue.js】猫本を参考に基本的なところをまとめてみた。

<h2>はじめに</h2>
2か月程前、Vue.jsに関して以下の本を用いて学習を始めました。

https://www.amazon.co.jp/%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6-Vue-js-mio/dp/4863542453/ref=asc_df_4863542453/?tag=jpgo-22&amp;linkCode=df0&amp;hvadid=295706574430&amp;hvpos=&amp;hvnetw=g&amp;hvrand=10968923051787403043&amp;hvpone=&amp;hvptwo=&amp;hvqmt=&amp;hvdev=c&amp;hvdvcmdl=&amp;hvlocint=&amp;hvlocphy=1028851&amp;hvtargid=pla-524581061219&amp;psc=1&amp;th=1&amp;psc=1

2週間ほど勉強して、少しだけアレンジして作成したToDoリストが以下になります。(Bootstrapでデザインして、状態ボタンを1つ追加しただけだけど)

https://chobimusic.com/vue_nekotodo_arrange/

その後、Laravelと組み合わせたポートフォリオ作成を目指して、Laravelの勉強に専念。

やっとこさ最近LaravelとVueの連携について理解できてきたので、とりあえずVue.jsで新しいポートフォリオのフロントサイドを作り始めようと思ったのですが。。。

<span style="color: #ff0000;"><strong>手が一切動かない。全然覚えてない。悲しい。。。泣　</strong></span>

2週間程度勉強したのですが、1か月経ち、気づけば頭からすっぽり抜けてしまっていました。。。<del>(記憶力なんてこんなもん)</del>

ってことで改めて復習がてらVue.jsの基本を記事にまとめてみました。(今後の備忘録も兼ねて)

※WordPressで体裁を整えたものをコピペしたところ、テーブルの形が崩れてしまいました。。。もし当記事が気になりましたら、以下よりご覧いただけますと幸いです。。。

https://chobimusic.com/vuejs_nekobook_summary/

<h2>Vue.jsの表示</h2>
まずはVue.jsでHello worldしてみる。
<h3>index.html</h3>
<div>

```vuejs
<div id="app">
  <p>{{ message }}</p>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
<script src="main.js"></script>
```

</div>
#appの内側にテンプレートを書き込んでいく。

インターネットに接続できる環境であれば、Vue.jsのインストールにCDNが利用可能。

マスタッシュ記法を用いて{{}}内にプロパティ名を記述するとその値が描画される。
<h3>main.js</h3>

```js
var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello world'
  }
})
```
コンストラクタ(クラスのインスタンス生成時に実行されるメソッド)関数Vueを使ってルートとなるVueインスタンスを作成。

data内のデータをテンプレート側に送っている。変数化するとコンソールからもアクセスできるが必須ではない。
<h3>実際の描画</h3>

```vue
<p>hello</p>
```

<h2>基本機能(ディレクティブ/組み込みコンポーネント)</h2>
<h3>v-bind</h3>
クラス、スタイル、属性などタグ内のバインドに使用。※Mustache{{}}はテキストコンテンツ特有の記法のため、タグ内で使用することができない。

```vue
<input type="text" v-bind:value="message">
```

省略パターン

```vue
<input type="text" :value="message">
```

<h3>v-for</h3>
リストデータを用いて要素を繰り返し描画する際に、繰り返したいタグに対して使用。
<h3>v-on</h3>
「クリックしたとき」「要素が変わったとき」などDOMイベントのハンドリング(イベント)を受け取り、処理を行う際に使用。

※猫本では、イベントに紐づける処理の内容を「イベントハンドラ」、イベントハンドラをイベントと紐づけることを「ハンドル」と呼んでます。

```vue
<button v-on:click="handleClick">クリック</button> <!--handleClickはコンポーネントのmethodsオプションに定義-->
```

省略形「@」

```vue
<button @click="handleClick">クリック</button>
```

<h3>v-model</h3>
データとフォームの入力項目をバインド(同期)する際に使用(双方向データバインディング)。

下記でフォームの文字を編集すると、同期して画面のメッセージも更新される。
<div>

```vue
<div id="app">
  <input v-model="message">
  <p>{{ message }}</p>
</div>
```
</div>
<div>

```js
var app = new Vue({
  el: '#app',
  data: {
    message: 'hello'
  }
})
```

</div>
<img class="alignnone size-full wp-image-705" src="https://chobimusic.com/wp-content/uploads/2020/03/douki.jpg" alt="" width="181" height="65" />
<h3>v-if</h3>
プロパティがTrueの時だけ条件分岐でテンプレートを描画したい際に使用。条件を満たさなかった際はコメント化。似たディレクティブにv-showがあり、こちらはstyle="display: none;"のスタイルが付与されて描画。

&lt;templete&gt;タグを使うと複数の要素をグループ化できる。

```vue
<templete v-if="ok">
  <h1>タイトル</h1>
  <p>コンテンツ</p>
</templete>
```

また、v-else-if、v-elseを組み合わせることで複数の条件を指定できる。
<h3>&lt;transition&gt;タグ</h3>
組み込みコンポーネント。CSSトランジションやアニメーションを容易に適用できる。
<h2>基本的なオプションの構成</h2>
Vueクラスのインスタンスの生成テンプレート
<table style="border-collapse: collapse; width: 100%;">
<tbody>
<tr>
<td style="width: 50%;">
<pre><span class="nx">//main.js

vue</span> <span class="o">=</span> <span class="nx">Vue</span><span class="p">.</span><span class="k">new</span><span class="p">({</span>
  <span class="na">el</span><span class="p">:</span> <span class="dl">'</span><span class="s1">#app</span><span class="dl">'</span><span class="p">,</span>
  <span class="na">data</span><span class="p">:</span> <span class="p">{</span>
    <span class="na">message</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Hello Vue.js</span><span class="dl">"</span>
  <span class="p">},</span>
  <span class="na">computed</span><span class="p">:</span> <span class="p">{</span>
    <span class="na">computedMessage</span><span class="p">:</span> <span class="kd">function</span><span class="p">(){</span> 
      <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">message</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">!</span><span class="dl">"</span>
    <span class="p">},</span>
  <span class="p">},</span>
  <span class="na">created</span><span class="p">:</span> <span class="p">{</span>
  <span class="c1">// アクションフック</span>
  <span class="p">},</span>
  <span class="na">methods</span><span class="p">:</span> <span class="p">{</span>
    <span class="na">myMethod</span><span class="p">:</span> <span class="kd">function</span><span class="p">(){</span>
    <span class="p">},</span>
  <span class="p">},</span>
<span class="p">})








</span></pre>
</td>
<td style="width: 50%;">
<h4>el: mountする要素</h4>
アプリケーションを紐づけるセレクタ。
<h4>data:</h4>
アプリケーションで使用するデータの登録。
<h4>computed:</h4>
算出プロパティ。関数によって算出されたデータ。
メソッド内ではthis(Vueインスタンスを指す)を付ける。
テンプレートの可読性を保つためにここに記述。
<h4>created:</h4>
ライフサイクルハック。特定のタイミングで自動的に呼び出す。呼び出したいタイミングによってメソッドは変える。
処理を割り込ませる仕組みのことを「フック」と呼ぶ
<h4>methods:</h4>
アプリケーションで使用するメソッド。
コードを管理しやすくするために処理を分けたり、イベントハンドラなど細かな実装を担当する。</td>
</tr>
</tbody>
</table>
<h2>コンポーネント</h2>
機能をもつUI部品ごとにテンプレートとJavaScriptを1つのセットにして、ほかのUI部品とは切り離した開発、管理をできるようにする仕組み。設計図。再利用が容易になる。

※UI(User Interface)とは、ユーザーがPCとやり取りをする際の入力や表示方法などの仕組み。
<h3>index.html</h3>
<table style="border-collapse: collapse; width: 100%;">
<tbody>
<tr>
<td style="width: 50%;">
<pre>&lt;h1&gt;Vue.js&lt;/h1&gt;
&lt;div id="app"&gt;
  &lt;hello /&gt;
&lt;/div&gt;
&lt;script src="https://unpkg.com/vue"&gt;&lt;/script&gt;
&lt;script&gt;
Vue.component('hello',
{
  template: '&lt;p&gt;Hello!&lt;/p&gt;'
})
var app = new Vue({
  el: '#app',
});
&lt;/script&gt;</pre>
</td>
<td style="width: 50%;">
<h4>コンポーネントの定義</h4>
Vue.component(名前,{設定情報});
<h4>コンポーネントの出力</h4>
&lt;コンポーネント名 /&gt;

&nbsp;</td>
</tr>
<tr>
<td style="width: 50%;">
<div>
<pre>&lt;h1&gt;Vue.js&lt;/h1&gt;
&lt;div id="app"&gt;
  &lt;mycomponent /&gt;
&lt;/div&gt;
&lt;script src="https://unpkg.com/vue"&gt;&lt;/script&gt;
&lt;script&gt;
var component = {
  template:'&lt;p&gt;localcomponent&lt;/p&gt;'
}
new Vue({
  el: '#app',
  components: {
    'mycomponent':component
  }
});
&lt;/script&gt;</pre>
</div></td>
<td style="width: 50%;">
<h4>ローカルコンポーネントの登録</h4>
Vueオブジェクトの「components」プロパティに登録すると、そのコンポーネントのスコープ内だけで使用するように制限できる。

components:{'コンポーネントタグ':コンポーネント名}

※Vue.componentsはグローバルコンポーネント

親子間のコンポーネントデータフローは、「props(親から子)」と「カスタムイベント$emit(子から親)」を使用する。</td>
</tr>
</tbody>
</table>
&nbsp;

拡張フレームワークには「Nuxt.js」や「VuePress」がある。

「Vuex」や「Vue Router」といった拡張ライブラリを導入することで効率よく目的に応じたスケールアップも可能。

また、UIコンポーネントサイトとしては「Element」や「Onsen UI」がある。
<h2>用語</h2>
<h3>ディレクティブ</h3>
テンプレートとロジックを関連付ける機能。テンプレート内で「v-if」など独自の属性で記述する。オプションで引数や修飾子を扱うことも可能。
<h3>マウント(mount)</h3>
配置する要素とアプリケーションを紐づけること。
<h3>データバインディング</h3>
データと描画を同期させる仕組みのこと(JavaScriptのデータとそれを使用する場所を紐づけ、データに変化があれば自動的にDOMを更新する)。リアクティブシステムによって実現している機能の1つ。
<h3>DOM(Document Object Model)</h3>
JavaScriptでhtmlの要素を操作するための仕組みのこと。(ファイルの特定の部分に目印を付けて「この部分」に「こういう事をしたい」という処理を可能にするための取り決め。)
<h3>オプション</h3>
Vueインスタンスの中で使用するデータやメソッドを定義する場所。
<h2>今回まとめで割愛したこと</h2>
テンプレート制御ディレクティブ(v-preやv-htmlなど)

各ディレクティブの修飾子

スクロールイベントの取得(スムーススクロール)　P114

算出プロパティ詳細(ゲッターとセッター、キャッシュ機能、watchオプション)

コンポーネントの親子間のデータフロー　P154

トランジション　P194

Vue CLI P216

Vuex P252

Vue Router P282
<h2>予備知識</h2>
<h3>jQueryとの併用</h3>
Vue.jsを使用すると、jQuery(DOM操作系ライブラリ)を併用する機会は減る。マウントした要素内のDOMを直接操作しても仮想DOMは更新されず、データが変わらないため。

DOMを直接参照したい際は、$elや$refsなどカスタムディレクティブを使用する。
<h2>所感</h2>
復習してみて、今回割愛した各ディレクティブの修飾子がかなり重要な役割を果たす上に、数が多いので把握するのが大変だなと感じた。まずはポートフォリオにトランジションを用いたテキストアニメーションを実装しながら学んでいこうかな。

Vue RouterでSPAも憧れるけどVue CLIの導入が必須っぽいので、まずはVue CLI導入せずにできるところからポートフォリオ制作に活かしつつ、勉強していこうと思います。
<h2>参考サイト</h2>
<a href="https://cr-vue.mio3io.com/">猫本公式サポートページ</a>

<a href="https://github.com/mio3io/cr-vue">猫本ソースコードgithub</a>

<a href="https://eng-entrance.com/what-is-dom">JavaScript初心者でもすぐわかる！DOMとは何か？</a>

<a href="https://qiita.com/naotoshin72/items/6496d2f061bd6ce1ec3a">Vue.js童貞がネコ本読んで得たもの①</a>
<h2 class="post-title">今後活用したいチュートリアルなど</h2>
<a href="https://www.techpit.jp/p/vue-js-vuex-trello">Vue.js/Vuexを使ってTrello風アプリを作成しよう！</a>

Vue CLI活用

<a href="https://www.techpit.jp/p/vue-js-firebase-twitter-like">Vue.js &amp; FirebaseでTwitterライクなSNSアプリを作ってみよう！</a>

Vue CLI活用 (Vue Routerアリ、Vuexは使用しない)

<a href="https://www.techpit.jp/p/nuxt-js-contentful-tailwind-jamstack-portfolio">Nuxt.js &amp; Contentfulでハイスペックなポートフォリオサイトを超簡単に公開しよう！【JAMstack】</a>

&nbsp;