Vue收集表单数据

一、v-model:双向绑定的核心

v-model 是 Vue 提供的语法糖,用于在表单控件和组件之间创建双向数据绑定

1. 基本用法:文本框

html 复制代码
<template>
  <div>
    <input v-model="message" placeholder="请输入内容">
    <p>你输入的内容:{{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: ''
    }
  }
}
</script>

v-model 会自动监听 input 事件,并更新 message 的值。

二、常见表单控件的数据收集

1. 多行文本(textarea)

html 复制代码
<textarea v-model="content" placeholder="请输入描述"></textarea>
<p>内容:{{ content }}</p>

v-modeltextarea 中同样适用,无需 value 属性。


2. 复选框(checkbox)

单个复选框(布尔值)
html 复制代码
<input type="checkbox" v-model="isAgree">
<label>我同意用户协议</label>
<p>是否同意:{{ isAgree }}</p>
javascript 复制代码
data() {
  return {
    isAgree: false
  }
}
多个复选框(数组)
html 复制代码
<div>
  <input type="checkbox" v-model="hobbies" value="reading" id="reading">
  <label for="reading">阅读</label>

  <input type="checkbox" v-model="hobbies" value="music" id="music">
  <label for="music">音乐</label>

  <input type="checkbox" v-model="hobbies" value="sports" id="sports">
  <label for="sports">运动</label>
</div>
<p>爱好:{{ hobbies }}</p>
javascript 复制代码
data() {
  return {
    hobbies: [] // 初始为空数组
  }
}

hobbies 数组将包含所有被选中的 value 值。


3. 单选框(radio)

html 复制代码
<div>
  <input type="radio" v-model="gender" value="male" id="male">
  <label for="male">男</label>

  <input type="radio" v-model="gender" value="female" id="female">
  <label for="female">女</label>
</div>
<p>性别:{{ gender }}</p>
javascript 复制代码
data() {
  return {
    gender: '' // 初始为空
  }
}

v-model 绑定到同一个变量,value 决定选中时的值。


4. 下拉选择框(select)

单选
html 复制代码
<select v-model="city">
  <option value="">请选择城市</option>
  <option value="beijing">北京</option>
  <option value="shanghai">上海</option>
  <option value="guangzhou">广州</option>
</select>
<p>城市:{{ city }}</p>
多选(添加 multiple
html 复制代码
<select v-model="skills" multiple>
  <option value="vue">Vue</option>
  <option value="react">React</option>
  <option value="angular">Angular</option>
</select>
<p>技能:{{ skills }}</p>
javascript 复制代码
data() {
  return {
    skills: []
  }
}

✅ 多选时 v-model 绑定的是数组。

三、v-model 的修饰符

Vue 提供了多个修饰符,简化常见操作。

1. .lazy:从 input 改为 change 事件

html 复制代码
<input v-model.lazy="message" placeholder="失去焦点时更新">

✅ 减少频繁更新,适用于搜索框等场景。


2. .number:自动将输入值转换为数字

html 复制代码
<input v-model.number="age" type="number" placeholder="年龄">

✅ 即使输入是字符串,age 也会是 Number 类型。


3. .trim:自动去除首尾空格

html 复制代码
<input v-model.trim="username" placeholder="用户名">

✅ 防止用户误输入空格,提升数据质量。

四、表单提交与数据收集

1. 使用 @submit.prevent 阻止默认提交

html 复制代码
<form @submit.prevent="handleSubmit">
  <input v-model="form.username" placeholder="用户名" required>
  <input v-model="form.password" type="password" placeholder="密码" required>
  <button type="submit">登录</button>
</form>
javascript 复制代码
export default {
  data() {
    return {
      form: {
        username: '',
        password: ''
      }
    }
  },
  methods: {
    handleSubmit() {
      console.log('提交表单:', this.form)
      // 发送请求
      // this.$http.post('/api/login', this.form)
    }
  }
}

@submit.prevent 阻止页面刷新,调用 handleSubmit 方法。


2. 表单验证(基础版)

javascript 复制代码
methods: {
  handleSubmit() {
    if (!this.form.username || !this.form.password) {
      alert('请填写完整信息')
      return
    }
    console.log('提交成功:', this.form)
  }
}

✅ 实际项目中推荐使用 VeeValidate、Element Plus 表单验证等库。

五、v-model 的原理(了解)

v-model 本质上是语法糖,等价于:

html 复制代码
<!-- v-model="message" -->
<input 
  :value="message" 
  @input="message = $event.target.value"
>

对于组件,v-model 默认监听 modelValueupdate:modelValue 事件(Vue 3)。

六、Vue 3 Composition API 写法

setup() 中,v-model 依然可用,数据通过 ref 定义。

html 复制代码
<script>
import { ref } from 'vue'

export default {
  setup() {
    const form = ref({
      username: '',
      password: '',
      remember: false
    })

    const handleSubmit = () => {
      console.log('提交:', form.value)
    }

    return {
      form,
      handleSubmit
    }
  }
}
</script>

<template>
  <form @submit.prevent="handleSubmit">
    <input v-model="form.username" placeholder="用户名">
    <input v-model="form.password" type="password" placeholder="密码">
    <label>
      <input v-model="form.remember" type="checkbox"> 记住我
    </label>
    <button type="submit">登录</button>
  </form>
</template>

七、最佳实践与常见问题

✅ 推荐做法

  1. 使用对象集中管理表单数据 (如 form 对象)
  2. 始终添加 .trim 修饰符,避免空格问题
  3. 复杂表单使用 computedwatch 处理联动逻辑
  4. 提交前做基本验证,防止无效请求

❓ 常见问题

1. v-model 不更新?
  • 检查数据是否在 dataref 中定义
  • 避免直接修改数组索引或对象属性(Vue 2)
  • 使用 Vue.set 或解构赋值更新
2. 如何重置表单?
javascript 复制代码
resetForm() {
  this.form = {
    username: '',
    password: '',
    hobbies: []
  }
}

八、总结

控件 v-model 绑定类型
文本框 / textarea 字符串
复选框(单) 布尔值
复选框(多) 数组
单选框 字符串/数字
下拉框(单) 字符串/数字
下拉框(多) 数组
修饰符 作用
.lazy change 事件触发
.number 转换为数字
.trim 去除首尾空格

九、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
xiaofeichaichai6 小时前
Webpack
前端·webpack·node.js
问心无愧05136 小时前
ctf show web入门111
android·前端·笔记
唐某人丶6 小时前
模型越来越强,我们还需要 Agent 工程吗?—— 从价值重估到 Harness 实践
前端·agent·ai编程
智码看视界6 小时前
现代Web开发基础:全栈工程师的起航点
前端·后端·c5全栈
JS菌7 小时前
手写一个 AI Agent 全栈项目:从沙箱执行到子智能体的完整实现
前端·人工智能·后端
excel8 小时前
HLS TS 文件损坏的元凶:Git 提交与拉取
前端
Aphasia3118 小时前
https连接传输流程
前端·面试
徐小夕8 小时前
万字长文!千万级文档 RAG 知识库系统落地实践
前端·算法·github
梦梦代码精8 小时前
2026年PHP开源商城系统实测对比:架构、多商户、商用授权,谁才是真·省心?
vue.js·docker·架构·开源·代码规范