【ElementUI 表单校验】一个 el-form-item 下多个表单校验(循环校验)

news2025/1/18 7:22:36

前端项目开发中,表单的应用是必不可少的,不管使用的原生、还是框架如:ElementUI、Ant Design Vue 等。基本的表单应用比较简单,按照文档中的描述使用即可。

官网地址

如下图:
在这里插入图片描述
使用 ElementUI 中的表单代码如下:

<el-form
  ref="addForm"
  :model="form"
  :rules="rules"
  inline
  label-width="100px"
  class="demo-ruleForm"
>
    <div class="item-title">页面配置</div>
        <div class="left">
          <el-form-item label="客户端:" prop="client" required>
            <el-select
              v-model="form.client"
              placeholder="请选择"
              style="width:300px"
              @change="selectChange($event, 'client')"
            >
              <el-option
                v-for="item in enumObj.client"
                :key="item.value"
                :label="item.label"
                :value="item.value"
                size-full="100%"
              />
            </el-select>
          </el-form-item>
          <el-form-item label="页面名称:" prop="webName">
            <el-input
              v-model="form.webName"
              placeholder="请输入"
              style="width:300px"
            />
          </el-form-item>
          <el-form-item label="H5链接:" prop="webUrl">
            <el-input
              v-model="form.webUrl"
              placeholder="请输入"
              style="width:300px"
            />
          </el-form-item>
          <el-form-item label="选择模板:" prop="selectMode">
            <el-select
              v-model="form.selectMode"
              placeholder="请选择"
              style="width:300px"
              clearable
            >
              <el-option
                v-for="item in enumObj.selectMode"
                :key="item.value"
                :label="item.label"
                :value="item.value"
                size-full="100%"
              />
            </el-select>
          </el-form-item>
          <el-form-item label="页面主标题:" prop="webMainTitle">
            <el-input
              v-model="form.webMainTitle"
              placeholder="不超过19字"
              maxlength="19"
              style="width:300px"
            />
          </el-form-item>
          <el-form-item label="页面副标题" prop="webSubtitle">
            <el-input
              v-model="form.webSubtitle"
              placeholder="不超过30字"
              maxlength="30"
              style="width:300px"
            />
          </el-form-item>
          <el-form-item label="页面背景图" prop="webBack">
            <UploadCover
              ref="webBack"
              :objtype="'webBack'"
              :base-file="form.webBack"
              :width="200"
              :height="200"
              @on-change="setBackImg"
            />
          </el-form-item>
      </div>
</el-form>

是不是很简单呢?而项目开发过程中,批量表单循环校验也是很常见的,如上图,动态添加奖励计算规则,把所有的表单放到了一个 el-form-item 下。也可以理解为 el-form-item 做了嵌套,外层当然也可以省略,样式做微调。
在这里插入图片描述
下面通过代码来详细的看一下。

  1. 模板中的 form 需要绑定 mode、 ref 、rules 这些必需属性(很熟悉了,不用解释干嘛的了)
<el-form
      ref="rewardTaskRuleVoForm"
      :model="rewardTaskRuleVo"
      inline
      label-width="120px"
      :rules="rules">
</el-form>
  1. 定义需要的数据和规则
rewardTaskRuleVo: {
   rewardCalculateFormula: [{}],
}
const checkNumMax = (rule, value, callback) => {
  const index = rule.field.split('').findIndex(item => /[0-9]/.test(item))
  const obj = this.rewardTaskRuleVo.rewardCalculateFormula[rule.field[index]]
  if (!value) {
    callback(new Error('最大单量不能为空'))
  } else if (value <= obj.numMin) {
    callback(new Error('不能小于当前阶梯最小单量,且不能大于下一阶梯最小单量'))
  } else {
    callback()
  }
}
const checkNumMin = (rule, value, callback) => {
  const index = rule.field.split('').findIndex(item => /[0-9]/.test(item))
  const obj = this.rewardTaskRuleVo.rewardCalculateFormula[rule.field[index]]
  if (!value) {
    callback(new Error('最小单量不能为空'))
  } else if (value >= obj.numMax) {
    callback(new Error('不能大于当前阶梯最大单量,且不能低于上一阶梯最大单量'))
  } else {
    callback()
  }
}
rules: {
 numMax: [{ required: true, validator: checkNumMax }],
 numMin: [{ required: true, validator: checkNumMin }],
 amount: [{ required: true, message: '请输入奖励金额', trigger: ['trigger', 'change'] }]
}
  1. 循环的表单 el-form-item 中绑定规则
