[vue.js ][Onsen UI]componentsの使い方になれていく(｡･ω･｡)ファイル分割

『componentsでの部品分割どのようにすればいいんだろう？』と言う方にオススメ記事となっています。

#ファイル階層写真
<img width="551" alt="スクリーンショット 2019-02-08 22.42.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/98841051-0de6-a896-8c5d-09b4f6214ae6.png">

#おことわり

以下の部分必要ないだろうと言う方いると思います。
これは私がかきたかったから書いています。
よろしくお願いします。

```.vue
<v-ons-toolbar>
  <div class="center">Title</div>
</v-ons-toolbar>
```

#code

```Sample.vue
<template>
<p>(｡･ω･｡)</p>
</template>
```

```App.vue
<template id="main-page">
  <v-ons-page>
    <v-ons-toolbar>
      <div class="center">Title</div>
    </v-ons-toolbar>
    <sample></sample>
  </v-ons-page>
</template>

<script>
import sample from './components/Sample.vue';

export default {
  components:{
    sample
  }
}
</script>
```

結果
<img width="246" alt="スクリーンショット 2019-02-08 22.45.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/c7f6470f-7b6b-e708-0dc8-50b38c1eb0d6.png">

少し説明
・使いたいcomponentsファイルの作成(Sample.vue)
・使いたいところで名前を指定してcomponentsの登録を行う

```.js
//sampleとしてimport
import sample from './components/Sample.vue';

//sampleを使います。ちなみにこれsampleがタグ名。
components:{
    sample
  }
```

・早速使ってみる！

```.vue
<sample></sample>
```


#もう少し凝ったものを1(リストで表示する)

```App.vue
<template id="main-page">
  <v-ons-page>
    <v-ons-toolbar>
      <div class="center">Title</div>
    </v-ons-toolbar>
    <ons-list>
      <ons-list-item v-for="item in items">
        <sample></sample>
      </ons-list-item>
    </ons-list>
  </v-ons-page>
</template>

<script>
import sample from './components/Sample.vue';

export default {
  components:{
    sample
  },
  data: function () {
    return {
      items: ["1", "2", "3"]
    }
  }

}
</script>
```

結果
<img width="256" alt="スクリーンショット 2019-02-08 22.56.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/ff17a835-1dc3-b61b-ff4d-dc55d01886d5.png">

少し説明

```
v-for="item in items"
```
ここがfor文のとこ。dataのitems: ["1", "2", "3"]をitemに渡しています。

#もう少し凝ったものを2(値を渡してリスト表示してみる)

```App.vue
<template id="main-page">
<v-ons-page>
  <v-ons-toolbar>
    <div class="center">Title</div>
  </v-ons-toolbar>
  <ons-list>
    <ons-list-item v-for="item in items">
      <sample v-bind:item="item"></sample>
    </ons-list-item>
  </ons-list>
</v-ons-page>
</template>

<script>
import sample from './components/Sample.vue';

export default {
  components: {
    sample
  },
  data: function() {
    return {
      items: ["1", "2", "3"]
    }
  }

}
</script>
```

```Sample.vue
<template>
<p>(｡･ω･｡){{item}}</p>
</template>

<script>
export default {
  props: ['item']
}
</script>
```

ちなみに、上記Sample.vueだとitemの型わからなくて『もやっ』とという方に！以下。
ちなみに、私は以下の書き方の方が好きです。

```Sample.vue
<template>
<p>(｡･ω･｡){{item}}</p>
</template>

<script>
export default {
  props: { item : String }
}
</script>
```

結果
<img width="245" alt="スクリーンショット 2019-02-08 23.14.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/782b3cdb-bd61-a4b3-e699-f52808606475.png">

#もう少し凝ったものを3(値をobjectで渡してその中から値を取得する)

