1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

はじめに

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

v-modelの修飾子の種類とその使いどころ

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

何も修飾子がない場合

以下の動画のように即時に入力内容が反映される(双方向データバインディングになる)。
ezgif.com-gif-maker (11).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>

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

.lazy修飾子

どうなるのか?

DOMイベントのchangeが発火した時にmodel(v-modelで指定したデータ)に内容が反映されるようになる。
ezgif.com-gif-maker (12).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: "タイトル",
      },
    };
  },
  // 省略

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

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

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

といった時に発火する。

使いどころ

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

.number修飾子

どうなるのか?

基本的に<input type="number">と指定したとしても以下のようにtypeofを出力するとstringになってしまうが、
.number修飾子をv-modelに付与するとnumberとして扱うようにできる。
ezgif.com-gif-maker (14).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,
      },
    };
  },
  // 省略

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

使いどころ

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

.trim修飾子

どうなるのか?

先頭・最後尾の空白を削除してv-modelの変数にデータバインディングしてくれる。
ezgif.com-gif-maker (15).gif
動画のソースコードは以下。

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: "",
      },
    };
  },
  // 省略

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

使いどころ

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

Vue.jsの勉強メモ一覧記事へのリンク

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?