jQueryおにいさんと始める Vue.js その1 〜初めましてVueさん〜

<h1>はじめに</h1>
どうも。jQueryおじさん改めjQuery<strong>おにいさん</strong>のなべっちです！
4月1日ということで新しいことを始めようと思います。
以前からずっと気になっていたVue.jsに重い腰を上げて入門します。

<h2>今回のシリーズの目的と方針（予定）</h2>
<ul>
 	<li>Vue.js + Firebaseで何か作って公開する</li>
 	<li>少しずつできる事を増やしながら<strong>やったことと感じた事を筆者目線で殴り書く←ここ重要</strong></li>
 	<li>つまり、筆者と同じ体験をすることになる</li>
 	<li>決して解説記事ではない</li>
 	<li>まあ解説になることもあるかもしれない</li>
 	<li>緩くてもいいじゃないか 人間だもの なべを</li>
</ul>

<h2>筆者の前知識</h2>
<ul>
 	<li>Vue.jsナウいらしい</li>
 	<li>jQuery古いらしい</li>
 	<li>Vue.js + Firebaseとかで簡単にアプリケーションローンチできるらしい</li>
 	<li>なんかすげえらしい</li>
</ul>

<h2>今回のお題は公式ガイドの「はじめに」</h2>
今回はVue.js公式サイトに沿ってちょろっと動かします。
日本語のガイドがあってよかったですw
https://jp.vuejs.org/

「はじめに」を全てやってみます。
https://jp.vuejs.org/v2/guide/index.html


jsfiddleが使えるって？
https://jsfiddle.net/boilerplate/vue/
あー凄いなこれ。今回は使いません。

