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) { .... // 即可
相关推荐
石小石Orz2 分钟前
因为没有使用路由懒加载,产生了一个难以寻找的bug
前端
Mintopia2 分钟前
Three.js 力导向图:让数据跳起优雅的华尔兹
前端·javascript·three.js
墨渊君17 分钟前
React Native 跨平台组件库实践: GlueStack UI 上手指南
前端
晓得迷路了25 分钟前
栗子前端技术周刊第 84 期 - Vite v7.0 beta、Vitest 3.2、Astro 5.9...
前端·javascript·vite
独立开阀者_FwtCoder28 分钟前
最全301/302重定向指南:从SEO到实战,一篇就够了
前端·javascript·vue.js
Moment37 分钟前
给大家推荐一个超好用的 Marsview 低代码平台 🤩🤩🤩
前端·javascript·github
小满zs41 分钟前
Zustand 第三章(状态简化)
前端·react.js
普宁彭于晏42 分钟前
元素水平垂直居中的方法
前端·css·笔记·css3
恋猫de小郭1 小时前
为什么跨平台框架可以适配鸿蒙,它们的技术原理是什么?
android·前端·flutter
云浪1 小时前
元素变形记:CSS 缩放函数全指南
前端·css