表单绑定


alias: vue-form-binding keywords: Vue2, 表单绑定, v-model, 双向绑定 description: Vue.js 表单输入绑定完整指南,掌握 v-model 双向绑定和各种表单元素的处理技巧。

表单绑定

表单是 Web 应用中最常见的交互方式。登录注册、搜索查询、数据提交...几乎每个应用都离不开表单。传统开发中,我们需要手动获取表单值、监听输入变化、更新数据,代码繁琐且容易出错。

Vue 的 v-model 指令让表单处理变得简单优雅。它自动实现了数据到视图、视图到数据的双向同步,你只需要关注业务逻辑,不用再操心繁琐的 DOM 操作。

什么是表单绑定

表单绑定本质上是数据的双向流动:

  • 数据 → 视图:当数据变化时,自动更新表单元素的值
  • 视图 → 数据:当用户输入时,自动更新数据
<input v-model="message">
<p>{{ message }}</p>

用户在输入框中打字,message 自动更新,下方显示的内容也随之变化。这一切都是自动的,无需手动监听事件或操作 DOM。

v-model 的本质

v-model 是一个语法糖,它等价于:

<input 
  :value="message"
  @input="message = $event.target.value"
>

理解这一点很重要,因为:

  1. 你知道 v-model 背后发生了什么
  2. 可以在自定义组件上实现自己的 v-model
  3. 遇到问题时知道如何调试

本章内容

  • 双向绑定 v-model:深入理解 v-model 的工作原理和使用方式
  • 文本输入框:单行文本、多行文本的处理
  • 单选与复选框:处理布尔值、数组和单选组
  • 下拉选择框:单选、多选和动态选项
  • 表单修饰符.lazy.number.trim 的使用

表单绑定的优势

代码简洁

传统方式需要手动获取值、设置值、监听事件。v-model 一行代码搞定。

实时同步

数据变化立即反映到视图,用户输入立即更新数据,无需手动同步。

类型智能

Vue 会根据表单元素类型自动选择正确的属性和事件,无需额外配置。

支持的表单元素

v-model 支持所有标准表单元素:

元素绑定属性触发事件
text/textareavalueinput
checkboxcheckedchange
radiocheckedchange
selectvaluechange

Vue 会根据元素类型自动选择正确的绑定方式。

一个完整的表单示例

<div id="app">
  <form @submit.prevent="submitForm">
    <div class="form-group">
      <label>用户名</label>
      <input type="text" v-model="form.username">
    </div>
    
    <div class="form-group">
      <label>密码</label>
      <input type="password" v-model="form.password">
    </div>
    
    <div class="form-group">
      <label>邮箱</label>
      <input type="email" v-model="form.email">
    </div>
    
    <div class="form-group">
      <label>性别</label>
      <label>
        <input type="radio" v-model="form.gender" value="male"></label>
      <label>
        <input type="radio" v-model="form.gender" value="female"></label>
    </div>
    
    <div class="form-group">
      <label>爱好</label>
      <label>
        <input type="checkbox" v-model="form.hobbies" value="reading"> 阅读
      </label>
      <label>
        <input type="checkbox" v-model="form.hobbies" value="music"> 音乐
      </label>
      <label>
        <input type="checkbox" v-model="form.hobbies" value="sports"> 运动
      </label>
    </div>
    
    <div class="form-group">
      <label>城市</label>
      <select v-model="form.city">
        <option value="">请选择</option>
        <option value="beijing">北京</option>
        <option value="shanghai">上海</option>
        <option value="guangzhou">广州</option>
      </select>
    </div>
    
    <div class="form-group">
      <label>简介</label>
      <textarea v-model="form.bio"></textarea>
    </div>
    
    <div class="form-group">
      <label>
        <input type="checkbox" v-model="form.agree"> 同意用户协议
      </label>
    </div>
    
    <button type="submit">提交</button>
  </form>
  
  <pre>{{ form }}</pre>
</div>

<script>
new Vue({
  el: '#app',
  data: {
    form: {
      username: '',
      password: '',
      email: '',
      gender: '',
      hobbies: [],
      city: '',
      bio: '',
      agree: false
    }
  },
  methods: {
    submitForm: function() {
      console.log('提交数据:', this.form)
      // 发送到服务器...
    }
  }
})
</script>

注意事项

v-model 与 value 不要同时使用

v-model 已经绑定了 value,再设置 value 属性会被忽略:

<!-- ❌ 错误:value 会被忽略 -->
<input v-model="text" value="初始值">

<!-- ✅ 正确:在 data 中设置初始值 -->
<input v-model="text">
<!-- data: { text: '初始值' } -->

IME 输入法问题

在使用中文输入法时,v-model 会在拼音输入过程中同步更新。如果需要等输入完成再更新,使用 .lazy 修饰符:

<input v-model.lazy="text">

学习建议

表单绑定是 Vue 开发中最常用的功能之一:

  1. 理解原理:知道 v-model 是语法糖,有助于理解自定义组件的 v-model
  2. 善用修饰符.trim.number 等修饰符能简化很多常见操作
  3. 表单验证:配合计算属性或第三方库实现表单验证

接下来,让我们从 v-model 的基本用法开始,逐步掌握各种表单元素的处理技巧。