v-modelとは
v-modelは、Vue.js が提供する双方向データバインディングディレクティブです。HTML の入力要素(<input>、<textarea>、<select> など)と Vue インスタンスのデータプロパティを結び付け、ユーザーが入力した値を自動的にデータに反映し、逆にデータが変化すれば UI に即座に反映させます。
主な特徴
- 双方向バインディングにより、コード量が大幅に削減されます。
- 入力要素の type に応じて内部で適切なイベントやプロパティを処理します。
- カスタムコンポーネントでも
modelValueと@update:modelValueを実装すれば v-model を利用できます。
基本的な使い方
Vue コンポーネントの data にバインドしたいプロパティを定義し、テンプレート内の要素に v-model を付与します。
<template>
<div>
<input v-model="message" placeholder="メッセージを入力">
<p>入力内容: {{ message }}</p>
</div>
</template>
<script>
export default {
data() {
return {
message: ''
}
}
}
</script>
ポイント解説
- v-model の内部処理:テキスト系入力では
inputイベント、チェックボックスやラジオボタンではchangeイベントを監視し、要素のvalue(又はchecked)をデータに同期します。 - 修飾子:
v-model.lazyはchange時にだけ更新、v-model.numberは数値に変換、v-model.trimは空白を除去します。 - カスタムコンポーネントでの利用:
modelValueプロップと@update:modelValueイベントを実装することで、親コンポーネントからv-modelでデータを受け渡せます。
実践的な例:チェックボックスのリスト
複数選択可能なチェックボックスを配列にバインドする例です。
<template>
<div>
<label v-for="item in items" :key="item.id">
<input type="checkbox" :value="item.id" v-model="selected"> {{ item.name }}
</label>
<p>選択された ID: {{ selected }}</p>
</div>
</template>
<script>
export default {
data() {
return {
items: [
{ id: 1, name: 'Apple' },
{ id: 2, name: 'Banana' },
{ id: 3, name: 'Cherry' }
],
selected: []
}
}
}
</script>
まとめ
v-model は Vue.js のコア機能であり、HTML の入力要素とデータモデルをシームレスに結び付けることで、開発効率とコードの可読性を向上させます。修飾子やカスタムコンポーネント対応を活用すれば、さまざまな UI パターンに柔軟に対応可能です。