【Vue.js基礎第1回】環境構築・ディレクティブ

#はじめに
Vue.jsの基礎について複数回に渡ってまとめていきます。今回は「環境構築」と「ディレクティブ」についてです。動作確認済みのコードも記述しています。※内容は初学者向けです。

<font color="red">【第1回】環境構築・ディレクティブ(今回)</font>
【第2回】コンポーネント基礎・データの渡し方：https://qiita.com/tatsuya_1995/items/390ec39cb99f1d7b5253

#準備
今回はCDNを用いて導入。Vueの公式ホームページより最新のCDNを取得。bodyタグの直前に記述。別のファイルにJSを記述する場合は、CDNの後に挿入する。
https://jp.vuejs.org/v2/guide/installation.html#CDN

```cdn.html
<body>
<div id="app">
 //本記事ではここにVueで操作したい内容を記述
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.12/dist/vue.js"></script>
<script src="app.js"></script>
</body>
</html>
```

`new Vue`でインスタンスを生成し、html内のVueを使用する場所をel要素で指定する。

```vue.js
new Vue({
  el:'#app'
})
```

#ディレクティブ
`v-`という接頭辞がついたVue.jsの属性のこと。DOMに対して動作を適用することができる。

参考：https://rightcode.co.jp/blog/information-technology/vue-js-introduction-directive

##①v-bind
タグの属性を動的に設定できる。

```
v-bind:<属性の名前="属性に代入される変数名">
```

使用例：

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

```v-bind.js
new Vue({
    el:'#app',
	data: {
        url : 'http://localhost'
    }
})
```

###`v-bind`は省略できる。

```.v-bind2.html
<a :href="url">URL</a>
```
表示
![vbind.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/4896112b-af4d-ad65-25bc-74d0943e0cb3.png)


##②v-on
イベントのトリガーを呼び出す関数を定義する。

```
v-on:<イベント名>="<呼び出す関数名>"
```

参考：v-onの後ろに置くことができるDOMイベント
https://developer.mozilla.org/ja/docs/Web/Events


###引数を取らない時
メソッド名に()は不要。あっても問題ない。

```v-on.html
<div id="app">
  <p>カウント数：{{ counter }}</p>
  <button v-on:click="countUp">カウントアップ</button>
</div>
```
```v-on.js
new Vue({
    el:'#app',
	data: {
        counter: 0
    },
    methods:{
        countUp:function(){
            this.counter += 1;
        }
    }
})
```


###引数をとる時
引数を複数渡すこともできる。下記例は引数に10を渡して10倍ずつカウントアップしている。

```v-on2.html
<div id="app">
  <p>カウント数：{{ counter }}</p>
  <button v-on:click="countUp(10)">カウントアップ</button>
</div>
```
```v-on2.js
new Vue({
    el:'#app',
	data: {
        counter: 0
    },
    methods:{
        countUp:function(times){
            this.counter += 1 * times;
        }
    }
})
```

####`v-on:`は@で省略可能

```v-on3.html
<div id="app">
  <p>カウント数：{{ counter }}</p>
  <button @click="countUp">カウントアップ</button>
</div>
```
表示
![スクリーンショット 2021-01-23 10.07.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/2e566e5a-d1b4-e277-ab85-39eaf4cf47cd.png)


##③v-model
双方向バインディングを可能にするため、テキストボックスの文字列を変更すると、連動してのVue側の値も変更される。

>双方向バインディング:
スクリプト側から値の設定とブラウザからの入力のどちらからでも双方向で値を更新できる仕組み。
　ブラウザから入力 <==> 変数 a <==> JavaScriptから更新
参考：https://ameblo.jp/forefrontier/entry-12330323176.html
※バインディングは結びつけるの意。


使用例：

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

```v-model.js
new Vue({
	el:'#app',
	data: {
  	message: 'Hello、JS！'
  }
})
```

出力
![スクリーンショット 2021-01-23 10.59.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/bdc7d875-383f-0990-a863-e679e23c3837.png)

入力フォームに「Hello、JS!」と入力すると、データが変更される↓
![スクリーンショット 2021-01-23 10.59.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/6209a263-149e-4f0d-8df2-7a193d845738.png)


##④v-if
条件に応じてhtml要素を動的に変更する。

使用例：FizzBuzzをカウントアップで表示

```.html
<div id="app">
  <p v-if="FizzBuzz">FizzBuzz</p>
  <p v-else-if="Fizz">Fizz</p>
  <p v-else-if="Buzz">Buzz</p>
  <p v-else>{{ count }}</p>
  <button @click="countUp">カウントアップ</button>
</div>
```

```.js
new Vue({
    el:'#app',
	data: {
        count:1
    },
    methods: {
        countUp:function(){
            this.count += 1;
        }
    },
    computed: {
        FizzBuzz: function() {
            return this.count %3 == 0 && this.count % 5 == 0; 
        },
        Fizz : function() {
            return this.count %3 == 0;
        },
        Buzz : function() {
            return this.count %5 == 0;
        }
    }
})
```
表示「FizzBuzz」
![fizzbuzz 2021-01-23 18.19.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/b50b4f36-b2c0-52a6-a82e-22a001ccb09d.png)
表示「Fizz」
![fizz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/3da7508a-4ffb-cb8c-c2bb-2782588d3a47.png)
表示「else」
![else 2021-01-23 18.18.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/150e338e-0305-5c4e-c4d2-699ce1b58c1e.png)


##⑤v-for
オブジェクトや配列の中身を表示する。

```
v-for = "<配列やオブジェクト名> in <配列やオブジェクトの複数形>"
```

使用例：

```v-for.html
<div id="app">
  //配列の場合
  <ul>
    <li v-for="color in colors">{{ color }}</li>  
  </ul>
  //オブジェクトの場合
  <ul>
    <li v-for="value in object">{{ value }}</li>
  </ul>
</div>
```

```v-for.js
new Vue({
    el:'#app',
	data: {
        colors: ['赤','青','緑'],
        objects: {
          name: 'Evan You',
          age: 35,
          birthplace:'China'
        }
    }
})
```
表示
![v-for.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/19fff7f9-92d4-fcd2-fa60-0b858669dfc1.png)
![スクリーンショット 2021-01-24 7.37.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/b4df32be-9971-ab2f-f149-efee88145f5a.png)

オブジェクトや配列は引数をとることができる。

```v-for2.js
<div id="app">
  <ul>
    <li v-for="(value,key,index) in objects">({{ index }}){{ key }}-{{value }}</li>
  </ul>
</div>
```
![スクリーンショット 2021-01-24 7.51.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/91b8bc7b-faeb-ee84-c008-615117887a49.png)

#最後に
Vueのディレクティブについてまとめました。複数回に渡ってVueの基礎をまとめていきます。
（もしこの記事に誤りがありましたらご教授いただけると幸いです。）