ランニングコスト0の書籍管理webアプリ！　Vueってどんなもの？

# ランニングコスト0の書籍管理webアプリを開発！　Vueってどんなもの？

※こちらの記事の内容は2022/3/27に執筆したものです。

## 初めに

この記事は、[以下の元記事](https://qiita.com/keisuke_suzuki_engineer/items/3be494864dffb3b5543b)で紹介しているアプリを構築する際に使ったGASの機能について紹介している記事です。元記事からご覧ください。

https://qiita.com/keisuke_suzuki_engineer/items/3be494864dffb3b5543b

## Vueってなに？

Vueとはjava scriptのフレームワークで、クライアントサイドでレンダリングをするテンプレートエンジンとして使うことができます。特にjsの変数の値を変えた後に、HTMLに反映させる処理が自動化されているのが気に入っていてよく使います！


なおこちらの記事は初めにで紹介している記事を読みやすくするためのものなので、しっかり理解したい方はこちらの公式リファレンスをご覧ください。

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

## Vueの書き方

### 最小構成

まずはこれでVueの動きを確認しましょう。このように実装すると、jsの変数textの中身がHTMLに表示されるはずです。(次以降は、HTMLはbodyの中身だけ掲載します。)

```js:index.js
const app = new Vue({
	el: '#app',
	data: {
		text:"ww"
	}
});
```
```html:index.html
<html>
<head>
	<meta charset="utf-8"/>
</head>
<body>
<div id="app">
	{{text}}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script type="text/javascript" src="index.js"></script>
</body>
</html>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601154/7c335498-517d-144a-4c9d-c782cb306da8.png)




もちろん変数textの中身を変えれば表示も変わります。

```js:index.js
const app = new Vue({
	el: '#app',
	data: {
		text:"(/・ω・)/にゃー!"
	}
});
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601154/aaf60548-3631-a1af-b715-00ea5f313cd2.png)

### 使える値
オブジェクトでもなんでも使えます。
例えばdict型やlist型もこんな感じに使えます

```js:index.js

const app = new Vue({
	el: '#app',
	data: {
		text:"ww",
		dictObj:{
			'varInt':100,
			'varStr':"100",
		},
		listObj:[
			'a',
			'b',
			'c',
		]
	}
});
```
```html:index.html
<div id="app">
	<div>{{text}}</div>
	<div>{{dictObj.varInt}}</div>
	<div>{{dictObj.varStr}}</div>
	<div>{{listObj[0]}}</div>
	<div>{{listObj[1]}}</div>
	<div>{{listObj[2]}}</div>
</div>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601154/2b658f61-1e72-878d-46cd-ce68fdd9e8cf.png)

### ifやfor
htmlの要素をifで表示を切り替えたり、forで繰り返し表示したりすることができます。その場合jsの値をifの判定に使ったりforで繰り返す要素として使います。

```js:index.js
const app = new Vue({
	el: '#app',
	data: {
		text:"ww",
		dictObj:{
			'varInt':100,
			'varStr':"100",
		},
		listObj:[
			'a',
			'b',
			'c',
		]
	}
});
```
```html:index.html
<div id="app">
	<div v-if="text=='ww'">aaaa</div>
	<div v-if="text=='aa'">bbbb</div>
	<div v-for="key in Object.keys(dictObj)">
		<span>{{key}}:{{dictObj[key]+1}}</span>
	</div>
	<div v-for="val in listObj">{{val}}</div>
</div>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601154/8b1b1238-9ffe-89d6-407e-fd528e018db8.png)


### コンポーネント
コンポーネントとは、ざっくりいうと部品という意味です。HTMLの要素を部品化して、繰り返し使えるようにする仕組みです。
```js:index.js
Vue.component('sample-component', {
	template:"<div>hello</div>"
});
	
const app = new Vue({
	el: '#app',
	data: {
		text:"ww",
		dictObj:{
			'varInt':100,
			'varStr':"100",
		},
		listObj:[
			'a',
			'b',
			'c',
		]
	}
});
```
```html:index.html
<div id="app">
	<div v-if="text=='ww'">aaaa</div>
	<div v-if="text=='aa'">bbbb</div>
	<div v-for="key in Object.keys(dictObj)">
		<span style="border:solid 1px gray">{{key}}:{{dictObj[key]+1}}</span>
    </div>
	<div v-for="val in listObj">{{val}}</div>
	<sample-component></sample-component>
	<sample-component></sample-component>
</div>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601154/8f9d2d73-19ac-7509-0764-3e33aa88c309.png)

コンポーネントを変えれば、それを使っている個所すべてが変わります！

```js:index.js
Vue.component('sample-component', {
	template:"<div>hello world</div>"
});
	
const app = new Vue({
	el: '#app',
	data: {
		text:"ww",
		dictObj:{
			'varInt':100,
			'varStr':"100",
		},
		listObj:[
			'a',
			'b',
			'c',
		]
	}
});
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601154/96d46a40-9d8e-d459-21fc-5e961d56afd6.png)

### コンポーネントの引数
コンポーネントには、値や処理を引き渡すことができます。
```js:index.js
Vue.component('sample-component', {
	props:['name'],
	template:"<div>hello {{name}}</div>"
});
	
const app = new Vue({
	el: '#app',
	data: {
		text:"ww",
		dictObj:{
			'varInt':100,
			'varStr':"100",
		},
		listObj:[
			'a',
			'b',
			'c',
		]
	}
});
```
```html:index.html
<div id="app">
	<div v-if="text=='ww'">aaaa</div>
	<div v-if="text=='aa'">bbbb</div>
	<div v-for="key in Object.keys(dictObj)">
		<span style="border:solid 1px gray">{{key}}:{{dictObj[key]+1}}</span>
    </div>
	<div v-for="val in listObj">{{val}}</div>
	<sample-component
		v-bind:name="'aaa'"
		></sample-component>
	<sample-component
		v-bind:name="'bbb'"
		></sample-component>
</div>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601154/93a53b90-a346-e2a6-c770-c1fed1770cf2.png)


ほかにもいろいろありますが、これ以上は難しくなるので本家のページに説明を譲ることとします！

以上にVueついての簡単なあれこれでした！