<h1>早速Hello Vue!や！</h1>
[宣言的レンダリング](https://jp.vuejs.org/v2/guide/index.html#%E5%AE%A3%E8%A8%80%E7%9A%84%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0)


なるほどなるほど。VueではHTMLに<code>{{message}}</code>って感じに変数おいてJSで値作るんですね！
<code>{{message}}</code>みたいに<code>{{}}</code>で表すのを<strong>mustache構文</strong>って言うのか。
マスタッシュ！かっこええやん！（小並感）
mustacheって口ヒゲって言う意味なんだな......え？括弧がヒゲっぽいから？
深く考えるのはやめときましょう...とりあえずHTML書いて...
ってこれJSどこにかくんです？
とりあえず普通のJSっぽく書いてみようか。
ええい！ままよ！

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
	<title>ほげSP</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>

  <body>
  	<div id="app">
  	  {{message}}
  	</div>
  </body>
</html>


<script type="text/javascript">
  var app = new Vue({
    el: '#app',
    data: {
      message: 'Hello Vue!'
    }
  })
</script>
```

そんなわけ....

っていけるんかーい

<img width="598" alt="スクリーンショット 2018-04-01 15.49.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/86a39284-2ca1-3c1d-273b-8424dbf754b9.png">


とか一人で突っ込みながらHello Vue!は完了。

この時点でjQueryおにいさんセンセーショナルを感じる。

&nbsp;
<h2>ブラウザのコンソールで色々値をいじれる</h2>
<blockquote>これで初めての Vue アプリケーションが作成できました！一見するとただテンプレートを描画しているように見えますが、Vue.js は内部で多くの作業を行っています。データと DOM は関連付けられ、そして全てが<strong>リアクティブ</strong>になっています。どのようにしてそれが分かるのでしょうか？ブラウザの JavaScript コンソールを開いて、<code>app.message</code> の値を変えてみましょう。描画されたサンプルが、上記に応じて更新されるのが確認できるでしょう。</blockquote>
このコンソールってエラーのチェックくらいにしか使った事なかったけどこんなことできるの？
て言うか結局何ができるのさ。
わからん。わからんけどデバッグに使いそう。（適当）

<img width="614" alt="スクリーンショット 2018-04-01 16.07.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/b12a393c-afbf-56f9-635e-40e7b86b55f2.png">


&nbsp;
<h2>要素の属性にバインディングできる</h2>
<blockquote>文字列の展開に加えて、以下のように要素の属性を束縛（バインディング）することもできます</blockquote>
いや、束縛（バインディング）ってww

テキストだけではなくて要素にもバインディングできるのね

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
	<title>ほげSP</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>

  <body>
  	<div id="app-2">
  	  <span v-bind:title="message">
    	Hover your mouse over me for a few seconds
    	to see my dynamically bound title!
  	  </span>
	</div>
  </body>
</html>


<script type="text/javascript">
  var app2 = new Vue({
    el: '#app-2',
    data: {
      message: 'You loaded this page on ' + new Date().toLocaleString()
    }
  })
</script>
```

<img width="491" alt="スクリーンショット 2018-04-01 16.10.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/b72a1e5b-a216-58fc-d058-c09381f16484.png">


それよりtitleって属性つけたらこうなることを俺は知らんかったぞ？（無知）

<h1>色々な制御を試そう！</h1>
[条件分岐とループ](https://jp.vuejs.org/v2/guide/index.html#%E6%9D%A1%E4%BB%B6%E5%88%86%E5%B2%90%E3%81%A8%E3%83%AB%E3%83%BC%E3%83%97)

1つ1つ試すのめんどくさい！と言う事で一気にできそうなことやってしまえ！

とりあえず
<ul>
 	<li>表示/非表示</li>
 	<li>ループ</li>
 	<li>分岐</li>
 	<li>入力</li>
</ul>
ここら辺全部盛り込んでみよう。

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
	<title>ほげSP</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>

  <body>
    <div id="app">
	  <button v-on:click="changeSeen">Change Seen</button>
      <ol>
        <li v-if="seen" v-for="todo in todos">
          {{ todo.text }}
        </li>
      </ol>
      <input v-model="addText">
      <button v-on:click="addTodoText">Add Todo Text</button>
    </div>
  </body>
</html>


<script type="text/javascript">
  var app = new Vue({
    el: '#app',
    data: {
	  seen: true,
      todos: [
        { text: 'Learn JavaScript' },
        { text: 'Learn Vue' },
        { text: 'Build something awesome' }
      ]
    },
    methods: {
      changeSeen: function () {
        this.seen = !this.seen
      },
      addTodoText: function () {
      	app.todos.push({ text: this.addText })
      }
    }
  })
</script>
```

ええやんけ

<img class="alignnone size-full wp-image-452" src="http://nabesys.com/wp-content/uploads/2018/04/vueやってみ-2.gif" alt="" width="640" height="400" />


でもコンソール見るとエラーでてる...

<img width="1433" alt="スクリーンショット 2018-04-01 16.54.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/013a16c3-3855-216e-7453-26ed2b539902.png">


バインディングに使うinputの要素は一度data内で定義しないといけないみたいですねー

```html
<script type="text/javascript">
  var app = new Vue({
    el: '#app',
    data: {
      seen: true,
      todos: [
        { text: 'Learn JavaScript' },
        { text: 'Learn Vue' },
        { text: 'Build something awesome' }
      ],
      addText: '' // <- ここ
    },
    methods: {
      changeSeen: function () {
      this.seen = !this.seen
      },
      addTodoText: function () {
        app.todos.push({ text: this.addText })
      }
    }
  })
</script>
```

<h1>コンポーネント</h1>
[コンポーネントによる構成](https://jp.vuejs.org/v2/guide/index.html#%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AB%E3%82%88%E3%82%8B%E6%A7%8B%E6%88%90)

色々なところで使うであろう機能を部品化して使い回す。
実際にサービス作る上では欠かせない機能ですよね！

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
	<title>ほげSP</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>

  <body>
	<ol>
      <todo-item></todo-item>
    </ol>
  </body>
</html>


<script type="text/javascript">
  Vue.component('todo-item', {
	template: '<li>This is a todo</li>'
  })
</script>
```

こんな感じかなー...

<img width="584" alt="スクリーンショット 2018-04-01 17.42.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/140acf80-5918-2003-30a0-8c629a7c3d45.png">
ファ！？！？真っ白だー（＾q＾）

どうもコンポーネントを使えるエレメントを指定しないといけない模様。

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
	<title>ほげSP</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>

  <body>
  	<div id="app">
	  <ol>
        <todo-item></todo-item>
      </ol>
	</div>
  </body>
</html>


<script type="text/javascript">
  Vue.component('todo-item', {
	template: '<li>This is a todo</li>'
  })
  // ここ追加
  new Vue({
    el: '#app'
  })
</script>
```

<img width="548" alt="スクリーンショット 2018-04-01 17.46.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/6f39a05e-b1b7-8b6b-834f-b59fdc3bb0db.png">


でもこの指定のしかたはどうにも腑におちません...もう少し理解を深めたら納得できるのかな...

そしてもちろんコンポーネントの中身もバインディングできると

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
	<title>ほげSP</title>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>

  <body>
  	<div id="app">
	  <ol>
        <todo-item v-for="item in groceryList" v-bind:todo="item"></todo-item>
      </ol>
	</div>
  </body>
</html>


<script type="text/javascript">
  Vue.component('todo-item', {
    props: ['todo'],
    template: '<li id="li-{{ todo.id }}">{{ todo.text }}</li>'
  })

  var app = new Vue({
    el: '#app',
    data: {
      groceryList: [
        { id: 0, text: 'Vegetables' },
        { id: 1, text: 'Cheese' },
        { id: 2, text: 'Whatever else humans are supposed to eat' }
      ]
    }
  })
</script>
```

サンプルのgroceryListの定義にidがあるのに使ってなかったからなんとなく<code>li</code>のidに指定してみたんだけど...

<img width="529" alt="スクリーンショット 2018-04-01 18.01.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/700226a0-2773-f8d4-95e8-45d0d1cea33b.png">

お...おう。ここには使えないんすね。よくわからんけど今後明らかになるでしょう。

<h1>終わりに</h1>
初心者なので解説だとかそう言った観点で記事を書くのもどうかなーと思って書いてみましたがどうなんでしょうか？
Vue.jsに自信ニキからの激しいツッコミと応援待ってるぜ！！

ブログで見たい方はこちら
[Vue jQueryおにいさんと始める Vue.js その1](http://nabesys.com/article/2018/04/01434/)

次回はこちら
[jQueryおにいさんと始める Vue.js その2 〜vue-cliでプロジェクト作ってFirebaseで公開〜](https://qiita.com/ayies128/items/cf3bcb469342271d6e5e)