【Vue.js】v-modelの修飾子の種類とその使いどころ

## はじめに
仕事で使う事になったので1からVue.jsについて学んだ。
ちゃんと覚えておかないとまずそうな事を備忘録として1つ1つ残しておく。

## v-modelの修飾子の種類とその使いどころ
`v-model`にはいくつか便利な修飾子があるが、その使いどころも含めて整理する。

## 何も修飾子がない場合
以下の動画のように即時に入力内容が反映される（双方向データバインディングになる）。
![ezgif.com-gif-maker (11).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/1b760d26-8106-f9ab-a00c-4fb7921f6e44.gif)
動画のソースコードは以下。

```vue.App.vue
<template>
  <div class="container-sm">
    <!-- 省略 -->
    <div>
      <h2>イベントのフォーム</h2>
      <div class="mb-3">
        <label for="title" class="form-label">タイトル</label>
        <input
          type="text"
          class="form-control"
          id="title"
          v-model="eventData.title"
        />
        <p>{{ eventData.title }}</p>
      </div>
    </div>
  </div>
</template>
```

ソースコード全体は以下。

https://github.com/yuta-katayama-23/intro-vuecli/tree/493df688101710188aebf745a46d52ce5a4d3ac1

## .lazy修飾子
### どうなるのか？
DOMイベントのchangeが発火した時にmodel（v-modelで指定したデータ）に内容が反映されるようになる。
![ezgif.com-gif-maker (12).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/9a7b5a39-5fee-852e-1369-5c16d8a5ad74.gif)
動画のソースコードは以下。

```vue.App.vue
<template>
  <div class="container-sm">
    <!-- 省略 -->
    <div>
      <h2>イベントのフォーム</h2>
      <div class="mb-3">
        <label for="title" class="form-label">タイトル</label>
        <input
          type="text"
          class="form-control"
          id="title"
          v-model.lazy="eventData.title"
        />
        <p>{{ eventData.title }}</p>
      </div>
    </div>
  </div>
</template>

<script>
// 省略
export default {
  data() {
    return {
      // 省略
      eventData: {
        title: "タイトル",
      },
    };
  },
  // 省略
```

ソースコード全体は以下。

https://github.com/yuta-katayama-23/intro-vuecli/tree/e04d5308bf005ccb4811e19cab135e588c43f167

※ちなみに、DOMイベントのchangeは、

- <input>タグで入力してフォーカスを外した時
- <input>タグで入力してEnterキーを押下した時

といった時に発火する。

### 使いどころ
バリデーションなどで入力時に逐一走らせるよりは入力後に走らせたい時など。
その場合にこの`.lazy`を使う事で、DOMイベントのchangeが発火してmodleが反映されたらバリデーションを走らせるといった事ができるようになる。

## .number修飾子
### どうなるのか？
基本的に`<input type="number">`と指定したとしても以下のように`typeof`を出力するとstringになってしまうが、
`.number`修飾子をv-modelに付与するとnumberとして扱うようにできる。
![ezgif.com-gif-maker (14).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/5da9fd58-750f-4ac2-a511-649b1886bc9b.gif)
動画のソースコードは以下。

```vue.App.vue
<template>
  <div class="container-sm">
    <!-- 省略 -->
    <div>
      <h2>イベントのフォーム</h2>
      <div class="mb-3">
        <label for="maxNumber" class="form-label">最大人数</label>
        <input
          type="number"
          class="form-control"
          id="maxNumber"
          v-model.number="eventData.maxNumber"
        />
        <p>{{ typeof eventData.maxNumber }}</p>
      </div>
    </div>
  </div>
</template>

<script>
// 省略
export default {
  data() {
    return {
      // 省略
      eventData: {
        title: "タイトル",
        maxNumber: 0,
      },
    };
  },
  // 省略
```

ソースコード全体は以下。

https://github.com/yuta-katayama-23/intro-vuecli/tree/453aa55582b1c2b9abdbbc5b1c31b84b88b5115d

### 使いどころ
v-modelでデータバインディングしている変数の型を厳格に`number`にしたい時など。

## .trim修飾子
### どうなるのか？
先頭・最後尾の空白を削除してv-modelの変数にデータバインディングしてくれる。
![ezgif.com-gif-maker (15).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/50ac0f12-eb54-a8b4-00b7-183a88b57382.gif)
動画のソースコードは以下。

```vue:App.vue
<template>
  <div class="container-sm">
    <!-- 省略 -->
    <div>
      <h2>イベントのフォーム</h2>
      <div class="mb-3">
        <label for="host" class="form-label">主催者</label>
        <input
          type="text"
          class="form-control"
          id="host"
          v-model.trim="eventData.host"
        />
        <pre>{{ eventData.host }}</pre>
      </div>
    </div>
  </div>
</template>

<script>
// 省略
export default {
  data() {
    return {
      // 省略
      eventData: {
        host: "",
      },
    };
  },
  // 省略
```

ソースコード全体は以下。

https://github.com/yuta-katayama-23/intro-vuecli/tree/e2a945b4b1180163d9217d203dc2c1adeaf02888

### 使いどころ
先頭・最後尾の空白を削除してv-modelの変数にデータバインディングしたい時など。

## Vue.jsの勉強メモ一覧記事へのリンク
Vue.jsについて勉強した際に書いた勉強メモ記事のリンクを集約した記事。

- https://qiita.com/yuta-katayama-23/items/dabefb59d16a83f1a1d4