フォーム入力バインディング

vue.jsフレームワーク

  1. HOME
  2. フォームバインド

データと入力を同期する

双方向のデータバインド
フォーム入力バインディングは、コンポーネントが持つデータとユーザーがフォームコントロールから入力する内容を双方にバインドする機能です。
<要素名 v-model="プロパティ名">

v-modelを使ったフォームコントロールの初期値
・value属性、checked属性、selected属性を指定しても無視される
・初期値はコンポーネント側で設定しなければならない
テキストボックス(改行できない入力欄)
<input type="text" v-model="プロパティ名">
※日本語入力をリアルタイムに反映するには、inputイベントハンドラを利用する。
テキストエリア(改行できる入力欄)
<textarea v-model="プロパティ名"></textarea>
チェックボックス
<input type="checkbox" v-model="プロパティ名">

v-modelでバインドしたプロパティには真偽値が設定されます。
そこで、true-valueとfaise-valueを使うと、真偽値の代わりに任意の文字列をバインドできます。

複数のチェックボックス
<input type="checkbox" v-model="プロパティ名" value="値1">
<input type="checkbox" v-model="プロパティ名" value="値2">
<input type="checkbox" v-model="プロパティ名" value="値3">

複数のチェックボックスはグループ化する必要があり、グループに対して1つのプロパティをバインドします。

・単体のチェックボックスは真偽値(trueまたはfalse)
・複数のチェックボックスは文字列型の配列

グループ化したチェックボックスにバインドする

休日の過ごし方:{{selection}}

HTML

<div id="app">
<p>休日の過ごし方:{{selection}}</p>
<label>
  <input type="checkbox" v-model="answer" value="読書">読書
</label>
<label>
  <input type="checkbox" v-model="answer" value="ボルダリング">ボルダリング
</label>
<label>
  <input type="checkbox" v-model="answer" value="キャンプ">キャンプ
</label>
</div>

JavaScript

var app = new Vue({
  el: '#app',
  data: {
    answer: []
  },
  computed: {
    //チェック内容を連結した文字列を返す算出プロパティ
    selection: function () {
      return this.answer.join();
    }
  }
});
セレクトボックス(プルダウン方式)
単一選択の場合
<select v-model='プロパティ名'>
 <option value="値1">選択肢1</option>
 <option value="値2">選択肢2</option>
 <option value="値3">選択肢3</option>
</select>

セレクトボックスにmultiple属性をつけると複数選択可能になるがあまり使われない。単一選択と複数選択でデータの扱いが少し異なる。

カレンダー(日付の選択)

カレンダーにバインド(翌日以降の指定)

ご希望日:{{request_date}}

HTMLの使用上type="date"のinput要素に設定できる初期値はYYYY-MM-DD形式の文字列でないといけません。そのため、createdライフサイクルハックを使いコンポーネントがDOMに結びつく前にプロパティに初期値設定しています。min属性に最小値設定するとそれ以前の日付は選択できなくなります。

HTML

<div id="app2">
<p>ご希望日:{{request_date}}</p>
<input type="date" v-model="request_date" v-bind:min="min_date">
</div>

JavaScript

var app2 = new Vue({
  el: '#app2',
  data: {
    request_date: null,
    min_date: null
  },
  created: function() {
    //初期値設定を翌日へ
    var dt = new Date();
    dt.setDate(dt.getDate() + 1);
    this.request_date = this.formatDate(dt);
    //翌日の日付を最小値へ
    this.min_date = this.request_date;
  },
  methods: {
    //日付をYYYY-MM-DDに整形するメソッド
    formatDate: function(dt) {
      var y = dt.getFullYear();
      var m = ('00' + (dt.getMonth() + 1)).slice(-2);
      var d = ('00' + dt.getDate()).slice(-2);
      var result = y + '-' + m + '-' + d;
      return result;
    }
  }
});
レンジ入力とカラー選択

フォームコントロールの同期

色の選択 {{color}}
赤:{{red}}
緑:{{green}}
青:{{blue}}

HTML

<div id="app3">
<fieldset>
  <legend>色の選択</legend>
  <input type="color" v-model="color">{{color}}<br>
  赤:<input type="range" v-model.number="red" min="0" max="255">{{red}}<br>
  緑:<input type="range" v-model.number="green" min="0" max="255">{{green}}<br>
  青:<input type="range" v-model.number="blue" min="0" max="255">{{blue}}<br>
</fieldset>
</div>

JavaScript

var app3 = new Vue({
  el: '#app3',
  data: {
    color: '#000000',
    red: 0,
    blue: 0,
    green: 0
  },
  computed: {
    //赤・緑・青を配列で返す算出プロパティ
    colorElement: function() {
      return [this.red, this.green, this.blue];
    }
  },
  watch: {
    //赤・緑・青のいずれかの変更を監視する
    colorElement: function(newRGB, oldRGB) {
      //赤・緑・青を2桁の16進数表記に変換する
      var r = ('00' + newRGB[0].toString(16).toUpperCase()).slice(-2);
      var g = ('00' + newRGB[1].toString(16).toUpperCase()).slice(-2);
      var b = ('00' + newRGB[2].toString(16).toUpperCase()).slice(-2);
      //#RRGGBB形式の文字列で更新する
      this.color = '#' + r + g + b;
    },
    //カラーパレットの選択変更を監視する
    color: function(newColor, oldColor) {
      this.red = parseInt(newColor, substr(1, 2), 16);
      this.green = parseInt(newColor, substr(3, 2), 16);
      this.blue = parseInt(newColor, substr(5, 2), 16);
    }
  }
});
point!
・type="range"のスライダーでは0から255迄の範囲の数値を入力使用ですがHTMLの仕様上でinput要素からの入力値は文字列型のため、.number飾飾子をつけて数値型へ変換が必要。

・カラーパレットとスライダーのどちらか変更したときにもう一方の値を更新するため、ウォッチャを使ってデータの監視を行う。

・red,green,blueのプロパティに対して配列に詰め込んで返す算出プロパティをcolorElementという名前で定義しウォッチャで監視している。

制御をサポートする3つの修飾子

v-model.lazy 入力値が変わるとすぐに同期する
v-model.number 入力値を自動で数値型に変換する
v-model.trim 余分なスペースを取り除く