【学習記録①】Vue.jsの基礎的な構文の備忘録

#はじめに
Vue.jsを最近勉強し始めたので学んだ文法などを備忘録としてメモしていこうと思います。

##Vue.jsとは
Vue.jsとはJavaScriptのフレームワークであり、国内ではよくReact.jsやAngular.jsと並んで比較されることが多いです。

##テンプレート構文
Vueを勉強していると「テンプレート」というワードが出てきます。
Vue.jsではHtmlファイルに以下のように書いたりするのですが、これを「テンプレート」と言います。

```html:index.html
//以下のようにVue.jsによって操作される部分をテンプレートという
<div id="app">
  <p>{{message}}</p>
</div>
```

```js:index.js
new Vue({
  el: "#app",
  data: {
    message: 'Hello World'
  }
})
```

https://jp.vuejs.org/v2/guide/syntax.html

##ディレクティブ
Vue.jsでは`v-`から始まる特別な属性値「[ディレクティブ](https://jp.vuejs.org/v2/guide/syntax.html#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96)」というものが用意されています。

###v-if
v-ifはJavaScriptのif文と似たようなもので`v-if`属性の値がtrueの時にそのテンプレートが表示されます。

```html:index.html
<div id="app">
  <p v-if="isEnabled">{{message}}</p>
</div>
```

```js:index.js
new Vue({
  el: "#app",
  data: {
    message: 'Hello World',
    isEnabled: true // <-- trueのときは上記Htmlファイルのpタグが表示され、falseのときは表示されません
  }
})
```

###v-show
v-showは使い方は上記のv-ifと同じです。
しかしながら、出力結果のHtmlに以下のような違いがあります。

**v-if**
falseの時にはhtml自体に出力されない。

**v-show**
falseの時にはhtmlには出力されているものの、style属性にて`display:none;`が設定されている。

###v-bind
`v-bind`を用いると任意の属性値をVueのほうから指定することができます。`バインディング`などと言われたりします。
v-bindは引数を指定する必要があり、v-bindの後に`href`などの属性を指定します。

```html:index.html
<div id="app">
  <a v-bind:href="url">Qiita</a>
</div>
```

```js:index.js
new Vue({
  el: "#app",
  data: {
    url: "https://qiita.com/"
  }
})
```

`v-bind`は以下のように省略することも可能です。

```index.html
<div id="app">
  <a :href="url">Qiita</a>
</div>
```

###v-on
`v-on`はclick等のイベント発火時のJavaScriptを記述します。
メソッドを定義する際はVueインスタンスにあるmethodsプロパティを用います。

```html:index.html
<div id="app">
  <p>{{ number }}</p>
  <button v-on:click="countUp">+1</button>
</div>
```

```js:index.js
new Vue({
  el: "#app",
  data: {
    number: 0
  },
  methods: {
    countUp: function(){
    	this.number++;
    }
  }
})
```

以下のように数字が増えていくのが分かります。
![pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/fff2849e-d70b-8321-9449-e4bb8e0eb480.png)

https://jp.vuejs.org/v2/guide/events.html#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E8%B3%BC%E8%AA%AD

`v-on`は以下のように`@`マークの後にイベントを書くように省略することも可能です。

```html:index.html
<div id="app">
  <p>{{ number }}</p>
  <button　@click="countUp">+1</button>
</div>
```

###v-model
今まではVueインスタンス側から値を操作していましたが、`v-model`を用いるとテンプレート側から値を操作することも可能です。

https://jp.vuejs.org/v2/guide/forms.html#%E5%9F%BA%E6%9C%AC%E7%9A%84%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9

```html:index.html
<div id="app">
  <input type="text" v-model="message">
  <p>{{ message }}</p>
</div>
```

```js:index.js
new Vue({
  el: "#app",
  data: {
    message: ''
  }
})
```

inputタグに何かしら文字を打っていくとpタグの部分にも同じ文字が入っているのが分かります。
![pic1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/3bb38ade-b797-3bff-b348-24dfeecdbda4.png)

##computedとmethodsの違い
computedプロパティはmethodsと使い方は似ていますが、computedプロパティにはキャッシュ機能があるのに対し、methodsにはキャッシュ機能がありません。
同じように`{{}}`で囲い、それぞれを定義した場合、methodsはVueテンプレートのどれかが更新されるたびに呼ばれますがcomputedは依存する部分に変更がされたときのみしか処理は走りません。

###v-for
`v-for`を用いると配列の中身を出力することができます。

```html:index.html
<div id="app">
  <p v-for="greeting in greetings">{{ greeting }}</p>
</div>
```

```js:index.js
new Vue({
  el: "#app",
  data: {
    greetings: ['おはよう', 'こんにちは', 'おやすみ']
  }
})
```

![pic2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/00a6f0f3-1964-05d0-0cfa-2f8f6cc30d68.png)

https://jp.vuejs.org/v2/guide/list.html

#おわりに
引き続き学習内容を備忘録として残していこうと思います。
Vue.js今のところ楽しい！！！