（４）Vue によるリアクティブプログラミング　その２

「（３）Vueによるリアクティブプログラミング　その１」の続きです。```v-for```や```method```で実際のアプリケーションで使う処理を追加してみます。
例として、入力フィールドに入力された文字列を画面上にリスト表示するようなプログラムを作ってみます。


#参考ドキュメント

- [Vueドキュメント](https://jp.vuejs.org/index.html)
- [Vuetifyガイド](https://vuetifyjs.com/en/)

#"v-for"でループ

配列をループで回してリスト表示するには、```v-for```というキーワードを使います。
Vueのドキュメント（[リストレンダリング](https://jp.vuejs.org/v2/guide/list.html)）を参考にして、プロジェクトは、[「（３）VueによるReactiveプログラミング　その１」](https://qiita.com/kztmy/items/5eab4e65b6ff0cec290e)で使った"react01"を変更します。
最初に、配列に固定の文字列を入れて、その配列を```v-for```を使って表示してみます。

"HelloWorld.vue"のファイルを以下のように変更します。
```<v-list>...</v-list>```の部分と、```<script>...</script>```の、```data```を変更しています。

```vue
<template>
  <v-container>
    <v-list>
      <v-list-item v-for="item in messageList" :key="item.message" link>
        <v-list-item-title>{{ item.message }}</v-list-item-title>
      </v-list-item>
    </v-list>
    <v-text-field 
      label="Input your message here."
      prepend-icon="mdi-message-text-outline"
      v-model="inputMessage" />
  </v-container>
</template>

<script>
export default {
  name: "HelloWorld",
  data: function () {
    return {
      messageList: [
        {message: 'message 1'},
        {message: 'message 2'},
        {message: 'message 3'}
      ],

    }
  }
};
</script>
```

Visual Studio Codeの画面で見るとこんな感じです。

![v-list-vscode2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69430/83e119ca-2b19-1573-47fa-4162a8260695.png)


Visual Studio CodeのTerminal で、```> npm run serve```を実行して、ローカルにサーバを起動したら、デバッグのアイコンをクリックして、Launch Chrome...の緑色の三角アイコンをクリックします。そうすると、以下のような画面が表示されるはずです。

![v-list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69430/a4a85de3-3729-f6cf-6902-a506e305a64d.png)

ここでは、まず、```todoList```という配列に、messageのキーを持った連想配列を３個、初期値として格納しています。それを、```<v-list-item>```の```v-for="item in todoList"```で```item```という変数に順番に読み出して、```{{item.message}}```で画面に表示しています。
ここで、```:key```は必ずしも必要ではないですが、Vueのプログラムでは付加することを推奨されています。通常はDB上のキー項目（例えばドキュメントIDのようなユニークなキー）を使うと思いますが、ここでは簡略に、messageそのものをキーとして指定しています。

```:key``` は```v-bind:key``` のVueで用意されている省略記法です。詳しくは、Vueのマニュアル、[v-bindの省略記法](https://jp.vuejs.org/v2/guide/syntax.html#v-bind-%E7%9C%81%E7%95%A5%E8%A8%98%E6%B3%95)を参照してください。

#ボタンを押したときの処理を追加

次に、入力フィールドに文字列を入れて、ボタンを押すと今のmessageが追加されるようにしてみます。
ボタンを押したときの処理を行う関数を、```methods:```という名前で、登録します。
先ほどと同様、HelloWorld.vueを以下のように修正します。

```vue
<template>
  <v-container>
    <v-list>
      <v-list-item v-for="item in messageList" :key="item.message" link>
        <v-list-item-title>{{ item.message }}</v-list-item-title>
      </v-list-item>
    </v-list>
    <v-text-field 
      label="Input your message here."
      prepend-icon="mdi-message-text-outline"
      v-model="inputMessage" />
    <v-btn v-on:click="addMessage">Add</v-btn>
  </v-container>
</template>

<script>
export default {
  name: "HelloWorld",
  data: function () {
    return {
      messageList: [],
      inputMessage: ''
    }
  },
  methods: {
    addMessage: function() {
      this.messageList.push({message: this.inputMessage});
    }
  }
};
</script>
```

これでデバッガからブラウザを起動すると以下のように表示され、入力フィールドに文字列を入れて、Addボタンを押すと、上部に入力したメッセージが表示されます。

![v-list-action.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69430/d560c816-181c-efc2-44a9-3e3408203888.png)

ここでの動作は以下のようになっています。

1. 入力フィールドに入力された文字列は、```v-model```によって、変数```inputMessage```に格納（双方向バインド）されます。
2. ```<v-btn>```がクリックされると、```v-on:click```で指定された関数```addMessage```が呼び出されます。
3. ```messageList```に入力テキストを、messageのキーが付いた連想配列```{message: this.inputMessage}```を追加します。ここで、```data```で宣言した変数を参照するには、```this```をつける必要があることに注意してください。
4. あとは、最初に確認した通り、```<v-list-item>```を、```v-for```で繰り返して```messageList```から要素を順番に取り出して、表示しています。

ここで、3.の配列の関数pushが、Vueが変化したことを検知できる関数なので、messageListが変化したことがVueに伝わり、表示も自動的に変更されることになります。Vueが配列の変化を検知できる関数はドキュメント「[配列の変化を検出](https://jp.vuejs.org/v2/guide/list.html#%E9%85%8D%E5%88%97%E3%81%AE%E5%A4%89%E5%8C%96%E3%82%92%E6%A4%9C%E5%87%BA)」にあるものに限られています。

#まとめ

この記事では、Vueの機能を使って、変数のバインド、ループの処理、ボタンを押したときの処理の追加方法を見てみました。