关于el-form 内嵌列表el-table单选校验处理rules

本文详细介绍了如何在Element-Plus中使用Vue进行动态表单验证,包括整体校验内嵌列表中的必填项,以及针对动态单选项的自定义校验规则实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 通过整体校验设置 内嵌列表table 类别自定义项校验 表格整体校验可触发

动态校验表单字段collectList列表中必填项 fieldName  

// 1 通过索引取值prop  表单校验  
 <el-form-item
      label-width="0px"
      :prop="`collectList[${$index}].fieldName`"
      :rules="[{ required: true, message: '请输入', trigger: ['blur'] }]"
       >
<template> 
    <el-form
        class="form-s"
        :model="formData"
        :rules="rules"
        ref="refProductForm"
        :require-asterisk-position="'right'"
        label-width="135px"
      >
        <el-table
              class="table-form"
              :header-cell-style="{ background: '#f5f7fa', color: '#909399', height: '40px' }"
              :data="formData.collectList"
              style="width: 100%"
            >
              <el-table-column type="index" label="序号" width="55">
                <template #default="{ $index }">
                  {{ $index + 1 }} <span style="color: red">*</span>
                </template>
              </el-table-column>
              <el-table-column label="用户信息" width="190">
                <template #default="{ row, $index }">
                  <div style="height: 46px">
                    <el-form-item
                      label-width="0px"
                      :prop="`collectList[${$index}].fieldName`"
                      :rules="[{ required: true, message: '请输入', trigger: ['blur'] }]"
                    >
                      <ElInput
                        v-model.trim="row.fieldName"
                        placeholder="请输入"
                        clearable
                        :maxlength="10"
                        show-word-limit
                        style="width: 160px"
                      />
                    </el-form-item>
                  </div>
                </template>
              </el-table-column>
    </el-table>
 </el-form>
 <el-button @click="onSubmit(refProductForm)">提交</el-button>
</template>
<script setup lang="ts">
import { reactive, computed, ref } from 'vue'
const refProductForm = ref()
import {
  ElInput,
  ElButton,
  ElIcon,
  ElForm,
  ElFormItem,
  ElMessage,
  FormRules,
  FormInstance,
  ElSelect,
  ElTable,
} from 'element-plus'
const formData = {
    collectList: [{fieldName: '', age: '', id: 1}, {fieldName: '', age: '', id: 222} ], // 表格 数据
    name: '',

    }
const rulesProductForm = reactive<FormRules<form>>({
    collectList: [{ required: true, message: '请添加数据', trigger: ['change',                 
    'blur'] }],
   name: [
     { required: true, message: '请输入name', trigger: ['change', 'blur'] }
   ],

})
const onSubmit = (formEl: FormInstance | undefined) => {
  if (!formEl) return
  formEl.validate((valid) => {
    if (valid) {
        // message: '保存成功',
   
    } else {
        // message: '请完善角色数据信息',
      return false
    }
  })
}
</script>

二、动态单选自定义校验 

1通过遍历  formData.tableList  触发校验

el-table-column label="分页名称"
                    align="left">
       <template #default="{row, $index}">
           <el-form-item :prop="`page_config.${$index}.page_name`"
                         class="page_name"
                         :rules="rules[`page_config.${$index}.page_name`]">
               <el-input placeholder="请输入分页名称"
                         :maxlength="6"
                         v-model.trim="row.page_name"
                         class="page_name-input"
                         @change="validate"
                         show-word-limit
                         clearable />
           </el-form-item>
       </template>
   </el-table-column>

  // 触发校验 单选或者走提交触发
const rulesChange = () =>{
    this.formData.tableList.forEach((item, index) => {
        refFrom.value!.validateField(`tableList.${index}.page_name`);
        //...其他字段age time
    })
}
//  遍历单项校验 对应el-item-form校验规则
//  <el-form-item :prop="`page_config.${$index}.page_name`"
//                                class="page_name"
//                                :rules="rules[`page_config.${$index}.page_name`]">
//                                 prop 与 rules对应关系值

  const rules = computed(() => {
     const rules = {};
     this.currentValue.page_config.forEach(
         (row: any, index: number): void => {
             rules[`page_config.${index}.page_name`] = {
                 trigger: "change",
                 messageEmpty: "请输入分页名称",
                 messageRepeat: "此分页名称重复",
                 validator: this.validateFieldRepeat
             };
            //...其他字段age time
         }
     );
     return rules;
 })
        
/**
 * 通用-数组项 是否重复 必填校验
 */
validateFieldRepeat(rule: any, value: any, callback: any): void {
    const fullField = String(rule.fullField).split(".");
    const [itemPro1, $index, itemPro2] = fullField;
    const val = fullField.reduce(
        (prev: any, cur: string) => (prev ? prev[cur] : undefined),
        this.currentValue
    );
    const flag = this.currentValue[itemPro1].some(
        (item: any, i: number) =>
            item[itemPro2] === val && i != Number($index)
    );
    callback(
        !val ? rule.messageEmpty : flag ? rule.messageRepeat : undefined
    );
}


const onSubmit = (formEl: FormInstance | undefined) => {
    rulesChange()
  if (!formEl) return
  formEl.validate((valid) => {
    if (valid) {
        // message: '保存成功',
   
    } else {
        // message: '请完善角色数据信息',
      return false
    }
  })
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值