【前端】ElementPlus表单数组形式数据自定义校验(必填)

情景

如果是一组动态数组式的数据,需要对每组的每个数据都进行自定义校验,必填星号怎么在每个label上展示。

核心代码

1.自定义rules:
ts 复制代码
const rules = {
  type: [{ required: true, message: '请选择类型', trigger: 'change' }],
  name: [{ required: true, message: '请选择名称', trigger: 'change' }],
  rato: [
    { required: true, message: '请输入比例', trigger: 'blur' },
    {
      pattern: /^(100|[1-9]?\d)(\.\d+)?$/,
      message: '请输入有效的百分比(0-100)',
      trigger: 'blur',
    },
  ],
  rate: [
    { required: true, message: '请输入费率', trigger: 'blur' },
    { pattern: /^(100|[1-9]?\d)(\.\d+)?$/, message: '请输入有效的费率(0-100)', trigger: 'blur' },
  ]
};
2.form表单中使用

重点在于在每一个表单项中使用:**:prop="`${index}.type`"**和 :rules="rules.type"

html 复制代码
<el-form-item label="类型:" :prop="`${index}.type`":rules="rules.type" >

还有用v-for 展示动态的每一组

html 复制代码
<el-form ref="actionFormRef" :model="actionForm" label-width="122px">
      <div v-for="(item, index) in actionForm" :key="index" class="org-container">
        <div class="org-header">
          <div class="org-title">内容{{ index + 1 }}</div>
          <div class="org-action">
            <el-button v-if="index > 0" type="danger" size="small" @click="handleRemoveOrg(index)"
              >删除</el-button
            >
            <el-button type="primary" size="small" @click="handleAddOrg(index)">添加一组</el-button>
          </div>
        </div>
        <el-row :gutter="8">
          <el-col :span="12">
            <el-form-item
              label="类型:"
              :prop="`${index}.type`"
              :rules="rules.type"
            >
              <el-select v-model="item.type" clearable>
                <el-option
                  v-for="item in options1"
                  :key="item.dictValue"
                  :value="item.dictValue"
                  :label="item.dictLabel"
                ></el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item
              label="名称:"
              :prop="`${index}.name`"
              :rules="rules.name"
            >
              <el-select
                v-model="item.name"
                filterable
                clearable
                remote
                placeholder="请输入搜索"
                :remote-method="searchName"
                style="width: 240px"
              >
                <el-option
                  v-for="item in options2"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value"
                />
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item
              label="比例:"
              :prop="`${index}.rato`"
              :rules="rules.rato"
            >
              <el-input v-model="item.rato" placeholder="请输入" clearable />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item
              label="费率:"
              :prop="`${index}.rate`"
              :rules="rules.rate"
            >
              <el-input v-model="item.rate" placeholder="请输入" clearable />
            </el-form-item>
          </el-col>
         </el-row>
      </div>
    </el-form>

这样会对每一项进行必填校验,label上还有标识。

自定义校验

自定义校验需要自定义校验函数。

首先在需要在rules中声明:

ts 复制代码
const rules={
  rate: [
    { validator: validateRates, trigger: 'blur' },
    { required: true, message: '请输入', trigger: 'blur' },
  ],
 }

其次进行函数定义,格式为

ts 复制代码
const validateRates = (rule: any, value: any, callback: any) => {
  // 获取当前正在验证的索引
  const match = rule.field.match(/\[(\d+)\]/);
  const formIndex = match ? parseInt(match[1], 10) : 0;
  const currentForm = actionForm.value[formIndex];
  
  //xxxx自定义校验逻辑,失败则
  if(false)
  callback('此项校验失败');
  
  //校验成功则回返
  callback();
};
相关推荐
Csvn28 分钟前
前端性能优化实战指南
前端
Moment31 分钟前
2026 年,AI 全栈时代到了,前端简历别再只写前端技术了 🫠🫠🫠
前端·后端·面试
糯米团子74939 分钟前
Web Worker
开发语言·前端·javascript
freewlt1 小时前
React Server Components 深度解析
前端·react.js·前端框架
wordbaby1 小时前
一次跨端 Loading 卡死复盘:把请求计数从 Axios 拦截器迁到 try/catch/finally
前端·axios
我命由我123451 小时前
JavaScript 开发 - 获取函数名称、获取函数参数数量、获取函数参数名称
开发语言·前端·javascript·css·html·html5·js
IT_陈寒2 小时前
JavaScript里这个隐式类型转换的坑,我终于爬出来了
前端·人工智能·后端
方呵呵3 小时前
一个 3.5k Star Vue H5 项目的二次进化:我把它重构成了 Monorepo 工程体系
前端
_风满楼3 小时前
HTTP 请求的五种传参方式
前端·javascript·后端
木斯佳3 小时前
前端八股文面经大全:字节暑期前端一面(2026-04-22)·面经深度解析
前端