【前端】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();
};
相关推荐
GreenTea19 小时前
GrokBot 核心成员 Lauren Tan:每月交付 2000 个 PR 的人,是怎么用 AI 的
前端·后端·架构
mCell20 小时前
用 Knip 清理 AI Coding 留下的冗余代码
前端·ai编程·前端工程化
笃行35021 小时前
使用Rokid AIUI做了一个童年推箱子游戏
前端
excel1 天前
前端加密的作用与使用场景
前端
计算机魔术师1 天前
纽约时报版权诉讼披露:微软高管内部称训练 AI 是人类历史上最大规模劳动窃取
前端
去伪存真1 天前
大模型的参数量为什么那么大?
前端·人工智能
IT_陈寒1 天前
Java空指针这次真把我坑惨了
前端·人工智能·后端
八荒启·交互动画1 天前
# Web特效020—让 Web 特效真正动起来:时间循环应该怎么接
前端·webgl·网页特效·八荒启-交互动画·八荒启
动恰客流统计1 天前
线下零售数字化浪潮下,客流统计的3个核心发展趋势
大数据·前端·人工智能
用户938515635071 天前
从小米前端面试题,彻底搞懂闭包、作用域链与 useState 惰性初始化
前端·面试