<el-form-item label="奖励计算公式:" prop="rewardCalculateFormula" required>
  <br>
  <!-- {{ rewardTaskRule    Vo.rewardCalculateFormula }} -->
  <div v-for="(item,index) in rewardTaskRuleVo.rewardCalculateFormula" :key="index" class="formula">
    <div>
      <strong>阶梯 {{ index + 1 }}</strong>
      <div style="float: right">
        <el-link v-if="index > 0" type="primary" style="margin-right: 20px" @click="formulaHandle('minus', index)">删除阶梯</el-link>
        <el-link type="success" @click="formulaHandle('plus', index)">增加阶梯</el-link>
      </div>
    </div>
    <div style="margin-left: 12px">
      <strong>单量:</strong>
      <el-form-item :prop="`rewardCalculateFormula[${index}].numMin`" :rules="rules.numMin"><el-input-number v-model="item.numMin" controls-position="right" :min="index > 0 ? rewardTaskRuleVo.rewardCalculateFormula[index-1].numMax + 1 : 1" :precision="0" size="small" @change="checkMin(item, index)" /></el-form-item>
      ——
      <el-form-item :prop="`rewardCalculateFormula[${index}].numMax`" :rules="rules.numMax"><el-input-number v-model="item.numMax" controls-position="right" :min="1" :precision="0" size="small" @change="checkMax(item, index)" /></el-form-item>
      <strong style="margin-left: 20px">奖励金额:</strong>
      <el-form-item :prop="`rewardCalculateFormula[${index}].amount`" :rules="rules.amount"><el-input-number v-model="item.amount" controls-position="right" :min="1" size="small" /></el-form-item>
    </div>
  </div>
</el-form-item>
  1. 提交表单校验
this.$refs.rewardTaskRuleVoForm.validate(async valid => {
  if (!valid) return this.$message.error('请检查奖励配置输入内容是否符合规则!')
  if (this.rewardTaskRuleVo?.rewardCalculateFormula?.length) {
    const result = this.rewardTaskRuleVo.rewardCalculateFormula.every(v => v.numMax && v.numMin && v.amount)
    if (!result) return this.$message.error('奖励计算公式内容不能为空!')
  }

  this.form.rewardTaskRuleVo = { ...this.rewardTaskRuleVo }
  const data = this.mergeData(this.form)
  
  # .... 接口代码 ....
})
  1. 其它辅助验证代码
checkMax(item, index) {
  this.$nextTick(() => {
    if (item.numMax <= item.numMin) {
      item.numMax = item.numMin + 1
      this.$set(this.rewardTaskRuleVo.rewardCalculateFormula, index, item)
    }

    if (item.numMax >= this.rewardTaskRuleVo.rewardCalculateFormula[index + 1]?.numMin) {
      item.numMax = this.rewardTaskRuleVo.rewardCalculateFormula[index + 1].numMin - 1
    }

    if (this.rewardTaskRuleVo.rewardCalculateFormula[index + 1]) {
      this.rewardTaskRuleVo.rewardCalculateFormula[index + 1].numMin = item.numMax + 1
      this.rewardTaskRuleVo.rewardCalculateFormula[index + 1].numMax = item.numMax + 2
    }
  })
},
checkMin(item, index) {
  this.$nextTick(() => {
    if (item.numMax <= item.numMin) {
      item.numMin = item.numMax - 1
      this.$set(this.rewardTaskRuleVo.rewardCalculateFormula, index, item)
    }
  })
}

数字化管理平台
Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus
Vue权限系统案例
个人博客地址

表单属性

model 表单数据对象
rules 表单验证规则
inline 行内表单模式
label-position 表单域标签的位置,如果值为 left 或者 right 时,则需要设置 label-width string right/left/top right
label-width 表单域标签的宽度,例如 ‘50px’。作为 Form 直接子元素的 form-item 会继承该值。支持 auto
label-suffix 表单域标签的后缀
hide-required-asterisk 是否隐藏必填字段的标签旁边的红色星号
show-message 是否显示校验错误信息
inline-message 是否以行内形式展示校验信息
status-icon 是否在输入框中显示校验结果反馈图标
validate-on-rule-change 是否在 rules 属性改变后立即触发一次验证
size 用于控制该表单内组件的尺寸
disabled 是否禁用该表单内的所有组件。若设置为 true,则表单内组件上的 disabled 属性不再生效

