Vue3、Element Plus使用v-for循环el-form表单进行校验

在开发中遇到了这样一个需求

有一个form是通过v-for生成出来的,并且数量不确定,每个表单中的字段都需要做校验,就将自己的解决方法记录了下来。

在这里插入图片描述

在这里插入图片描述

完整代码如下

<template>
  <div class="for-form">
    <el-button type="primary" @click="addHandle">新 增</el-button>

    <div class="form-box">
      <div class="form-item" v-for="(item, index) in formList" :key="index">
        <el-form :model="item" :rules="rules" label-width="auto" style="max-width: 300px" label-position="top"
          :ref="($event) => handle($event, index)">
          <el-form-item label="名称" prop="name">
            <el-input v-model="item.name" placeholder="请输入名称" />
          </el-form-item>
          <el-form-item label="手机号" prop="phone">
            <el-input v-model="item.phone" placeholder="请输入手机号" />
          </el-form-item>
          <el-form-item label="性别" prop="sex">
            <el-radio-group v-model="item.sex">
              <el-radio :value="1" size="small"></el-radio>
              <el-radio :value="2" size="small"></el-radio>
            </el-radio-group>
          </el-form-item>
          <el-form-item label="爱好" prop="hobby" v-if="item.sex == 2">
            <el-input v-model="item.hobby" placeholder="请输入爱好" />
          </el-form-item>
        </el-form>
      </div>
    </div>

    <el-button type="primary" @click="saveHandle">保 存</el-button>
  </div>
</template>

<script setup lang="ts">
import { reactive, toRefs } from 'vue'

const state = reactive({
  form: {} as any,
  formList: [] as any,
  rules: {
    name: [
      { required: true, message: 'Please input Activity name', trigger: 'blur' },
    ],
  },
  formRefs: [] as any
})

const { formList, rules } = toRefs(state)

function addHandle() {
  state.formList.push({
    name: "",
    phone: "",
    sex: 1,
    hobby: "",
  })
}

function handle(e: any, index: any) {
  // 保存下每个ref
  state.formRefs[index] = e
}

async function saveHandle() {
  let isSubmit: boolean[] = []
  // 循环上面记录下来的ref对每个进行校验
  for (const el of state.formRefs) {
    await el.validate((valid: any) => {
      // 每个 ref 校验成功或者失败都以布尔值存储下来
      if (valid) {
        isSubmit.push(true)
      } else {
        isSubmit.push(false)
      }
    })
  }

  // 只有当 isSubmit 存的值全是 true 时表示每个表单都校验成功了
  // 然后就可以提交了
  let has = isSubmit.every(i => i == true)
  if (has) {
    console.log("可以提交")
  }
  console.log(state.formRefs)
  console.log(isSubmit)
}

</script>

<style scoped lang="scss">
.form-box {
  display: flex;
  align-items: flex-start;

  .form-item {
    margin-right: 20px;
  }
}
</style>

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-18 13:32:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-18 13:32:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-18 13:32:04       82 阅读
  4. Python语言-面向对象

    2024-06-18 13:32:04       91 阅读

热门阅读

  1. JVM-GC-G1垃圾回收器

    2024-06-18 13:32:04       24 阅读
  2. PostgreSQL源码分析 —— FunctionScan

    2024-06-18 13:32:04       22 阅读
  3. mysql集群,两主两从,使用mysql-proxy实现读写分离

    2024-06-18 13:32:04       30 阅读
  4. MySQL WHERE子句的使用和优化方法

    2024-06-18 13:32:04       32 阅读
  5. 使用 MyBatis 日志插件实现日志记录

    2024-06-18 13:32:04       37 阅读
  6. PostgreSQL源码分析——CHECKPOINT

    2024-06-18 13:32:04       28 阅读
  7. linux 查看进程启动方式

    2024-06-18 13:32:04       31 阅读
  8. 遗传规划与符号回归,挖掘表达式或者因子

    2024-06-18 13:32:04       32 阅读
  9. 【python库】timm

    2024-06-18 13:32:04       29 阅读