``` <div v-for="(question, index) in questions" :key="index"> <!-- 单选框 --> <el-form-item v-if="question.question_type === 1" :label="question.question_text" :prop="`${question.question_code}`" :rules="[ { required: true, message: '请选择', trigger: 'change'} ]"> <el-radio-group v-model="formData[question.question_code]" :disabled='isUpdate'> <el-radio v-for="option in question.options" :key="option.option_code" :value="option.option_code">{{ option.option_text }}</el-radio> </el-radio-group> </el-form-item> <!-- 复选框 --> <el-form-item v-else-if="question.question_type === 2" :label="question.question_text" :prop="`${question.question_code}`" :rules="[ { type: 'array', required: true, message: '请至少选择一项', trigger: 'change'} ]"> <el-checkbox-group v-model="formData[question.question_code]" :disabled='isUpdate'> <el-checkbox v-for="option in question.options" :key="option.option_code" :value="option.option_code">{{ option.option_text }}</el-checkbox> </el-checkbox-group> </el-form-item> </div> <el-form ref="formRefs" :model="info" :rules="rules" label-width="80px" @submit.prevent=""> <el-row :gutter="16"> <el-col :span="6"> <el-form-item label="姓名" prop="name"> <el-input clearable v-model="info.name" :disabled='isUpdate' /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="性别" prop="gender"> <el-input clearable v-model="info.gender" :disabled='isUpdate' /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="年龄" prop="age"> <el-input clearable v-model="info.age" :disabled='isUpdate' /> </el-form-item> </el-col> </el-row> <el-row :gutter="16"> <el-col :span="10"> <el-form-item label="身份证号" prop="id_no"> <el-input clearable maxlength="18" v-model="info.id_no" :disabled='isUpdate' /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="联系方式" prop="phone_no"> <el-input clearable maxlength="11" v-model="info.phone_no" :disabled='isUpdate' /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="调查方式" prop="visit_type"> <el-radio-group v-model="info.visit_type" :disabled='isUpdate'> <el-radio value="自助" label="自助" /> <el-radio value="电话" label="电话" /> <el-radio value="微信" label="微信" /> </el-radio-group> </el-form-item> </el-col> </el-row> </el-form>```vue3如何实现一个提交按钮校验两个el-form 表单
时间: 2025-04-22 08:52:40 浏览: 35
在 Vue 3 中使用 `Element Plus` 组件库时,如果需要同时校验两个表单并在所有验证通过后才允许提交操作,可以按照以下步骤进行:
### 实现思路
1. **给每个表单设置引用**:为每个 `<el-form>` 设置唯一的 `ref` 属性以便于获取对应的实例。
2. **编写提交函数**:
- 遍历这两个表单的引用并分别触发它们的 `.validate()` 方法来进行异步校验。
- 使用 Promise.all 来等待所有的校验结果,并仅当全部成功时再继续后续逻辑。
### 示例代码
假设第一个表单名为 `questionsFormRef` 和第二个表单名为 `infoFormRef`:
```html
<template>
<div>
<!-- 第一部分问卷题目 -->
<div v-for="(question, index) in questions" :key="index">
<!-- 省略原有代码...保持不变 -->
</div>
<!-- 第二部分个人信息等其他信息填写 -->
<el-form ref="infoFormRef" :model="info" :rules="rules" label-width="80px">
<!-- 省略原有代码...保持不变 -->
</el-form>
<!-- 提交按钮 -->
<el-button type="primary" @click="handleSubmit">提交</el-button>
</div>
</template>
<script setup>
import { ref } from "vue";
// 定义对两个表单元素的引用
const questionsFormRef = ref(null);
const infoFormRef = ref(null);
async function handleSubmit() {
// 将两份表单的校验封装成Promise数组
const formPromises = [questionsFormRef.value?.validate(), infoFormRef.value?.validate()];
try {
await Promise.all(formPromises); // 并行地执行这些校验任务
console.log("Both forms are valid!");
// 此处添加实际的数据处理逻辑(如发送请求)
} catch (errors) {
console.error('One or more forms failed validation:', errors)
}
}
</script>
```
注意这里我们用到了结构化赋值 (`?.`) 的语法糖来简化可能为空的情况下的访问。另外,在实际项目中还需要考虑更多边界情况,比如用户点击了取消、页面刷新等问题导致的部分未完成状态管理;以及对于服务器端反馈错误信息的展示等等。
此外,确保你在模板中的组件都已正确定义好了相应的属性和事件绑定,例如上面示例里提到的 `v-model`, `:rules`, 及各种输入控件的具体配置项应完整无误。
阅读全文
相关推荐



















