【Vue.js】双方向データバインディングでフォームの入力値をリアルタイムに反映させる方法

Vue.jsのフォームバインディングは、双方向データバインディングを実現するための強力な機能です。フォームの入力値とVueインスタンスのデータを同期させることで、直感的で効率的な開発が可能になります。本記事では、Vue.jsのフォームバインディングの基本から応用までを詳しく解説します。

テキスト入力のバインディング

<div id="app">
  <input v-model="message">
  <p>{{ message }}</p>
</div>

<script>
new Vue({
  el: '#app',
  data: {
    message: ''
  }
})
</script>

テキスト入力フィールドとVueインスタンスのmessageデータを双方向にバインディングする方法です。v-modelディレクティブを使用することで、入力値が変更されるとデータが自動的に更新されます。

チェックボックスのバインディング

<div id="app">
  <input type="checkbox" v-model="checked">
  <p>{{ checked }}</p>
</div>

<script>
new Vue({
  el: '#app',
  data: {
    checked: false
  }
})
</script>

チェックボックスとcheckedデータをバインディングする方法です。チェックボックスがチェックされるとデータがtrueに、外されるとfalseになります。

ラジオボタンのバインディング

<div id="app">
  <input type="radio" v-model="picked" value="One">
  <input type="radio" v-model="picked" value="Two">
  <p>{{ picked }}</p>
</div>

<script>
new Vue({
  el: '#app',
  data: {
    picked: ''
  }
})
</script>

複数のラジオボタンとpickedデータをバインディングする方法です。選択されたラジオボタンのvalueがpickedデータに反映されます。

セレクトボックスのバインディング

<div id="app">
  <select v-model="selected">
    <option disabled value="">Please select one</option>
    <option>Option 1</option>
    <option>Option 2</option>
    <option>Option 3</option>
  </select>
  <p>Selected: {{ selected }}</p>
</div>

<script>
new Vue({
  el: '#app',
  data: {
    selected: ''
  }
})
</script>

セレクトボックスとselectedデータをバインディングする方法です。選択されたオプションのvalueがselectedデータに反映されます。

複数選択のセレクトボックスのバインディング

<div id="app">
  <select v-model="selected" multiple>
    <option>Option 1</option>
    <option>Option 2</option>
    <option>Option 3</option>
  </select>
  <p>Selected: {{ selected }}</p>
</div>

<script>
new Vue({
  el: '#app',
  data: {
    selected: []
  }
})
</script>

複数選択可能なセレクトボックスと配列データをバインディングする方法です。選択されたオプションが配列としてselectedデータに反映されます。

カスタム入力コンポーネントとのバインディング

<template id="custom-input-template">
  <input
    :value="value"
    @input="$emit('input', $event.target.value)"
  >
</template>

<div id="app">
  <custom-input v-model="message"></custom-input>
  <p>{{ message }}</p>
</div>

<script>
Vue.component('custom-input', {
  template: '#custom-input-template',
  props: ['value']
})

new Vue({
  el: '#app',
  data: {
    message: ''
  }
})
</script>

カスタム入力コンポーネントにv-modelを使用してバインディングする方法です。カスタムコンポーネントでvalueプロパティを受け取り、入力イベントが発生したときにinputイベントを発火させて親コンポーネントに値を伝えます。

まとめ

Vue.jsのフォームバインディングは、シンプルなコードで強力な双方向データバインディングを実現します。基本的なテキスト入力から複雑なカスタムコンポーネントまで、さまざまなフォーム要素に対応できるため、効率的な開発が可能です。ぜひ、あなたのプロジェクトに活用してみてください。