Vue3 表单(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

在 Web 开发中,表单是用户与应用交互的核心组件之一。无论是登录注册、数据提交还是信息收集,表单的设计和实现都直接影响用户体验和功能完整性。Vue3 作为现代前端框架的代表,通过响应式数据驱动和组件化设计,为开发者提供了高效构建表单的解决方案。本文将从基础到进阶,系统讲解 Vue3 表单的核心概念、实现方法和常见场景的解决方案,帮助开发者快速掌握这一重要技能。


一、Vue3 表单的基础用法

1.1 表单绑定的底层逻辑

Vue3 表单的核心是通过 v-model 指令实现双向数据绑定。这一机制类似于“镜子效应”——当用户在表单输入框中输入内容时,数据会实时反映到 Vue 组件的响应式数据中;反之,当数据变化时,表单也会同步更新。

示例代码:基础输入框绑定

<template>  
  <input v-model="message" placeholder="输入内容..." />  
  <p>当前输入值:{{ message }}</p>  
</template>  

<script setup>  
import { ref } from 'vue';  
const message = ref('');  
</script>  

1.2 表单元素的类型扩展

Vue3 支持多种表单元素的绑定,包括:

  • 文本输入框(<input type="text">
  • 密码框(<input type="password">
  • 复选框(<input type="checkbox">
  • 单选按钮(<input type="radio">
  • 下拉选择框(<select>

示例:复选框与单选按钮

<template>  
  <!-- 复选框绑定数组 -->  
  <input type="checkbox" v-model="hobbies" value="阅读" /> 阅读  
  <input type="checkbox" v-model="hobbies" value="运动" /> 运动  

  <!-- 单选按钮绑定字符串 -->  
  <input type="radio" v-model="gender" value="男" /> 男  
  <input type="radio" v-model="gender" value="女" /> 女  
</template>  

<script setup>  
import { ref } from 'vue';  
const hobbies = ref([]);  
const gender = ref('');  
</script>  

二、响应式表单的进阶实现

2.1 响应式数据的两种模式

Vue3 提供了 refreactive 两种创建响应式数据的方式,适用于不同场景:
| 场景描述 | 推荐方法 | 示例代码结构 |
|-------------------------|----------------|-----------------------------|
| 单值绑定(如姓名、年龄)| ref | const name = ref('张三') |
| 复杂对象绑定(如表单对象)| reactive | const form = reactive({})|

示例:复杂对象的响应式绑定

<template>  
  <input v-model="form.userName" placeholder="用户名" />  
  <input v-model="form.password" type="password" placeholder="密码" />  
</template>  

<script setup>  
import { reactive } from 'vue';  
const form = reactive({  
  userName: '',  
  password: ''  
});  
</script>  

2.2 表单数据的初始化与重置

在实际开发中,表单数据的初始化和重置是高频需求。通过 refreactive 创建的响应式对象,可以直接通过赋值实现数据重置。

示例:重置表单数据

<template>  
  <button @click="resetForm">重置</button>  
</template>  

<script setup>  
import { reactive } from 'vue';  
const form = reactive({  
  userName: '默认用户名',  
  password: ''  
});  

const resetForm = () => {  
  form.userName = '默认用户名';  
  form.password = '';  
};  
</script>  

三、表单验证机制的实现

3.1 同步验证:即时反馈错误信息

表单验证通常分为同步验证(如必填项、格式校验)和异步验证(如用户名唯一性检查)。同步验证可通过自定义函数结合响应式数据实现。

示例:邮箱格式验证

<template>  
  <input v-model="email" @input="validateEmail" />  
  <p v-if="emailError" style="color: red">{{ emailError }}</p>  
</template>  

<script setup>  
import { ref } from 'vue';  
const email = ref('');  
const emailError = ref('');  

const validateEmail = () => {  
  const pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;  
  if (!email.value.match(pattern)) {  
    emailError.value = '请输入有效的邮箱格式';  
  } else {  
    emailError.value = '';  
  }  
};  
</script>  

3.2 异步验证:结合 API 请求

对于需要远程校验的场景(如检查用户名是否已存在),可以通过 async/await 结合 ref 实现。

示例:用户名唯一性验证

<template>  
  <input v-model="username" @blur="checkUsername" />  
  <p v-if="usernameError" style="color: red">{{ usernameError }}</p>  
</template>  

<script setup>  
import { ref } from 'vue';  
const username = ref('');  
const usernameError = ref('');  

const checkUsername = async () => {  
  // 模拟 API 请求延迟  
  await new Promise(resolve => setTimeout(resolve, 1000));  
  const isExist = username.value === 'admin'; // 假设 'admin' 已存在  
  if (isExist) {  
    usernameError.value = '用户名已被占用';  
  } else {  
    usernameError.value = '';  
  }  
};  
</script>  

四、复杂场景的解决方案

4.1 级联选择器:父子联动的表单组件

级联选择器(如省市区选择)需要动态根据父级选择项加载子级数据。通过响应式数据的嵌套更新和事件监听,可以轻松实现这一功能。

示例:省市区级联选择器

<template>  
  <select v-model="selectedProvince">  
    <option v-for="province in provinces" :key="province.id" :value="province.id">{{ province.name }}</option>  
  </select>  

  <select v-model="selectedCity" :disabled="!selectedProvince">  
    <option v-for="city in cities" :key="city.id" :value="city.id">{{ city.name }}</option>  
  </select>  
</template>  

<script setup>  
import { ref, computed } from 'vue';  
const provinces = ref([  
  { id: 1, name: '北京市', cities: [ { id: 11, name: '朝阳区' }, ... ] },  
  // ...其他省份数据  
]);  

const selectedProvince = ref(0);  
const cities = computed(() => {  
  const selected = provinces.value.find(p => p.id === selectedProvince.value);  
  return selected ? selected.cities : [];  
});  
const selectedCity = ref(0);  
</script>  

4.2 动态表单:根据条件增删字段

某些业务场景需要根据用户选择动态添加或移除表单字段(如订单中的商品数量增减)。通过数组的响应式操作(pushsplice)即可实现。

示例:动态添加输入框

<template>  
  <button @click="addField">添加字段</button>  
  <div v-for="(field, index) in fields" :key="index">  
    <input v-model="field.value" :placeholder="`字段 ${index+1}`" />  
    <button @click="removeField(index)">删除</button>  
  </div>  
</template>  

<script setup>  
import { ref } from 'vue';  
const fields = ref([{ value: '' }]);  

const addField = () => {  
  fields.value.push({ value: '' });  
};  

const removeField = (index) => {  
  fields.value.splice(index, 1);  
};  
</script>  

四、表单提交与数据处理

4.1 提交表单的两种方式

在 Vue3 中,表单提交可以通过以下两种方式触发:

  1. 直接绑定 submit 事件:通过 @submit.prevent 阻止默认提交行为
  2. 使用按钮触发提交:通过 @click 触发自定义提交函数

示例:表单提交与数据清空

<template>  
  <form @submit.prevent="handleSubmit">  
    <input v-model="formData.name" placeholder="姓名" />  
    <input v-model="formData.email" placeholder="邮箱" />  
    <button type="submit">提交</button>  
  </form>  
</template>  

<script setup>  
import { reactive } from 'vue';  
const formData = reactive({ name: '', email: '' });  

const handleSubmit = () => {  
  console.log('提交的数据:', formData);  
  // 清空表单  
  formData.name = '';  
  formData.email = '';  
};  
</script>  

结论

Vue3 表单通过简洁的语法和强大的响应式系统,为开发者提供了高效、灵活的表单构建方案。从基础的双向绑定到复杂的动态表单,开发者可以通过本文介绍的 v-modelref/reactive、表单验证等核心知识点,快速实现功能丰富的交互组件。掌握这些技巧后,读者可以进一步探索表单与第三方 UI 框架(如 Element Plus)的结合,或是深入研究 TypeScript 在表单中的类型校验应用,持续提升开发效率。


通过本文的学习,读者不仅能掌握 Vue3 表单的实现原理与最佳实践,还能为后续构建复杂应用打下坚实基础。

最新发布