【前端】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();
};
相关推荐
用户214118326360219 小时前
Qwen 3-VL 实测:从图片生代码到视频提字幕,这个多模态模型有多能打?
前端
寒山李白19 小时前
npm镜像源配置指南
前端·npm·node.js
GeniuswongAir20 小时前
Flutter实现滑动页面停留吸附
前端·javascript·flutter
颜酱20 小时前
基于Antd的SchemaForm 的表单复杂配置
前端·javascript·ant design
专注VB编程开发20年20 小时前
vb.net COM DLL 示例,实现了所有 VB6 X86 数据类型的对应
开发语言·前端·vb.net·com·vb6·activex dll
要加油哦~20 小时前
vue 构建工具如何选择 | vue-cli 和 vite的区别
前端·javascript·vue.js
李剑一21 小时前
为了免受再来一刀的痛苦,我耗时两天开发了一款《提肛助手》
前端·vue.js·rust
红尘散仙21 小时前
使用 Tauri Plugin-Store 实现 Zustand 持久化与多窗口数据同步
前端·rust·electron
沙白猿1 天前
npm启动项目报错“无法加载文件……”
前端·npm·node.js
tyro曹仓舒1 天前
彻底讲透as const + keyof typeof
前端·typescript