el-form表单数组的验证

1、使用key可以刷新vue组件

<component :key="ts"> </component>
https://juejin.cn/post/7044551605269561380

2 el-form表单数组的验证

<template>
  <div :class="ns.b()">
    <content-section theme="border" title="车辆清单">
      <WrapperForm
        ref="formInstanceRef"
        :model="formData"
        class="flex basic-gap flex-col"
      >
        <el-row
          v-for="(item, index) in formData.carList"
          :key="index"
          class="flex w-full"
        >
          <el-col :span="10">
            <el-form-item
              :rules="{
                required: true,
                message: '请选择车辆',
                trigger: 'blur'
              }"
              label="车辆选择"
              :prop="`carList.${index}.flightZoneDeicingCarId`"
            >
              <el-input
                v-model="item.flightZoneDeicingCarId"
                :placeholder="DEFAULT_INPUT_PLACEHOLDER"
              />
            </el-form-item>
          </el-col>
          <el-col :span="10">
            <el-form-item
              label="数量"
              :prop="`carList.${index}.num`"
              :rules="{
                required: true,
                message: '请选择车辆',
                trigger: 'blur'
              }"
            >
              <el-input-number
                v-model="item.num"
                class="w-full"
                :placeholder="DEFAULT_INPUT_PLACEHOLDER"
              />
            </el-form-item>
          </el-col>
          <el-col :span="3" :class="ns.e('mg-left')">
            <el-button
              icon="el-icon-plus"
              type="primary"
              circle
              @click="newItem"
            />
            <el-button
              icon="el-icon-minus"
              type="danger"
              circle
              @click="removeItem(index)"
            />
          </el-col>
        </el-row>
      </WrapperForm>
    </content-section>
  </div>
</template>

<script setup lang="ts">
import { useNamespace } from '@/hooks'
import type { AddFlightZoneDeicingCarListDto } from '@/api/airfield-area-safety/flight-zone-deicing-car/interface'
type FormData = Partial<AddFlightZoneDeicingCarListDto[]>
import type { FormInstance, FormRules } from 'element-plus'
import { DEFAULT_INPUT_PLACEHOLDER } from '@/constants'
const formData = ref<{
  carList: AddFlightZoneDeicingCarListDto[]
}>({
  carList: [
    {
      flightZoneDeicingCarId: '',
      num: 0
    }
  ]
})
const formInstanceRef = ref<FormInstance>()
const ns = useNamespace('car-list-add')

function newItem() {
  formData.value.carList.push({
    flightZoneDeicingCarId: '',
    num: 0
  })
}
function removeItem(index: number) {
  formData.value.carList.splice(index, 1)
}

async function validate() {
  return formInstanceRef.value!.validate()
}

async function getFormData() {
  return formData.value
}

defineExpose({
  getFormData,
  validate
})
</script>

<style scoped lang="scss">
@include b(car-list-add) {
  @include e(mg-left) {
    margin-left: 10px;
  }
}
</style>

vue组件再Typescript的引用写法

const addCarRef = shallowRef<InstanceType>()

const formRules = ref<FormRules<FormData>>({
  high: [
    {
      required: true,
      validator: validateProp
    }
  ],
  mid: [
    {
      required: true,
      validator: validateProp
    }
  ]
})
const formRef = ref<WrapperFormInstance>()
// 初始化表单
function createData(): FormData {
  return {
    projectId: userStore.currentProjectInfo?.projectId,
    high: '',
    mid: ''
  }
}
function validateProp(rule: any, value: any, callback: any) {
  if (formData.value.high == formData.value.mid && formData.value.high) {
    return callback(new Error('预案配置优先级不能重复配置'))
  }
  return callback()
}
const aiDetectionServerIdRule = computed(() => [
  {
    required: formData.value.isAiDetection === 1,
    message: '请选择',
    trigger: 'blur'
  }
])
const ivsServerIdRule = computed(() => [
  {
    required: formData.value.ipcCompany === 'HUAWEI',
    message: '请选择',
    trigger: 'blur'
  }
])

watchEffect(() => {
  formRules.aiDetectionServerId = aiDetectionServerIdRule.value
  formRules.ivsServerId = ivsServerIdRule.value
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值