```App.vue
<template>
<v-ons-page>
  <v-ons-toolbar>
    <div class="center">Title</div>
  </v-ons-toolbar>
  <ons-list>
    <ons-list-item v-for="item in items">
      <sample v-bind:item="item"></sample>
    </ons-list-item>
  </ons-list>
</v-ons-page>
</template>

<script>
import sample from './components/Sample.vue';

export default {
  components: {
    sample
  },
  data: function() {
    return {
      items: [{
          title: "朝の挨拶",
          description: "おはよう"
        },
        {
          title: "昼の挨拶",
          description: "こんにちは"
        },
        {
          title: "夕の挨拶",
          description: "こんばんは"
        }
      ]
    }
  }
}
</script>

```

```Sample.vue
<template>
<div>
  <p>{{item['title']}}</p>
  <p>(｡･ω･｡){{item['description']}}</p>
</div>
</template>

<script>
export default {
  props: {
    item: Object
  }
}
</script>
```

ちなみにSample.vueの中を<div>で囲っているのはエラーにならないようにです。
何かしらルートの部品が欲しいらしく

```.vue
<p>sample1</p>
<p>sample2</p>
```

の書き方はできないらしい。なのでこれを以下のように囲んだ形にしないといけないみたいです。

```.vue
<div>
  <p>sample1</p>
  <p>sample2</p>
</div>
```

とか

```.vue
<h1>
  <p>sample1</p>
  <p>sample2</p>
</h1>
```


写真
<img width="257" alt="スクリーンショット 2019-04-01 23.52.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/d3a1f760-2fc2-2ad5-4969-6af9c3a46ef0.png">

#もう少し凝ったものを4(componentsでもらった値の変更。gif参考)
![テキスト入力SampleMove.gif](https://qiita-image-store.s3.amazonaws.com/0/133940/99d666d1-11b2-580d-3f93-c56c43aa6e50.gif)

```App.vue
<template>
<v-ons-page>
  <v-ons-toolbar>
    <div class="center">Title</div>
  </v-ons-toolbar>
  <ons-list>
    <ons-list-item v-for="item in items">
      <sample v-bind:item="item"></sample>
    </ons-list-item>
  </ons-list>
  <p>{{items}}</p>
</v-ons-page>
</template>

<script>
import sample from './components/Sample.vue';

export default {
  components: {
    sample
  },
  data: function() {
    return {
      items: [{
          title: "朝の挨拶",
          description: "おはよう"
        },
        {
          title: "昼の挨拶",
          description: "こんにちは"
        },
        {
          title: "夕の挨拶",
          description: "こんばんは"
        }
      ]
    }
  }
}
</script>

```


```Sample.vue
<template>
<div>
  <p>{{item['title']}}</p>
  <v-ons-input type="text" placeholder="テキスト入力" v-model="item['description']"></v-ons-input>
  <p>(｡･ω･｡){{item['description']}}</p>
  <v-ons-button @click="textChange"　style="margin: 6px 0">Normal</v-ons-button>
</div>
</template>

<script>
export default {
  props: {
    item: Object
  },
  methods:{
    textChange(){
      this.item['description'] = 'memo';
    }
  }
}
</script>
```
<img width="267" alt="スクリーンショット 2019-04-02 1.44.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/f1226a9d-20ba-8667-c275-fdf4f2a5436c.png">




#最後に
上記やり方があるだけで随分とコードも減るのではないでしょうか？(｡･ω･｡)
色々な記事見たりしたけど、やはり試行錯誤したり、公式見たりした方がわかったりしたきもしましたが、どっちかと言うと色々やってみての感じで少しずつ分かっていく感じでした。読解力なさすぎ私。いっぱいやればやるだけ正解に近く！えいえいお〜！！

全体のcode(少しずつ中身変えていく予定なのであくまで参考です)
https://github.com/sachiko-kame/onsenUISamplewithVue

#参考
この辺りかな。きっと他のところにもヒントはあると思っています。
https://jp.vuejs.org/v2/guide/components-props.html
https://jp.vuejs.org/v2/guide/list.html