はじめてVue.jsを触ってみた

こんにちは。むんです:grinning:
Vue.jsをはじめて触ってみたので、備忘録として残します:star:
同じ様に、はじめてVue.jsを触る方のご参考になれば嬉しいです。

##目次
- Vue.jsって何？
- 環境を整える
- プロジェクトの起動
- 簡単なアプリを作成してみる

##Vue.jsって何？
Vue.jsとはJavascriptのフレームワークの一種です。
JavascriptのフレームワークはAngularやReactもありますが、
Vue.jsはビューに特化しているそうです。（もう少し分かったら追記します。笑）

##環境を整える
Vue.jsを使用するには下記３パターンあります。

- CDNをHTMLに書き込む
- npmでVueをインストール
- npmでVue-CLIをインストール
- 直接ダウンロード

今回は、2つ目の「npmでVue-CLIをインストール」する方法でご紹介します。
###1.Node.jsをインストール
npmを使うために、まずNode.jsをインストールします。
インストーラーを下<a href="https://nodejs.org/ja/download/">:point_right_tone1:Node.js 公式ページ</a>から入手して下さい。
※MacだとHomebrew→nodebrew使って入れる方法もあるみたいですが、割愛します。

インストールが完了すると、「node」と「npm」のコマンドが使える様になります。
バージョンを確認してみましょう。

```
$ node -v 
$ v15.2.0 //バージョンが出力される
```

###2.npmでVueをインストール
```
$ npm -v
$ v6.14.8　//バージョンが出力される
```
それでは、npmを使ってVue-CLIをインストールしましょう。
###3.npmでVue-CLIをインストール
```
$ npm install -g @vue/cli
//
// 省略
//
+ @vue/cli@4.5.8
 added 1333 packages in 265.59s
```
Vue CLI4.5.8がインストールされました！
Vueのバージョンをコマンドで確認しましょう。

```
$ vue -V
-bash: vue: command not found
```
上記の様に「command not found」が表示される場合は、パスが通っていない可能性が高いです。
下記のコマンドでnpmのパスが通っているか、確認しましょう。
<code>npm bin -g</code>
「(not in PATH env variable)」と表示される場合、パスが通っていませんので、パスを通しましょう。
<code>export PATH=$PATH:`npm bin -g` >> ~/.bash_profile</code>
もう一度、Vueのバージョンを確認しましょう。

```
$ vue -V
@vue/cli 4.5.8
```
成功ですね。

##プロジェクトの起動
###1.プロジェクトの作成
下記コマンドでプロジェクトを作成します。
<code>vue create {プロジェクト名}</code>
※プロジェクト名は小文字じゃないと怒られます。

```
$ vue create helloworld
``` 
途中、「Please pick a preset」と聞かれるので、デフォルトを選択。
プロジェクト作成に成功すると、下記の様な画面になります。
![Screen Shot 2020-11-17 at 10.08.53 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183584/d171e3bc-121c-71eb-6e1d-0cf43ea28a43.png)

###2.起動する
<code>cd {プロジェクト名}</code>
<code>npm run service</code>

```
$ cd helloworld
$ npm run service
``` 
プロジェクトの起動に成功すると、下記の様な画面になります。
![Screen Shot 2020-11-17 at 10.23.22 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183584/ba30a9fa-fc97-1305-07f5-9859076c0fe1.png)

###2.ブラウザで確認する
ブラウザより、下記URLを打ち込んで確認してみましょう。
<code>http:localhost:8080</code>
起動できていれば、下記画面が表示されます。
![Screen Shot 2020-11-17 at 10.25.51 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183584/3966d323-6e42-e43d-9719-6c0743f63f6c.png)
OKですね。
###3.フォルダ構成を確認する
![Screen Shot 2020-11-17 at 11.14.00 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183584/c439a9cd-840f-34ec-6ff8-0ccf4595701c.png)
####各ファイルの解説（ざっくり）
##### index.html
エントリポイント

```html:index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
  </body>
</html>
```
#####main.js
index.htmlの「id="app"」部分にAppコンポーネントのDOMツリーを出力しています。
<code>render: h => h(App)</code>って何だ？と思った方は<a>こちら。(作成中)</a>

```javascript:main.js
import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

``` 
#####App.vue
AppコンポーネンのDOMツリーは下記の部分。


```vuejs:App.vue(一部抜粋)
<template>
  <div id="app">
    <img alt="Vue logo" src="./assets/logo.png">
    <HelloWorld msg="Welcome to Your Vue.js App"/>
  </div>
</template>
``` 
Appコンポーネントのテンプレートから、Helloworldコンポーネントを呼び出しています。
#####HelloWorld.vue

