在 Vue 项目中使用 UView UI 的 u-form
组件时,多个表单同时校验的需求非常常见。例如,当我们有多个表单需要在同一个页面中进行校验并提交时,我们需要确保每个表单都能进行单独验证,同时可以在同一时刻进行批量验证。
接下来,我们结合实际项目的代码,讲解如何使用 u-form
组件实现多个表单同时校验。
1. 项目背景
假设你有一个页面,需要用户同时填写用户信息和公司信息两个表单。用户信息包括姓名和年龄,公司的信息包括公司名和职位。你希望在用户点击提交按钮时,能够同时校验这两个表单,确保每个表单的数据都符合要求。
2. 代码示例
2.1 页面模板
<template> <view> <!-- 用户信息表单 --> <u-form :model="userForm" ref="userForm" @submit="submitForms"> <u-form-item label="姓名" prop="name" :rules="nameRules"> <u-input v-model="userForm.name" placeholder="请输入姓名" /> </u-form-item> <u-form-item label="年龄" prop="age" :rules="ageRules"> <u-input type="number" v-model="userForm.age" placeholder="请输入年龄" /> </u-form-item> <u-form-item> <u-button type="primary" block formType="submit">提交用户信息</u-button> </u-form-item> </u-form> <!-- 公司信息表单 --> <u-form :model="companyForm" ref="companyForm" @submit="submitForms"> <u-form-item label="公司名称" prop="companyName" :rules="companyNameRules"> <u-input v-model="companyForm.companyName" placeholder="请输入公司名称" /> </u-form-item> <u-form-item label="职位" prop="position" :rules="positionRules"> <u-input v-model="companyForm.position" placeholder="请输入职位" /> </u-form-item> <u-form-item> <u-button type="primary" block formType="submit">提交公司信息</u-button> </u-form-item> </u-form> <!-- 提交按钮 --> <u-button type="success" block @click="submitForms">提交所有信息</u-button> </view> </template>
复制
2.2 页面脚本
<script> export default { data() { return { // 用户信息表单的数据 userForm: { name: '', age: '' }, // 用户信息表单的校验规则 nameRules: [ { required: true, message: '姓名是必填的', trigger: 'blur' } ], ageRules: [ { required: true, message: '年龄是必填的', trigger: 'blur' }, { type: 'number', message: '请输入有效的年龄', trigger: 'blur' } ], // 公司信息表单的数据 companyForm: { companyName: '', position: '' }, // 公司信息表单的校验规则 companyNameRules: [ { required: true, message: '公司名称是必填的', trigger: 'blur' } ], positionRules: [ { required: true, message: '职位是必填的', trigger: 'blur' } ] }; }, methods: { // 提交表单 submitForms() { // 同时校验所有表单 const userFormValidation = this.$refs.userForm.validate(); const companyFormValidation = this.$refs.companyForm.validate(); // 使用 Promise.all 来并行验证多个表单 Promise.all([userFormValidation, companyFormValidation]) .then(() => { // 如果所有表单验证通过 this.$u.toast('所有表单验证通过,提交成功'); // 可以在这里进行数据提交 }) .catch(() => { // 如果有任何表单验证失败 this.$u.toast('表单验证失败,请检查输入'); }); } } }; </script>
复制
3. 详细说明
3.1 表单组件使用
-
u-form
:这是 UView UI 中的表单组件。每个表单组件通过:model
绑定对应的数据对象,通过ref
设置引用名,以便在 JavaScript 中获取并调用表单的验证方法。 -
u-form-item
:每个表单项。它用来包装一个表单字段,并且通过prop
来指定字段名称,用来与表单数据进行绑定。 -
u-input
:用于输入数据的组件。它通过v-model
来双向绑定数据。
3.2 校验逻辑
-
表单校验规则:每个表单项都有相应的校验规则(
rules
)。这些规则确保字段的输入符合预期。在此示例中,我们使用了必填和类型检查(如number
类型)的规则。 -
validate
方法:每个u-form
组件都有一个validate
方法,它会触发表单的校验并返回一个Promise
。如果表单验证成功,Promise
会成功解析;如果验证失败,Promise
会被拒绝。
3.3 提交和批量校验
-
submitForms
方法:这是页面的提交处理方法。在该方法中,我们使用了this.$refs.userForm.validate()
和this.$refs.companyForm.validate()
来分别触发两个表单的校验,并通过Promise.all
来并行校验这两个表单。 -
Promise.all
:我们将两个表单的校验Promise
包装到Promise.all
中。这样,两个表单的校验会同时进行。当所有表单验证都成功时,then
方法被触发;如果有任何一个表单验证失败,catch
方法会被触发。 -
this.$u.toast
:用来显示提示消息,通知用户是否提交成功或失败。
4. 关键点总结
- 使用
ref
引用多个表单,方便访问每个表单实例。 - 通过
this.$refs.form.validate()
触发表单校验。 - 使用
Promise.all
来并行校验多个表单,确保所有表单的验证同时进行。 - 利用
validate
返回的Promise
来处理校验成功与失败的逻辑。
5. 实际项目中的应用场景
在实际项目中,可能会有以下场景需要处理多个表单的验证:
- 多步骤表单:用户在不同的步骤中填写不同的表单,在提交时需要同时验证所有步骤的表单。
- 用户与公司信息:用户需要在同一页面提交多个表单(例如,个人信息和公司信息),而且这些表单有不同的校验规则。
- 动态表单:根据不同的用户选择,动态展示多个表单项,最后进行一次统一的验证。
通过使用 u-form
的并行校验方法,可以方便地实现这些需求,提高用户体验和开发效率。