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) { .... // 即可
相关推荐
lichenyang4534 小时前
技术穿刺怎么做?以企业知识库问答为例,验证风险、方案和投入
前端·后端
PedroQue995 小时前
uni-app x工程化实战:从页面堆到可维护架构
前端·uni-app
开开心心_Every5 小时前
免费压缩软件WinRAR无弹窗、广告干扰
java·开发语言·前端·spring·智能手机·word·winrar
特立独行的猫A5 小时前
用仓颉语言写桌面应用:cj-tauri 框架与 AI 笔记软件 cjnote 实战
前端
特立独行的猫A5 小时前
我为什么推荐用仓颉语言的cj-tauri 写桌面应用(附 cjnote 最小的markdown笔记AI软件)
前端
纸片人5 小时前
牛一越界,大屏 3 秒飞到它身边:我用真实卫星数据 + Three.js 做了个 3D 智慧牧场
前端
cc_瀚海知行5 小时前
工具调用 6|助手什么时候该停下来?
java·服务器·前端·人工智能·python·ai
溪语流沙6 小时前
【Web全栈进阶】Nginx反向代理 + HTTPS:正式上线
前端·vue.js·python·nginx·https·fastapi
vivo互联网技术6 小时前
域名埋点零侵入实时校验实践:基于代理转发与规则驱动的工具设计
前端·测试·监控·代理·埋点