```vuejs:HelloWorld.vue(一部抜粋)
<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <h3>Installed CLI Plugins</h3>
    <h3>Essential Links</h3>
    <h3>Ecosystem</h3>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  }
}
</script>
``` 
propsプロパティにmsgプロパティを定義することにより、
親コンポーネント（ここで言うAppコンポーネント）からmsgプロパティを使って、データを受け取る事が可能となります。
ここではmsgプロパティにはAppコンポーネント側で、<code>"Welcome to Your Vue.js App"</code>が設定されています。

#####デベロッパーツールで確認してみましょう。
index.htmlの「id="app"」の部分に、
AppコンポーネンとのDOMツリーが表示されていることを確認できると思います。

![Screen Shot 2020-11-17 at 11.50.42 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183584/1d848d8b-0e5f-8e55-0ab1-7551046ee876.png)

##簡単なアプリを作成してみる
###作りたいもの
2つリンクを用意した簡単なアプリです。（まずはこれくらい優しいのから。）
![Screen Shot 2020-11-17 at 12.49.09 PM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183584/2454996d-5859-b92c-db06-95eaf3279ed1.png)

###1.アプリ作成
①まずプロジェクト作成。
　<code>vue create linkapp</code>
②「Please pick a preset」と聞かれるので、デフォルトを選択。
③App.vueを編集します。

```vuejs:App.vue
<template>
  <div id="app">
  <h3>{{ title }}</h3>
  <ul>
  <li><a v-bind:href="url1">Vue</a></li>
  <li><a v-bind:href="url2">Vuetify</a></li>
  </ul>
  </div>
</template>

<script>
export default {
  data(){
    return{
      title: "Vue sites",
      url1: "https://vuejs.org/",
      url2: "https://vuetifyjs.com/"
    }
  }
}
</script>
``` 

###2.アプリ起動
コマンドでアプリを起動して、

```
 $ cd listapp
 $ npm run serve
``` 
<code>http:localhost:8080</code>にアクセス。
前述の画面が出力されると思います。

###少し解説
Vue.jsのコンポーネンとファイル（xxx.vue）の構成は下記の通りになっています。

```vuejs:xxx.vue
<template>
  <!-- テンプレート -->
</template>

<script>
  // ロジック
</script>

<style>
  /** スタイル **/
</style>
``` 
scriptをよく見てみましょう。

```vuejs:xxx.vue
<script>
export default {
  data(){
    return{
     // データ
    }
  },
  methods{
     // メソッド
  },
  ....
}
</script>

```

データの部分は下記の様にプロパティと値を記述します。

```vuejs:xxx.vue
  data(){
    return{
     プロパティ値 : 値,
　　　... 
    }
  },
```

listappのApp.vueをもう一度確認しましょう。
url1 プロパティ、url2プロパティに値を設定しています。

```vuejs:App.vue(ロジック部分)
<script>
export default {
  data(){
    return{
      title: "Vue sites",
      url1: "https://vuejs.org/",
      url2: "https://vuetifyjs.com/"
    }
  }
}
</script>
``` 
Vue.jsのテンプレートでは、<code>{{}}(マスタッシュ構文)</code>で保持したデータにアクセスできます。
単にテキストとして表示する場合には<code>{{}}</code>で良いですが、
hrefなどの属性に対して値を設定する場合は<code>{{}}</code>は使えないので、
<code>v-bindディレクティブ</code>を使用します。

```vuejs:v-bindディレクティブの表記方法
 v-bind: 属性="値"
 または
 : 属性="値"
```
<code>:</code>は<code>v-bind:</code>の省略形です。
もう一度、テンプレート部分を見てみましょう。

```vuejs:xxx.vue
<template>
  <div id="app">
  <h3>{{ title }}</h3>
  <ul>
  <li><a v-bind:href="url1">Vue</a></li>
  <li><a v-bind:href="url2">Vuetify</a></li>
  </ul>
  </div>
</template>
``` 
省略形だと、こう書けますね。

```vuejs
  <li><a :href="url1">Vue</a></li>
  <li><a :href="url2">Vuetify</a></li>

``` 

##まとめ
Vue.jsを使うための準備から簡単なアプリ作成まで、ざっくりと書いてみました。
いかがだったでしょうか。

p.s.今度はディレクティブについて理解を深められる様な記事を書きたいと思っています。
書いたら本記事にリンク貼ります。