データと入力を同期する
双方向のデータバインド
フォーム入力バインディングは、コンポーネントが持つデータとユーザーがフォームコントロールから入力する内容を双方にバインドする機能です。
フォーム入力バインディングは、コンポーネントが持つデータとユーザーがフォームコントロールから入力する内容を双方にバインドする機能です。
<要素名 v-model="プロパティ名">
v-modelを使ったフォームコントロールの初期値
・value属性、checked属性、selected属性を指定しても無視される
・初期値はコンポーネント側で設定しなければならない
v-modelを使ったフォームコントロールの初期値
・value属性、checked属性、selected属性を指定しても無視される
・初期値はコンポーネント側で設定しなければならない
テキストボックス(改行できない入力欄)
<input type="text" v-model="プロパティ名">
※日本語入力をリアルタイムに反映するには、inputイベントハンドラを利用する。
※日本語入力をリアルタイムに反映するには、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">
<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>
<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;
}
}
});
レンジ入力とカラー選択
フォームコントロールの同期
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という名前で定義しウォッチャで監視している。
・type="range"のスライダーでは0から255迄の範囲の数値を入力使用ですがHTMLの仕様上でinput要素からの入力値は文字列型のため、.number飾飾子をつけて数値型へ変換が必要。
・カラーパレットとスライダーのどちらか変更したときにもう一方の値を更新するため、ウォッチャを使ってデータの監視を行う。
・red,green,blueのプロパティに対して配列に詰め込んで返す算出プロパティをcolorElementという名前で定義しウォッチャで監視している。
制御をサポートする3つの修飾子
v-model.lazy | 入力値が変わるとすぐに同期する |
---|---|
v-model.number | 入力値を自動で数値型に変換する |
v-model.trim | 余分なスペースを取り除く |