el-form表单在循环里如何写rules表单校验,解决办法

el-form表单在循环里如何写rules表单校验,解决办法

在日常开发中我们经常可以遇到 在form中 循环嵌套多个的情况 比如点击加减新增删除 并且还需要校验表单如何写呢?

实现办法

1.html (举例)

html 复制代码
contractFeesForm 为总数据源 
 <el-form :model="contractFeesForm" ref="contractFeesFormRef" :rules>
 这里的rules需动态生成
<div v-for="(contractItem, contractIndex) in contractFeesForm.payment">
  <el-divider></el-divider>
  <el-row :gutter="24">
    <el-col :span="8">
     这里 我们既然是在循环内 在每个item上绑定的 prop 就不能是固定写死的 不然没办法进行表单校验 就需要写成 xxxx[0,1,2......].属性值这样的 index 为动态的
      <el-form-item :prop="`payment[${contractIndex}].payment_type`" label="名称">
        <el-select
          v-model="contractItem.payment_type"
          filterable
          clearable
          placeholder="请选择"
        >
          <el-option v-for="v in paymentList" :label="v.name" :value="v.id" />
        </el-select>
      </el-form-item>
    </el-col>
    <el-col :span="8">
    	这个地方也同理 对应该el-select的数据源
      <el-form-item :prop="`payment[${contractIndex}].payment_unit`" label="名称">
        <el-select v-model="contractItem.payment_unit" filterable clearable placeholder="请选择">
          <el-option v-for="v in paymentunitList" :label="v.name" :value="v.id" />
        </el-select>
      </el-form-item>
    </el-col>
    <el-col :span="8">
    	 这个地方也同理 对一个该el-select的数据源
      <el-form-item :prop="`payment[${contractIndex}].payment_mode`" label="名称">
        <el-select v-model="contractItem.payment_mode" filterable clearable placeholder="请选择">
          <el-option v-for="v in paymentmodeList" :label="v.name" :value="v.id" />
        </el-select>
      </el-form-item>
    </el-col>
  </el-row>
 </div>

2.js

typescript 复制代码
// 动态生成校验规则
const rules = ref()
//rules方法封装
const generateFieldRules = (fields: string[], message: string) => {
//fields 为 payment[1,2,3...].xxx
//message 为 提示校验的内容
  return fields.reduce(
    (acc, field) => {
      acc[field] = [{ required: true, message, trigger: 'blur' }]
      return acc
    },
    {} as Record<string, any>
  )
}
const updateRules = () => {
  const newRules: Record<string, any> = {}
  //我们获取payment这个数组并进行forEach 循环 主要是获取 index 和 字段名拼接
  contractFeesForm.value.payment.forEach((_, index) => {
    const paymentFields = [ // 这里的字段就是需要校验的字段
      'payment_type',
      'payment_unit',
      'payment_mode'
       ... ]
    //使用Object.assign进行对象拼接拷贝
    Object.assign(
      newRules,
      //在这里调用上面封装好的rules方法将对应的 field 和 index 拼接进去
      generateFieldRules(
        paymentFields.map((field) => `payment[${index}].${field}`),
        '请输入'
      )
    )
  })
  //校验赋值
  rules.value = { ...newRules }
}
// 初始更新校验规则
updateRules()

3,然后我们在确认校验操作逻辑里

typescript 复制代码
const contractFeesFormRef = ref<FormInstance | null>(null)
contractFeesFormRef.value.validate(async (valid: boolean) => {
    if (valid) { .... // 即可
相关推荐
华洛13 分钟前
利好打工人,openclaw不是企业提效工具,而是个人助理
前端·javascript·产品经理
xkxnq23 分钟前
第六阶段:Vue生态高级整合与优化(第93天)Element Plus进阶:自定义主题(变量覆盖)+ 全局配置与组件按需加载优化
前端·javascript·vue.js
A黄俊辉A1 小时前
vue css中 :global的使用
前端·javascript·vue.js
小码哥_常2 小时前
被EdgeToEdge适配折磨疯了,谁懂!
前端
小码哥_常2 小时前
从Groovy到KTS:Android Gradle脚本的华丽转身
前端
灵感__idea2 小时前
Hello 算法:复杂问题的应对策略
前端·javascript·算法
chushiyunen2 小时前
python中的内置属性 todo
开发语言·javascript·python
麦麦鸡腿堡2 小时前
JavaWeb_请求参数,设置响应数据,分层解耦
java·开发语言·前端
soso19683 小时前
JavaScript性能调优实战案例
javascript
Dxy12393102164 小时前
CSS常用样式详解:从基础到进阶的全面指南
前端·css