Vue.jsをシンプルに理解しよう その２

#その２
次がありました、へへへ
[Vue.jsをシンプルに理解しよう](https://qiita.com/yusuke_ten/items/21f97fe961d0070af418)
前回書いた記事のリンクを貼っておきます。
今回は公式が
>コンポーネントは Vue.js の最も強力な機能の 1 つです。

とか言ってるコンポーネントについての話です。

#その前に
Vueインスタンス内のelというオプションについて確認しておきましょう。
elというオプションが指定した要素がVue.jsが作用を及ぼす範囲になります。elはelementの略です。
下の図を見てみましょう。

![Vue_-_JSFiddle.png](https://qiita-image-store.s3.amazonaws.com/0/251548/a58011f8-79d0-2596-f69d-0f0b65e9edb2.png)

id="app2"内の要素についてはVue.jsが作用していないことがわかります
[jsfiddleで確認してください]
(https://jsfiddle.net/yusuke_ten/vz2tbydd/)

Vue.jsはターゲットにした要素の内側でしか作用しません。
当たり前だよなぁ？

#コンポーネント
本題です。
すごく簡単に言いますと、コンポーネントとはhtmlの部品を出したり消したりするするための機能です。
とは言っても、なかなか想像できないと思いますので下の図を見てください。

![Vue_-_JSFiddle1.png](https://qiita-image-store.s3.amazonaws.com/0/251548/536cfac9-fd9f-a324-67b8-a48277e222ca.png)



[jsfiddleで確認してください。](https://jsfiddle.net/yusuke_ten/8pjke1t5/)

##ダメなコンポーネントの書き方
さきほどelというオプションについて説明したので、合わせてダメなコンポーネントの書き方を見てみましょう。

![Vue_-_JSFiddle2.png](https://qiita-image-store.s3.amazonaws.com/0/251548/ee0f91a1-40df-833b-9181-610921048dd7.png)

上の図はさきほど説明した通りVue.jsはターゲットにした要素の内側でしか作用しません。
なのでコンポーネントは作成されません。

![Vue_-_JSFiddle3.png](https://qiita-image-store.s3.amazonaws.com/0/251548/c262320f-4ed9-1060-8778-61f4785700ea.png)

上の図ではVueインスタンスを作成しないままVueのコンポーネントを使用しようとしていますが、これもダメです。
Vueインスタンスの外部にコンポーネントを書いているのでいける気がしますが無理です。（そもそもインスタンスがないからcomponentメソッドを呼べない）

当たり前だよなぁ？（僕は普通にダメな書き方で書きました）

#componentの特徴
componentの特徴を以下の図にまとめました。
注釈が多すぎて見にくくなっていますが我慢してください、おなしゃす！

<img width="871" alt="Vue_-_JSFiddle2.png" src="https://qiita-image-store.s3.amazonaws.com/0/251548/56a1295b-f4af-ac6f-f536-7b018b56377c.png">


[jsfiddleで確認してください。](https://jsfiddle.net/yusuke_ten/a3ugb3jb/)
コンポーネント、便利すぎるぜ...

##注意点
コンポーネント内でdataオプションを使う場合は必ず以下のように記述しないといけません

```javascript
data: function () {
    return {
      /* コンポーネント内で使いたいオブジェクト */

    }
  },
```


#コンポーネントはややこしい
コンポーネントは色々な書き方があります、非常に紛らわしいので「おれはこれで書くぜ！」と決めてしまうのもいいでしょう。

###グローバルコンポーネント
グローバルコンポーネントはコンポーネントの作用する範囲が全てのVueインスタンスに及びます。
下の図を見てください。

<img width="882" alt="Vue_-_JSFiddle3.png" src="https://qiita-image-store.s3.amazonaws.com/0/251548/64a109a2-9754-4b94-f45f-eda47061e276.png">

[jsfiddleで確認してください。](https://jsfiddle.net/yusuke_ten/q76ypt9m/)


###ローカルコンポーネント
ローカルコンポーネントでは、コンポーネントの作用する範囲が呼び出したVueインスタンス内のみになります。

<img width="889" alt="Vue_-_JSFiddle4.png" src="https://qiita-image-store.s3.amazonaws.com/0/251548/71110bf0-2fc6-2524-eeab-aa079f3aab37.png">

矢印と文字を使いすぎてよくわからなくなっていると思うので、
[jsfiddleで確認してください。](https://jsfiddle.net/yusuke_ten/vs8k4r2e/)

###x-templateを使う
x-templateなるものを使えばjsに書かなくてもhtmlにテンプレートを書けたりします。

<img width="912" alt="Vue_-_JSFiddle5.png" src="https://qiita-image-store.s3.amazonaws.com/0/251548/298d10c9-e3c5-c7b8-1f47-3c3f8250a60c.png">

[jsfiddleで確認してください。](https://jsfiddle.net/yusuke_ten/ttLm1ydm/)

###.vueという拡張子の外部ファイルに記述する
この記法についてはjsfiddleで確認する方法がわからなかったので飛ばしました、許してくださいオナシャス！

```html:読み込まれる側(external_resource.vue)
<template>
  <div>うっすお願いしまーす</div>
</template>
```

```javascript:読み込む側
import component from '.external_resource.vue'

export default { 
  components: { 
    component
  }, 
```

外部に記述したテンプレートの内容をimportして読み込みます。
この記述の仕方については調査不足です！センセンシャル！

#おわり
今回はかなりややこしかったですねお疲れ様でした。
コンポーネントをふわふわっとわかってもらえてでしょうか？
Vue.jsは基本的なディレクティブ(v-onとかv-forとか)とコンポーネントの書き方さえ分かれば入門終了だと思います。
次はさらにややこしいVue初心者最大の難関（だと勝手に思っている）propsとemitを使ったVueインスタンスとコンポーネント間の変数のやりとりについて書ければと思っています(次があれば)