多个表单使用相同的 ref 和 rules,表单验证规则不生效

ops/2025/1/12 12:30:22/

在 Vue 和 Element UI 中,如果多个表单使用相同的 ref 和 rules,可能会导致表单验证规则不生效。这是因为 ref 是唯一的,多个表单共享同一个 ref 会导致冲突。

解决方法:

1. 为每个表单设置不同的 ref

为每个表单设置不同的 ref,并在验证时分别调用各自的验证方法。

示例代码:
<template><div><!-- 表单 1 --><el-form :model="form1" :rules="rules" ref="form1Ref"><el-form-item label="姓名" prop="name"><el-input v-model="form1.name"></el-input></el-form-item><el-form-item><el-button type="primary" @click="submitForm('form1Ref')">提交表单 1</el-button></el-form-item></el-form><!-- 表单 2 --><el-form :model="form2" :rules="rules" ref="form2Ref"><el-form-item label="姓名" prop="name"><el-input v-model="form2.name"></el-input></el-form-item><el-form-item><el-button type="primary" @click="submitForm('form2Ref')">提交表单 2</el-button></el-form-item></el-form></div>
</template><script>
export default {data() {return {form1: { name: "" }, // 表单 1 数据form2: { name: "" }, // 表单 2 数据rules: {name: [{ required: true, message: "请输入姓名", trigger: "blur" },],},};},methods: {// 提交表单submitForm(formRef) {this.$refs[formRef].validate((valid) => {if (valid) {alert("表单验证通过");} else {alert("表单验证失败");return false;}});},},
};
</script>
说明:
  • 为每个表单设置不同的 ref(如 form1Ref 和 form2Ref)。

  • 在 submitForm 方法中,通过动态传入 ref 名称来验证对应的表单。


2. 使用动态 ref

如果表单是动态生成的(例如通过 v-for 循环),可以使用动态 ref

示例代码:
<template><div><!-- 动态生成表单 --><el-formv-for="(form, index) in forms":key="index":model="form":rules="rules":ref="`formRef${index}`"><el-form-item label="姓名" prop="name"><el-input v-model="form.name"></el-input></el-form-item><el-form-item><el-button type="primary" @click="submitForm(index)">提交表单 {{ index + 1 }}</el-button></el-form-item></el-form></div>
</template><script>
export default {data() {return {forms: [{ name: "" }, // 表单 1 数据{ name: "" }, // 表单 2 数据],rules: {name: [{ required: true, message: "请输入姓名", trigger: "blur" },],},};},methods: {// 提交表单submitForm(index) {this.$refs[`formRef${index}`][0].validate((valid) => {if (valid) {alert(`表单 ${index + 1} 验证通过`);} else {alert(`表单 ${index + 1} 验证失败`);return false;}});},},
};
</script>
说明:
  • 使用 v-for 动态生成表单,并为每个表单设置动态 ref(如 formRef0formRef1)。

  • 在 submitForm 方法中,通过索引动态获取对应的表单 ref


3. 共享 rules 但独立验证

如果多个表单共享相同的验证规则,可以将 rules 提取到公共位置,但为每个表单设置独立的 ref 和验证逻辑。

<template><div><!-- 表单 1 --><el-form :model="form1" :rules="rules" ref="form1Ref"><el-form-item label="姓名" prop="name"><el-input v-model="form1.name"></el-input></el-form-item><el-form-item><el-button type="primary" @click="validateForm('form1Ref')">验证表单 1</el-button></el-form-item></el-form><!-- 表单 2 --><el-form :model="form2" :rules="rules" ref="form2Ref"><el-form-item label="姓名" prop="name"><el-input v-model="form2.name"></el-input></el-form-item><el-form-item><el-button type="primary" @click="validateForm('form2Ref')">验证表单 2</el-button></el-form-item></el-form></div>
</template><script>
export default {data() {return {form1: { name: "" }, // 表单 1 数据form2: { name: "" }, // 表单 2 数据rules: {name: [{ required: true, message: "请输入姓名", trigger: "blur" },],},};},methods: {// 验证表单validateForm(formRef) {this.$refs[formRef].validate((valid) => {if (valid) {alert("表单验证通过");} else {alert("表单验证失败");return false;}});},},
};
</script>
说明:
  • 共享 rules,但为每个表单设置独立的 ref

  • 在 validateForm 方法中,通过动态传入 ref 名称来验证对应的表单。


总结

  • 如果多个表单共享相同的 ref,会导致冲突,验证规则不生效。

  • 解决方法:

    1. 为每个表单设置不同的 ref

    2. 如果表单是动态生成的,使用动态 ref

    3. 共享 rules,但独立验证每个表单。

 

4.同步验证多个表单实现思路:

  1. 为每个表单设置独立的 ref

    • 每个表单需要有一个唯一的 ref,以便能够单独访问和验证。

  2. 使用 Promise.all 进行同步验证

    • 将每个表单的验证方法包装成 Promise,然后使用 Promise.all 等待所有表单验证完成。

  3. 处理验证结果

    • 如果所有表单验证通过,执行后续逻辑;如果有表单验证失败,提示错误信息。


示例代码:
<template><div><!-- 表单 1 --><el-form :model="form1" :rules="rules" ref="form1Ref"><el-form-item label="姓名" prop="name"><el-input v-model="form1.name"></el-input></el-form-item></el-form><!-- 表单 2 --><el-form :model="form2" :rules="rules" ref="form2Ref"><el-form-item label="邮箱" prop="email"><el-input v-model="form2.email"></el-input></el-form-item></el-form><!-- 提交按钮 --><el-button type="primary" @click="validateAllForms">提交所有表单</el-button></div>
</template><script>
export default {data() {return {form1: { name: "" }, // 表单 1 数据form2: { email: "" }, // 表单 2 数据rules: {name: [{ required: true, message: "请输入姓名", trigger: "blur" },],email: [{ required: true, message: "请输入邮箱", trigger: "blur" },{ type: "email", message: "请输入正确的邮箱地址", trigger: "blur" },],},};},methods: {// 验证单个表单validateForm(formRef) {return new Promise((resolve, reject) => {this.$refs[formRef].validate((valid) => {if (valid) {resolve(); // 验证通过} else {reject(new Error(`表单 ${formRef} 验证失败`)); // 验证失败}});});},// 同步验证所有表单async validateAllForms() {try {// 使用 Promise.all 同步验证所有表单await Promise.all([this.validateForm("form1Ref"),this.validateForm("form2Ref"),]);alert("所有表单验证通过");// 在这里执行提交逻辑} catch (error) {alert(error.message); // 提示错误信息}},},
};
</script>

代码说明:
  1. validateForm 方法

    • 将表单验证包装成 Promise,验证通过时调用 resolve,验证失败时调用 reject

  2. validateAllForms 方法

    • 使用 Promise.all 同步验证所有表单。

    • 如果所有表单验证通过,执行后续逻辑(如提交数据)。

    • 如果有表单验证失败,捕获错误并提示用户。

  3. 表单 ref

    • 每个表单需要设置唯一的 ref(如 form1Ref 和 form2Ref)。


动态表单的同步验证

如果表单是动态生成的(例如通过 v-for 循环),可以使用动态 ref 和 Promise.all 实现同步验证。

示例代码:
<template><div><!-- 动态生成表单 --><el-formv-for="(form, index) in forms":key="index":model="form":rules="rules":ref="`formRef${index}`"><el-form-item label="姓名" prop="name"><el-input v-model="form.name"></el-input></el-form-item></el-form><!-- 提交按钮 --><el-button type="primary" @click="validateAllForms">提交所有表单</el-button></div>
</template><script>
export default {data() {return {forms: [{ name: "" }, // 表单 1 数据{ name: "" }, // 表单 2 数据],rules: {name: [{ required: true, message: "请输入姓名", trigger: "blur" },],},};},methods: {// 验证单个表单validateForm(formRef) {return new Promise((resolve, reject) => {this.$refs[formRef][0].validate((valid) => {if (valid) {resolve(); // 验证通过} else {reject(new Error(`表单 ${formRef} 验证失败`)); // 验证失败}});});},// 同步验证所有表单async validateAllForms() {try {// 动态生成验证任务const validationTasks = this.forms.map((_, index) =>this.validateForm(`formRef${index}`));// 使用 Promise.all 同步验证所有表单await Promise.all(validationTasks);alert("所有表单验证通过");// 在这里执行提交逻辑} catch (error) {alert(error.message); // 提示错误信息}},},
};
</script>

总结

  • 使用 Promise.all 可以同步验证多个表单。

  • 每个表单需要设置唯一的 ref,并通过 validate 方法进行验证。

  • 动态表单可以通过动态 ref 和 Promise.all 实现同步验证。

 


http://www.ppmy.cn/ops/149448.html

相关文章

VTK知识学习(29)-交互问题

1、窗体类型 1&#xff09;、RenderWindowControl UserControl derived implementation of vtkRenderWindow for use in Windows Forms applications. The client area of this UserControl is completely filled with an instance of a vtkRenderWindow. 用于Windows窗体应…

本地系统A与云平台B数据对接demo演示

.一、云平台B提供工程类库【.net工程类库&#xff0c;直接调用】 本地系统A-本地电脑调用&#xff0c;电脑连接互联网 云平台B-互联网云平台-提供cs文件&#xff0c;接口文档。 1.c#类库 2.控制台或winform直接调用c#类库&#xff1b; 3.云平台B输出【c#源文件】 4.cs文件端…

【数据链电台】洛克希德·马丁(Lockheed Martin)

洛克希德马丁公司&#xff08;Lockheed Martin&#xff09;是全球领先的航空航天、国防、先进技术和安全领域的供应商之一。 公司为美军及盟国军队提供了广泛的通信系统&#xff0c;包括数据链电台和相关的通信系统。 洛克希德马丁的许多产品用于战术通信、卫星通信、电子战、…

Hadoop 实战笔记(一) -- Windows 安装 Hadoop 3.x

环境准备 安装 JAVA 1.8 Java环境搭建之JDK下载及安装下载 Hadoop 3.3.5 安装包 Hadoop 下载&#xff1a;https://archive.apache.org/dist/hadoop/common/ 一、JAVA JDK 环境检查 二、Hadoop(HDFS)环境搭建 1. 解压安装文件 hadoop-3.3.5.tar 2. 配置环境变量 HADOOP_HO…

【数据分析(一)】初探 Numpy

目录 前言1. 一维 array 的生成2. 一维 array 的基本操作2.1. 查看属性2.2. 花式索引2.3. 条件筛查2.4. 数据统计 3. n 维 array 的生成4. n 维 array 的基本操作4.1. 查看属性4.2. 查询和切片4.3. 花式索引4.4. 矩阵 前言 Numpy是Python的常用开源数值计算扩展库&#xff0c;用…

Docker Compose 教程

Docker Compose 是一个 Docker 容器的依赖管理工具。 例如我们一个服务需要依赖到多个 Docker 容器&#xff0c;那么使用 Docker Compose 这个工具就能很方便的帮助我们管理。 Docker Compose 通过配置文件 .yml。 定义了所有容器的依赖关系。 然后我们只需把我们想要的 Docke…

live555 俗称3个5 h264 rtp

class UsageEnvironment 这个类是顶层的容器&#xff0c;为万物之始。之后有啥new都带上它。 里面有个好宝贝TaskScheduler& fScheduler; f是field的意思&#xff0c;成员变量&#xff0c;与m_同。 class TaskScheduler 定义了 delayed task backgroudhadling even…

添加到 PATH 环境变量中

命令解释 # 将命令中的<CLI_PATH>替换为您aliyun文件的所在目录。 echo export PATH$PATH:<CLI_PATH> >> ~/.bash_profile echo export PATH$PATH:/data2/ljsang/aliyun/aliyun >> ~/.bash_profileexport PATH$PATH:/data2/ljsang/aliyun/aliyun&…