表单方法
validate 对整个表单进行校验的方法,参数为一个回调函数。该回调函数会在校验结束后被调用,并传入两个参数:是否校验成功和未通过校验的字段。若不传入回调函数,则会返回一个 promise Function(callback: Function(boolean, object))
validateField 对部分表单字段进行校验的方法 Function(props: array | string, callback: Function(errorMessage: string))
resetFields 对整个表单进行重置,将所有字段值重置为初始值并移除校验结果
clearValidate 移除表单项的校验结果。传入待移除的表单项的 prop 属性或者 prop 组成的数组,如不传则移除整个表单的校验结果 Function(props: array | string)

表单事件
validate 任一表单项被校验后触发 被校验的表单项 prop 值,校验是否通过,错误消息(如果存在)

表单单项属性
prop 表单域 model 字段,在使用 validate、resetFields 方法的情况下,该属性是必填的 string 传入 Form 组件的 model 中的字段
label 标签文本
label-width 表单域标签的的宽度,例如 ‘50px’。支持 auto
required 是否必填,如不设置,则会根据校验规则自动生成
rules 表单验证规则
error 表单域验证错误信息, 设置该值会使表单验证状态变为error,并显示该错误信息
show-message 是否显示校验错误信息
inline-message 以行内形式展示校验信息
size 用于控制该表单域下组件的尺寸

表单单项 slot 插槽
属性
label 标签文本的内容

作用域插槽 Scoped Slot
name 说明
error 自定义表单校验信息的显示方式,参数为 { error }

方法
resetField 对该表单项进行重置,将其值重置为初始值并移除校验结果 -
clearValidate 移除该表单项的校验结果 -

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/626195.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国产数据库|GBase 8s 安装卸载与简单使用

作者 | JiekeXu 来源 |公众号 JiekeXu DBA之路&#xff08;ID: JiekeXu_IT&#xff09; 如需转载请联系授权 | (个人微信 ID&#xff1a;JiekeXu_DBA) 大家好&#xff0c;我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看国产数据库|GBase 8s 安装卸载与简单使用&#…

POSTGRESQL SERVERLESS 是POSTGRESQL 数据库的未来 (译)

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

Web3能拯救失落的互联网人吗?

随着互联网的发展&#xff0c;人们逐渐感受到了中心化互联网的局限性和不足之处。 Web3 技术作为一种去中心化的互联网形态&#xff0c;为用户提供了更安全、透明和个人主权的在线体验。本文将探讨 Web3 是否能拯救那些在中心化互联网中感到失落的人们&#xff0c;让我们一起探…

LVS负载均衡——DR模式

一、LVS-DR模式 LVS-DR&#xff08;Linux Virtual Server Director Server&#xff09;工作模式&#xff0c;是生产环境中最常用的一 种工作模式。 LVS-DR 模式&#xff0c;Director Server 作为群集的访问入口&#xff0c;不作为网关使用节点 Director Server 与 Real Serve…

软考A计划-电子商务设计师-模拟试题卷二

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

【报告】当“无线通信”遇到“图神经网络”——简单理解

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 课程报告&#xff0c;随便做的&#xff0c;仅供参考~ B站视频&#xff1a;https://www.bilibili.com/video/BV1tM4y1v7t4/ 以下格式默认为&#xff1a;先放图&#xff0c;再放文字 前面的同学介绍了传统方法和经典…

$1$驱动开发

目录 1.驱动大纲&#xff1a; 2.单片机开发属于嵌入式开发吗&#xff1f; 3.RAM裸机代码和驱动有什么区别&#xff1f; 4.Linux系统的组成 5.宏内核、微内核 6.驱动移植 1.驱动大纲&#xff1a; &#xff08;1&#xff09;内核模块 &#xff08;2&#xff09;字符设备驱…

ArchGuard Co-mate:一次关于大语言模型与架构治理、架构设计的探索

在过去的几个月里&#xff0c;为了探索了 LLM 结合 SDLC、BizDevOps 的可能性&#xff0c;我们&#xff08;Thoughtworks 开源社区&#xff09;创建了 ClickPrompt、 AutoDev、DevTi 等一系列的开源项目。从个人的经验来看&#xff0c;未来越来越多的应用将围绕于 LLMCore 设计…

400万总奖金!打一场大厂算法赛事

Datawhale赛事 主办&#xff1a;科大讯飞&#xff0c;伙伴&#xff1a;Datawhale 5月6日&#xff0c;伴随科大讯飞星火认知大模型的发布&#xff0c;2023年度 iFLYTEK A.I. 开发者大赛也正式开启。本届大赛的总奖金池超400万元&#xff0c;除此外还将进一步开放海量数据与核心…

