Vue フォーム
Vue は、レスポンシブな動作や バリデーション(Validation) といった付加機能を簡単に追加できるため、フォームにおける ユーザーエクスペリエンス(UX) を効率的に向上させることができます。
Vue でフォームを扱う際は、主に v-model ディレクティブを使用します。
1. Vue で作る最初のフォーム
Vue を使ってフォームを作成する流れを理解するために、シンプルな「ショッピングリスト」の例から始めてみましょう。
1.1 手順1:標準的な HTML フォーム要素の作成
まずは、通常の HTML でフォームの構造を記述します。
<form>
<p>アイテムを追加</p>
<p>アイテム名: <input type="text" required></p>
<p>数量: <input type="number"></p>
<button type="submit">追加する</button>
</form>1.2 手順2:Vue インスタンスの作成と v-model の接続
現在のアイテム名、数量、およびショッピングリスト全体を保持する Vue インスタンス を作成します。そして v-model を使って、各 インプット(Input) 要素をデータに接続します。
<div id="app">
<form>
<p>アイテムを追加</p>
<p>アイテム名: <input type="text" required v-model="itemName"></p>
<p>数量: <input type="number" v-model="itemNumber"></p>
<button type="submit">追加する</button>
</form>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script>
const app = Vue.createApp({
data() {
return {
itemName: null,
itemNumber: null,
shoppingList: [
{ name: 'トマト', number: 5 }
]
}
}
})
app.mount('#app')
</script>1.3 手順3:アイテム追加メソッドの呼び出しと送信制御
フォーム送信時にブラウザがリロードされるデフォルトの挙動を防ぎつつ、アイテムを追加する メソッド(Method) を呼び出します。これには v-on:submit.prevent 修飾子を使用します。
<form v-on:submit.prevent="addItem">1.4 手順4:メソッドの実装
リストにアイテムを追加し、入力フォームの内容をクリアするロジックを記述します。
methods: {
addItem() {
// 現在の入力値から新しいアイテムオブジェクトを作成
let item = {
name: this.itemName,
number: this.itemNumber
}
// 配列に追加
this.shoppingList.push(item);
// 入力欄をリセット
this.itemName = null
this.itemNumber = null
}
}1.5 手順5:v-for によるリストの表示
フォームの下に、自動的に更新されるショッピングリストを v-for を使って表示します。
<p>ショッピングリスト:</p>
<ul>
<li v-for="item in shoppingList">
{{ item.name }}, {{ item.number }}個
</li>
</ul>2. 完成したコード例
以下は、これらすべての手順を統合した、Vue フォームの最終的なソースコードです。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Vue フォームの基本</title>
</head>
<body>
<div id="app">
<form v-on:submit.prevent="addItem">
<p>アイテムを追加</p>
<p>アイテム名: <input type="text" required v-model="itemName"></p>
<p>数量: <input type="number" v-model="itemNumber"></p>
<button type="submit">追加する</button>
</form>
<p>ショッピングリスト:</p>
<ul>
<li v-for="item in shoppingList">
{{ item.name }}, {{ item.number }}個
</li>
</ul>
</div>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<script>
const app = Vue.createApp({
data() {
return {
itemName: null,
itemNumber: null,
shoppingList: [
{ name: 'トマト', number: 5 }
]
}
},
methods: {
addItem() {
let item = {
name: this.itemName,
number: this.itemNumber
}
this.shoppingList.push(item)
// 次の入力のためにフォームをクリア
this.itemName = null
this.itemNumber = null
}
}
})
app.mount('#app')
</script>
</body>
</html>Vue の v-model を活用することで、複雑な データバインディング(Data Binding) のロジックを自分で書く必要がなくなり、宣言的にフォームの挙動を定義できるようになります。これにより、コードの可読性と保守性が大幅に向上します。