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
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 Element UI 的 `el-form` 组件来验证数组是否为空,您可以使用自定义校验规则。以下是一个示例代码: ```html <template> <el-form ref="myForm" :model="form" :rules="rules" label-width="120px"> <el-form-item label="数组选项" prop="arrayOptions"> <el-select v-model="form.arrayOptions" multiple placeholder="请选择"> <el-option label="选项1" value="option1"></el-option> <el-option label="选项2" value="option2"></el-option> <el-option label="选项3" value="option3"></el-option> </el-select> </el-form-item> <el-button type="primary" @click="validateForm">提交</el-button> </el-form> </template> <script> export default { data() { return { form: { arrayOptions: [] }, rules: { arrayOptions: [ { type: 'array', required: true, message: '请选择至少一个选项', trigger: 'blur' } ] } }; }, methods: { validateForm() { this.$refs.myForm.validate(valid => { if (valid) { alert('验证通过'); } else { alert('验证失败'); } }); } } }; </script> ``` 在上面的示例中,我们通过 `ref` 属性给 `el-form` 组件命名为 `"myForm"`,并定义了一个名为 `"form"` 的数据对象,其中包含了一个数组类型的属性 `"arrayOptions"`。我们还定义了一个名为 `"rules"` 的规则对象,其中 `"arrayOptions"` 属性的规则指定了该字段为数组类型,且必填。 在提交按钮的点击事件中,我们通过 `this.$refs.myForm.validate` 方法来触发验证。如果验证通过,弹出提示 "验证通过";如果验证失败,弹出提示 "验证失败"。 通过这种方式,您可以使用 `el-form` 组件来验证数组是否为空。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值