如何使用ArcGIS制作三维地形图

ArcGIS作为专业的GIS软件&#xff0c;不仅可以制作二维地图&#xff0c;制作三维地图也是不在话下&#xff0c;通常我们使用ArcScene来制作三维地图&#xff0c;这里为大家介绍一下制作三维地图的方法&#xff0c;希望能对你有所帮助。 预处理数据 将准备好的矩形面、矩形线和…

Kibana:使用 Kibana 自带数据进行可视化(一)

在今天的练习中&#xff0c;我们将使用 Kibana 自带的数据来进行一些可视化的展示。希望对刚开始使用 Kibana 的用户有所帮助。 前提条件 如果你还没有安装好自己的 Elastic Stack&#xff0c;你可以参考如下的视频来开启 Elastic Stack 并进行下面的练习。你可以开通阿里云检…

接着首发!2023全国1卷数学压轴题解析

早点关注我&#xff0c;精彩不错过&#xff01; 压轴题原题如下&#xff1a; 以下是压轴题速解&#xff0c;上次突出一个细&#xff0c;这次&#xff0c;自己挑战了一把快&#xff01; 去年偶然得闲&#xff0c;在高考当天晚上陷入了少年的回忆&#xff0c;重做了一把高考数学压…

“站在后天看明天”:华为给金融广厦架起数字栋梁

在中国古建筑中&#xff0c;有个重要概念&#xff0c;叫做“栋梁”。其中“栋”是指房屋的东西向正梁&#xff0c;起到承担房屋荷载的作用&#xff1b;“梁”则是支撑楼板和其他承重结构的南北向竖梁&#xff0c;起到构筑受重面&#xff0c;支撑屋顶飞檐斗拱的作用。 精彩绝伦、…

如何安装和使用 Hugging Face Unity API

Hugging Face Unity API 提供了一个简单易用的接口&#xff0c;允许开发者在自己的 Unity 项目中方便地访问和使用 Hugging Face AI 模型&#xff0c;已集成到 Hugging Face Inference API 中。本文将详细介绍 API 的安装步骤和使用方法。 安装步骤 打开您的 Unity 项目导航至菜…

2核4G服务器阿里云和腾讯云性能测试对比

阿里云轻量应用服务器2核4G4M带宽优惠价297.98元12个月&#xff0c;腾讯云轻量2核4G5M服务器168元一年&#xff0c;628元3年&#xff0c;2核4G轻量应用服务器阿里云和腾讯云怎么选择&#xff1f;哪个性能比较好&#xff1f;阿腾云分享轻量应用服务器2核4G配置阿里云和腾讯云价格…

3A(3000mA)输出电流比例阀控制器

0.5A(500mA)、0.8A(800mA)、1A(1000mA)、1.5A(1500mA)、2A(2000mA)、2.5A(2500mA)、3A(3000mA)、3.2A(3200mA)等电流输出控制比例阀放大器是用于控制液压系统中的比例阀线圈驱动阀芯运动。它主要由阀体、驱动线圈和放大器。 比例阀是控制方向、流量或压力的元件&#xff0c;它的…

chatgpt赋能python:Python怎么1加1等于2

Python怎么1加1等于2 Python是一种高级编程语言&#xff0c;通常用于快速开发应用程序&#xff0c;处理数据和进行科学计算。Python是一门易于学习的语言&#xff0c;学习它的基础非常简单。 介绍 Python在计算机科学领域已经有超过20年的历史&#xff0c;它在很多领域都有广…

【新版】系统架构设计师 - 项目管理

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 项目管理考点摘要进度管理工作分解结构&#xff08;WBS&#xff09;关键路径法及几个概念箭线图法&#xff08;双代号网络图&#xff0c;ADM&#xff09;前导图法&#xff08;单代号网络图&#x…

Java利用函数计算工资

1 问题 在平时里&#xff0c;我们经常用到计算问题&#xff0c;很多人只会在main函数里赋值计算&#xff0c;这样计算出的数据没有对象&#xff0c;很混乱。因此&#xff0c;用创建一个类&#xff0c;来进行批量计算&#xff0c;会给我们带来很大便利。 2 方法 (1) 先创建一个w…

CentOS 7 安装 Jenkins

一、准备工作 首选需要CentOS 7 安装 JAVA环境&#xff08;JDK 1.8&#xff09; 1.打开url选择jdk1.8下载 Java Downloads | Oracle 我选择linux x64版本&#xff1a; ​ 2.下载 wget http://download.oracle.com/otn-pub/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa…