Vue.jsメモ

概要

Vue.jsに関する個人的メモ

v-model

1. テキスト入力(text / textarea)

文字列データとして双方向バインディングされます。

<!-- 単一行テキスト -->
<input v-model="username" type="text" placeholder="ユーザー名" />

<!-- 複数行テキスト -->
<textarea v-model="description" rows="4"></textarea>

<!-- パスワード -->
<input v-model="password" type="password" />

<!-- メール(HTML5バリデーション) -->
<input v-model="email" type="email" />

2. チェックボックス(checkbox)

単一チェックボックスはboolean、複数チェックボックスは配列にバインドされます。

<!-- 単一チェックボックス(boolean) -->
<input v-model="agreed" type="checkbox" id="agree" />
<label for="agree">利用規約に同意する</label>
<!-- agreed: true or false -->

<!-- 複数チェックボックス(配列) -->
<div>
  <input v-model="selectedHobbies" type="checkbox" value="reading" id="reading" />
  <label for="reading">読書</label>

  <input v-model="selectedHobbies" type="checkbox" value="sports" id="sports" />
  <label for="sports">スポーツ</label>

  <input v-model="selectedHobbies" type="checkbox" value="music" id="music" />
  <label for="music">音楽</label>
</div>
<!-- selectedHobbies: ['reading', 'sports'] など -->

3. ラジオボタン(radio)

選択された値のvalue属性がバインドされます。

<div>
  <input v-model="gender" type="radio" value="male" id="male" />
  <label for="male">男性</label>

  <input v-model="gender" type="radio" value="female" id="female" />
  <label for="female">女性</label>

  <input v-model="gender" type="radio" value="other" id="other" />
  <label for="other">その他</label>
</div>
<!-- gender: 'male', 'female', 'other' のいずれか -->

4. セレクトボックス(select)

単一選択は文字列、複数選択(multiple)は配列にバインドされます。

<!-- 単一選択 -->
<select v-model="selectedCountry">
  <option disabled value="">国を選択してください</option>
  <option value="jp">日本</option>
  <option value="us">アメリカ</option>
  <option value="uk">イギリス</option>
</select>

<!-- 複数選択 -->
<select v-model="selectedLanguages" multiple>
  <option value="js">JavaScript</option>
  <option value="py">Python</option>
  <option value="go">Go</option>
</select>
<!-- selectedLanguages: ['js', 'py'] など -->

5. 修飾子(Modifiers)

v-modelには便利な修飾子が用意されています。

  • .lazy - inputイベントではなくchangeイベントで更新(入力完了時に同期)
  • .number - 入力を自動的に数値型に変換
  • .trim - 入力の前後の空白を自動的に削除
<!-- .lazy: フォーカスが外れたときに更新 -->
<input v-model.lazy="message" type="text" />

<!-- .number: 数値型に自動変換 -->
<input v-model.number="age" type="number" />

<!-- .trim: 前後の空白を削除 -->
<input v-model.trim="username" type="text" />

<!-- 修飾子は複数併用可能 -->
<input v-model.lazy.trim="email" type="email" />

6. ベストプラクティス

  • 初期値の設定: data()で必ず初期値を設定(undefinedを避ける)
  • type属性の指定: HTML5のtype属性を活用してバリデーションを強化
  • アクセシビリティ: label要素とid属性を適切に紐付ける
  • number型の注意: .number修飾子はtype="number"と併用すると効果的
  • 配列の初期化: チェックボックス(複数)やセレクト(複数)は空配列[]で初期化

7. よくあるパターン

<!-- パターン1: 検索フォーム -->
<input v-model.trim="searchQuery" type="search" placeholder="検索..." />

<!-- パターン2: 年齢入力(数値、1-120の範囲) -->
<input v-model.number="age" type="number" min="1" max="120" />

<!-- パターン3: タグ選択(複数チェックボックス) -->
<label><input v-model="tags" type="checkbox" value="tech" /> Tech</label>
<label><input v-model="tags" type="checkbox" value="news" /> News</label>

<!-- パターン4: 優先度選択(ラジオボタン) -->
<label><input v-model="priority" type="radio" value="high" /> 高</label>
<label><input v-model="priority" type="radio" value="low" /> 低</label>