Vue.jsの初歩をまとめてみる

初めまして！初投稿で緊張気味の[タクマ](https://twitter.com/TakumaKurosawa)です.
[OthloTech Advent Calendar 2018](https://qiita.com/advent-calendar/2018/othlotech?fbclid=IwAR02Qq0Onb0l9BUULJF7cBvE4RB4cpxybYzX6YwNtE5XCa11NiLSe8KWAWc)の11日目の記事として書かせていただきます．
初心者故に誤った情報や不適切な表現が多々あると思います．お手数ではございますが，都度ご指摘いただけると大変嬉しいです．

さて，今回取り上げる内容は[Vue.js](https://v1-jp.vuejs.org/)についてです．
最近Vue.jsを学んでいるのと，Udemyの[Vue JS入門決定版！jQueryを使わないWeb開発 - 導入からアプリケーション開発まで体系的に動画で学ぶ](https://www.udemy.com/learn-vuejs/)を修了したのでここら辺で学んだことの整理をしようと考えました．

内容としてはかなり初歩的なものにとどまってしまいますが，最後までお付き合いください．
## テンプレート
誰でもここから始められる，Vue.jsの雛形を示しておきます．
今回は初歩的なところを取り上げるので，初心者でも導入のしやすい[CDN](https://jp.vuejs.org/v2/guide/installation.html#CDN)を採用しています．
Vue.jsのバージョンを変えたい場合は，

```html
<script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
```
を変更してください．

<p data-height="265" data-theme-id="dark" data-slug-hash="PXwQaN" data-default-tab="html,result" data-user="takumaron" data-pen-title="template" class="codepen">See the Pen <a href="https://codepen.io/takumaron/pen/PXwQaN/">template</a> by Takuma Kurosawa (<a href="https://codepen.io/takumaron">@takumaron</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 基本文法を覚えよう
上で示した雛形をもとにVue.jsの基本的な文法からまとめていきたいと思います．
是非みなさんも手を動かしながら読み進めてみてください！ちなみに，いちいちテキストエディタを立ち上げてファイルを作って・・・という処理がめんどくさいという人は[JSfiddle](https://jsfiddle.net/)を使うとオンライン上で簡単に自分のコードを試してみることができます．

[jsFiddleを使ってみる-Qiita](https://qiita.com/kazusa-qooq/items/f78791c827ae050ca127)

### Mustache構文
実はすでに上で挙げた[テンプレート](#テンプレート)に出てきている構文です．

```html
<h1>{{ 変数名 }}</h1>
```

```javascript
var app = new Vue({
  el: '#app',
  data: {
    変数名: "Hello, Vue.js!",
  }
})
```
これは直感的にわかりやすいかなと思いますが，javascriptで定義した変数の内容をhtmlに埋め込む時に使う文法です．```{{ }}```がヒゲ(Mustache)に見えることからこの名前がつけられています．

さて，以下のコードではどのような出力結果になるでしょうか．一度頭の中で想像してから```Result```ボタンをクリックしてみてください．

<p data-height="265" data-theme-id="dark" data-slug-hash="PXwQaN" data-default-tab="html" data-user="takumaron" data-pen-title="template" class="codepen">See the Pen <a href="https://codepen.io/takumaron/pen/PXwQaN/">template</a> by Takuma Kurosawa (<a href="https://codepen.io/takumaron">@takumaron</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

想像していた結果と同じ結果になりましたか？この調子で進めていきましょう！

### v-if
テキストや画像の表示・非表示を切り替えるための構文です．
使い方としては，データの中にtrueかfalseのどちらかを持つ変数を定義しておき，html側で```v-if=変数名```を適用させたい要素に付け加えます．

```html
<p v-if=変数名>Hello</p>
```
```javascript
var app = new Vue({
  el: '#app',
  data: {
    変数名: trueかfalse
  }
})
```

さて，以下のコードではどのような出力結果になるでしょうか．一度頭の中で想像してから```Result```ボタンをクリックしてみてください．

<p data-height="265" data-theme-id="dark" data-slug-hash="dwPdbg" data-default-tab="html" data-user="takumaron" data-pen-title="v-if" class="codepen">See the Pen <a href="https://codepen.io/takumaron/pen/dwPdbg/">v-if</a> by Takuma Kurosawa (<a href="https://codepen.io/takumaron">@takumaron</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

想像した結果と同じ結果になりましたか？
### v-for
他の言語等でプログラミングを学んでいる方にはなじみが深いと思いますが，繰り返し処理をするための構文です．Vue.jsでは配列などの複数あるデータから1つずつ取り出して表示するときなどによく使われます．早速コードを見ていきましょう．

```html
<ol>
  <li v-for="[格納するための変数名] in [配列名]">{{ 格納するための変数名 }}</li>
</ol>
```

```javascript
var app = new Vue({
  el: '#app',
  data: {
    配列名: ['要素1', '要素2', '要素3'],
  }
})
```
イメージがつきにくいと思うので，下のコード結果を見ながらv-forの使い方を掴みましょう！

<p data-height="265" data-theme-id="dark" data-slug-hash="oJgENP" data-default-tab="html" data-user="takumaron" data-pen-title="v-for" class="codepen">See the Pen <a href="https://codepen.io/takumaron/pen/oJgENP/">v-for</a> by Takuma Kurosawa (<a href="https://codepen.io/takumaron">@takumaron</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

### v-model
双方向データバインディングと言われているVue.jsの強力な機能の一つで，__ユーザからの入力をその都度処理をしてページに反映させるための構文__です．

```html

<input type="text" v-model="変数名">
<h1>{{ 変数名 }}</h1>
```
```javascript

var app = new Vue({
  el: '#app',
  data: {
    変数名: "",
  }
})
```
今回はユーザからの入力をテキストとして受け付けていますが，チェックボックスのtrue/false等も受け付けることができます．ユーザからの入力に対して瞬時に反応したい機能などに使いましょう．
それでは，以下の結果を想像してみてください．

<p data-height="265" data-theme-id="dark" data-slug-hash="KbwQVN" data-default-tab="html" data-user="takumaron" data-pen-title="v-model" class="codepen">See the Pen <a href="https://codepen.io/takumaron/pen/KbwQVN/">v-model</a> by Takuma Kurosawa (<a href="https://codepen.io/takumaron">@takumaron</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

少し前の復習も兼ねて，先ほど出てきたv-ifも無理やり入れ込んでみましたw想像していた結果通りでしたか？
### v-on
今回取り上げる最後の構文になります．__ユーザが所定の動作をした時に反応して何かしらの応答を返すための構文__です．これまでの構文は，Javascript側で定義していたものは変数や配列といったデータのみでした．v-on構文では独自の処理をユーザに返すことができるため，その__動作を定義するための`methods`というデータ__の概念が登場します．難しいものではないので，一緒に見ていきましょう．

```html

<button v-on:ユーザからの入力種類="メソッド名">
 Click!
</button>
```
```javascript
var app = new Vue({
  el: '#app',
  methods: {
    メソッド名: function() {
      //どんな挙動をユーザに返すか
    }
  }
})
```
まずHTMLの方から確認していきましょう．`ユーザからの入力種類`にはVue.jsがあらかじめ用意しているオプションが入ります．例えば，ユーザがクリックした時↓

```html
<button v-on:click="メソッド名">
```
や，ユーザがEnterキーを押した時↓

```html
<button v-on:keyup.enter="メソッド名">
```
などが指定できます．どんな入力を指定できるか知りたい方は，[Vue.js v2 イベントハンドラ一覧](https://blog-asnpce.com/technology/744)を参照してみてください．わかりやすくまとめられています．

次はJavascriptの方を見ていきます．注目していただきたいのは，これまで`data`と書いていたところが`methods`に置き換わっているというところです．正確には置き換わっているというより，dataの定義を消しているだけなので，一緒の場所に混在させることももちろん可能です．

イメージとしては，__数値や文字列，配列といったデータをまとめておく`data`__と同じようにして__独自の挙動をfunction(関数)として定義することができる`methods`__も一つにまとめることができると考えていただければ結構です．

```javascript

var app = new Vue({
  el: '#app',
  data: {
    message: "Hello,World!",
  },
  methods: {
    doMethod: function() {
      //独自の挙動を定義できる
    }
  }
})
```
こういうことも可能ですよということですね＾＾

function()の中身や使い方については今回言及しませんが，以下のTechAcademyさんのページを参照していただけると理解していただけると思います．

[JavaScriptで即時関数を使う方法【初心者向け】](https://techacademy.jp/magazine/5530)

v-on構文ではどのような挙動になるか確認してみましょう！

<p data-height="265" data-theme-id="dark" data-slug-hash="QzwxOp" data-default-tab="html" data-user="takumaron" data-pen-title="v-on" class="codepen">See the Pen <a href="https://codepen.io/takumaron/pen/QzwxOp/">v-on</a> by Takuma Kurosawa (<a href="https://codepen.io/takumaron">@takumaron</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>




いかがでしたか？今回は入門編ということで5つの基本構文について書きました．私自身も最近Vue.jsを触り始めたところなので分かりづらい説明になっていたり，間違っていたりするかもしれません．是非気づいた点，思ったことなどあればコメント等頂けると嬉しいです．ここまで読んでいただきまして有難うございました．

また，最近twitterも始めましたので気軽にフォローして頂けると嬉しいです．一緒にプログラミング学習頑張りましょう！！


明日の[OthloTech Advent Calendar 2018](https://qiita.com/advent-calendar/2018/othlotech?fbclid=IwAR02Qq0Onb0l9BUULJF7cBvE4RB4cpxybYzX6YwNtE5XCa11NiLSe8KWAWc)は[@daizudesuyo2525](https://qiita.com/daizudesuyo2525)さんです．デザインについての記事を書いてくださるそうなので楽しみですね！！

ではでは，今回は以上にしようと思います．今回の投稿を皮切りにより多くのアウトプットをしていこうと考えていますので，今後ともよろしくお願いいたします．

## 参考にした書籍＆サイト
- [Vue.js入門 基礎から実践アプリケーション開発まで - 川口 和也](http://amzn.asia/d/gMh4mIg)
- [Vue JS入門決定版！jQueryを使わないWeb開発 - 導入からアプリケーション開発まで体系的に動画で学ぶ](https://www.udemy.com/learn-vuejs/learn/v4/overview)