当前位置: 首页 > article >正文

使用vue3+el-form实现动态新增名称,值,并对名称进行必填校验

使用vue3+el-form实现动态新增名称,值,并对名称进行必填校验

效果图

在这里插入图片描述

代码

<template>
  <el-form :model="form" :rules="rules" ref="dynamicForm">
    <!-- 动态添加的名称和值 -->
    <el-row v-for="(item, index) in form.items" :key="index">
      <el-col :span="8">
        <el-form-item :prop="'items.' + index + '.key'" :rules="rules.key">
          <el-input v-model="item.key" placeholder="请输入" :disabled="disabled"></el-input>
        </el-form-item>
      </el-col>
      <el-col :span="8">
        <el-form-item>
          <el-input v-model="item.value" placeholder="请输入" :disabled="disabled"></el-input>
        </el-form-item>
      </el-col>
      <el-col :span="8">
        <el-button @click="addItem(index)" :disabled="disabled">+</el-button>
        <el-button type="danger" @click="removeItem(index)" :disabled="disabled">-</el-button>
      </el-col>
    </el-row>

    <!-- 添加按钮 -->
    <!--    <el-button type="primary" @click="addItem">Add Item</el-button>-->

    <!-- 提交按钮 -->
    <!--    <el-button type="success" @click="submitForm">Submit</el-button>-->
  </el-form>
</template>

<script setup name="dynamicsForm">
import { ref, reactive, defineProps, watch } from 'vue'
const props = defineProps({
  defaultData: {
    type: [Object, Array]
  },
  disabled: {
    type: Boolean,
    default: false
  }
})
const dynamicForm = ref(null) // 表单引用
const form = reactive({
  items: [] // 动态表单项
})

const rules = reactive({
  key: [{ required: true, message: '请输入', trigger: 'blur' }]
})

// 添加表单项
const addItem = index => {
  // form.items.push({ key: '', value: '' });
  form.items.splice(index + 1, 0, { key: '', value: '' })
}

// 移除表单项
const removeItem = index => {
  form.items.splice(index, 1)
}

// 提交表单
const submitForm = () => {
  dynamicForm.value.validate(valid => {
    if (valid) {
      alert('Form submitted successfully!')
      console.log('Form Data:', form.items)
    } else {
      alert('Form validation failed!')
      return false
    }
  })
}
// 校验表单
const validateForm = async () => {
  const result = {
    status: true,
    data: form.items
  }
  result.status = await dynamicForm.value.validate()
  return result
}
watch(
  () => props.defaultData,
  val => {
    form.items = val && val.length > 0 ? val : [{ key: '', value: '' }]
  },
  {
    immediate: true
  }
)
defineExpose({
  validateForm
})
</script>

<style scoped>
.el-form-item {
  margin-bottom: 20px;
}
</style>


http://www.kler.cn/a/590734.html

相关文章:

  • npm 报错 unable to resolve dependency tree
  • 企业级 GitLab 开发流程全解
  • 功能强大的电脑硬件检测及驱动安装工具
  • 突破 HTML 学习瓶颈:表格、列表与表单的学习进度(一)
  • docker4-容器命令及其案例
  • SpringBoot-已添加并下载的依赖,reload和mvn clean 后还是提示找不到jar包问题
  • 东芝2323AMW纸盒和输稿器安装注意事项(也适用于2523A等白壳机)
  • Spring Boot集成MQTT完整示例和常见问题的解决方案
  • Netty基础—8.Netty实现私有协议栈二
  • 激光slam学习笔记10---ubuntu2004部署运行fastlivo2踩坑记录
  • 【Ratis】ReferenceCountedObject接口的作用及参考意义
  • springboot多种生产打包方式教程
  • 【从零开始学习计算机】计算机网络(一)计算机网络分层结构
  • javaEE————文件IO(1)
  • MySQL使用pxc实现高可用
  • Day34 | 300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组、1143. 最长公共子序列
  • 卓越的用户体验需要智能内容
  • MiddleVR for Unity插件
  • Linux FILE文件操作1-文件指针、文件缓冲区(行缓冲、全缓冲、无缓冲)的验证
  • Java学习------抽象类和接口