Vue 3 + Element Plus 实现「动态表单组件」详解教程

✅ Vue 3 + Element Plus 实现「动态表单组件」详解教程

📌 适用场景:表单字段根据配置动态生成,支持校验、提交、自定义组件、复杂布局等。

🧩 技术栈:Vue 3 + TypeScript + Element Plus
🔧 核心特性:动态渲染 + 校验规则 + 支持 Slot + 响应式数据 + 提交与重置封装


🧠 一、实现思路概览

🔹1. 表单配置项(FormSchema)

  • 类型:FormSchema[]
  • 内容:字段名、label、组件类型、校验规则、组件属性等

🔹2. 响应式数据绑定

  • 自动从配置生成 formModel
  • 用于表单的双向绑定

🔹3. 动态渲染组件

  • 根据 component 字段动态渲染 ElInputElSelect、自定义组件等

🔹4. 校验规则

  • 同样从配置中读取 rules,应用在 ElForm

🔹5. 插槽与扩展性

  • 支持通过 v-slot 插入插槽或自定义组件

🧩 二、FormSchema 类型定义

// types/form-schema.ts
export type ComponentType = 'Input' | 'Select' | 'DatePicker' | 'Custom'export interface FormSchema {field: string // 字段名label: string // 标签component: ComponentType // 组件类型colProps?: Record<string, any> // 栅格列属性componentProps?: Record<string, any> // 组件绑定属性options?: { label: string; value: any }[] // 下拉选项(用于Select)required?: boolean // 是否必填rules?: any[] // 校验规则slot?: string // 自定义slot名称
}

💡 三、核心组件 DynamicForm.vue

<template><el-formref="elFormRef":model="formModel":rules="formRules"label-width="100px":inline="false"><el-row :gutter="20"><el-colv-for="item in props.schemas":key="item.field"v-bind="item.colProps || { span: 24 }"><el-form-item :label="item.label" :prop="item.field"><!-- slot 优先 --><slot v-if="item.slot" :name="item.slot" :model="formModel" /><!-- 渲染内置组件 --><componentv-else:is="getComponent(item)"v-model="formModel[item.field]"v-bind="item.componentProps"><!-- 处理Select选项 --><el-optionv-if="item.component === 'Select'"v-for="opt in item.options":key="opt.value":label="opt.label":value="opt.value"/></component></el-form-item></el-col></el-row></el-form>
</template><script setup lang="ts">
import { reactive, watch, ref, defineExpose } from 'vue'
import type { FormSchema } from '@/types/form-schema'
import { ElForm } from 'element-plus'const props = defineProps<{schemas: FormSchema[]modelValue?: Record<string, any>
}>()const elFormRef = ref<InstanceType<typeof ElForm>>()
const formModel = reactive<Record<string, any>>({})
const formRules = reactive<Record<string, any>>({})/** 初始化表单数据与校验 */
const initForm = () => {props.schemas.forEach((schema) => {formModel[schema.field] = props.modelValue?.[schema.field] ?? ''if (schema.required || schema.rules) {formRules[schema.field] = schema.rules || [{ required: true, message: `${schema.label}不能为空`, trigger: 'blur' }]}})
}watch(() => props.schemas, initForm, { immediate: true })/** 组件映射 */
const getComponent = (item: FormSchema) => {switch (item.component) {case 'Input':return 'el-input'case 'Select':return 'el-select'case 'DatePicker':return 'el-date-picker'case 'Custom':return item.slot || 'div'default:return 'el-input'}
}/** 对外暴露方法 */
defineExpose({formModel,validate: () => elFormRef.value?.validate(),resetFields: () => elFormRef.value?.resetFields()
})
</script>

🧪 四、使用示例

<template><dynamic-form ref="formRef" :schemas="schemas" v-model="formData"><!-- slot 示例:自定义图片上传组件 --><template #avatarUpload="{ model }"><el-upload:action="'/upload'":on-success="(res) => (model.avatar = res.url)":file-list="[]"><el-button type="primary">上传头像</el-button></el-upload></template></dynamic-form><el-button @click="handleSubmit">提交</el-button><el-button @click="handleReset">重置</el-button>
</template><script setup lang="ts">
import DynamicForm from '@/components/DynamicForm.vue'
import type { FormSchema } from '@/types/form-schema'const formRef = ref()
const formData = ref({})const schemas: FormSchema[] = [{ field: 'name', label: '姓名', component: 'Input', required: true },{ field: 'age', label: '年龄', component: 'Input' },{field: 'gender',label: '性别',component: 'Select',options: [{ label: '男', value: 'male' },{ label: '女', value: 'female' }]},{field: 'avatar',label: '头像',component: 'Custom',slot: 'avatarUpload'}
]const handleSubmit = () => {formRef.value?.validate().then(() => {console.log('✅ 提交数据:', formData.value)}).catch(() => {console.log('❌ 表单校验失败')})
}const handleReset = () => {formRef.value?.resetFields()
}
</script>

🧭 五、进阶扩展建议

方向建议
🔌 自定义组件注册使用 componentMap 实现动态映射自定义组件
🧪 表单校验提示优化validate-on-rule-change 配合 trigger: 'blur'
📦 动态表单 + 分步表单可集成 <el-steps> 做分布式配置
🌐 接口驱动配置表单 schema 从接口返回配置 JSON,支持后端驱动
🌈 表单联动逻辑加入字段 watch,响应联动修改(如 A 变动时隐藏 B)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88697.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地部署开源时间跟踪工具 Kimai 并实现外部访问( Windows 版本)

Kimai 是一款开源的时间跟踪工具&#xff0c;它易于使用&#xff0c;并提供了强大的报告功能&#xff0c;在个人和团队记录工作时间、项目时间和活动时间等之后可以帮助用户了解他们是如何花费时间的&#xff0c;从而提高生产力和效率。本文将详细介绍如何在 Windows 系统本地部…

系统分析师案例知识点

目录 1 必做题1.1 状态机图1.2 活动图1.3 统一软件开发过程RUP 2 需求分析2.1 数据流图DFD2.2 ER图2.3 状态转换图STD2.4 数据字典2.5 流程图2.6 需求评审2.7 设计类2.8 FAST分析2.9 常见的关系类 3 嵌入式3.1 容器技术3.2 虚拟机技术3.3 虚拟机和容器的不同点 4 数据库4.1 NoS…

多相机人脸扫描设备如何助力高效打造数字教育孪生体?

在教育数字化转型浪潮中&#xff0c;数字孪生体作为现实教育场景的虚拟映射&#xff0c;正成为智慧教育发展的关键技术支点。传统教育模式面临师资资源分布不均、个性化教学难以覆盖、跨时空教学场景受限等痛点&#xff0c;而数字孪生体通过构建高仿真虚拟教育主体&#xff08;…

用 EXCEL/WPS 实现聚类分析:赋能智能客服场景的最佳实践

聚类分析作为无监督学习的核心技术&#xff0c;能在客服数据中发现隐藏的用户群体或问题模式。尽管 Excel/WPS 并非专业统计软件&#xff0c;但巧妙利用其内置功能&#xff0c;也能实现基础的聚类分析&#xff0c;为中小型客服团队提供快速洞察。以下介绍具体方法及智能客服场景…

基于定制开发开源AI智能名片S2B2C商城小程序源码的H5游戏开发模式创新研究

摘要 本文以定制开发开源AI智能名片S2B2C商城小程序源码为技术底座&#xff0c;探讨其在H5游戏开发中的创新应用。通过分析原生开发与第三方工具两种传统开发模式的局限性&#xff0c;提出将AI智能名片的多模态内容生成能力、S2B2C商城的生态协同机制与H5游戏开发深度融合的解…

vue3+ELInput无法输入的问题

vue3ElInput无法输入的问题 开篇 写业务的时候发现&#xff0c;因为想偷懒嘛&#xff0c;直接就在想在外部去定义一个变量&#xff0c;然后写个弹窗里&#xff08;tsx&#xff09;的el-input&#xff0c;而不是又去写个vue页面&#xff0c;但发现就输入不了了&#xff0c;而且…

SQL Server:如何检测和修复 FILESTREAM 数据库损坏?

SQL Server 中的 FILESTREAM 功能可以将二进制大型对象 &#xff08;BLOB&#xff09; 存储到文件系统上&#xff0c;而不是将它们存储在数据库中。但是&#xff0c;默认情况下不启用此功能。用户需要使用 SQL Server Management Studio &#xff08;SSMS&#xff09; 和 SQL S…

FORCE 开发者论坛 | 火山引擎发布多款 Agent 开发工具

资料来源&#xff1a;火山引擎-开发者社区 6 月 12 日&#xff0c;2025 火山引擎 FORCE 原动力大会开发者论坛成功举办。大会聚焦 Agent 开发新范式&#xff0c;升级发布了 PromptPilot、MCP Servers、TRAE、扣子开发平台等产品&#xff0c;以及多款开源项目&#xff0c;构建起…

【Qt-windows】如何使用perfmon 具体分析windows serverR2的Qt程序CPU问题

可以使用 Windows 自带的 PerfMon&#xff08;Performance Monitor&#xff09; 工具对运行在 Windows Server R2 上的 Qt 程序进行详细的性能分析&#xff0c;尤其是 CPU 使用情况。以下是具体的操作步骤和建议&#xff1a; 一、打开 PerfMon 工具 按下 Win R 打开运行窗口。…

【软考高级系统架构论文】论NoSQL数据库技术及其应用

论文真题 随着互联网web2.0网站的兴起,传统关系数据库在应对web2.0 网站,特别是超大规模和高并发的web2.0纯动态 SNS 网站上已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。 NoSQL(Not only SQL )的产生就是为了解…

bash的配置文件,source

一.按生效范围分类 二.按shell登录的方式分类 这里的执行顺序存疑,因为会互相调用,不需要记忆 source执行脚本 source不创建子进程,bash创建子进程 普通脚本:用bash 配置文件脚本:用source 三.按功能分类

30道C语言高频题整理(附答案背诵版)

1.请描述一下C语言的基本数据类型有哪些&#xff1f; C语言提供了一系列的基本数据类型&#xff0c;它们是构建更复杂数据结构的基础。这些基本数据类型主要包括&#xff1a; 整型&#xff08;Integer Types&#xff09;&#xff1a;用于存储整数值。根据存储大小和符号性&…

使用Tailwind CSS和i18n的react实践

首先在 src 下设置 i18n.js 文件 // src/i18n.js import i18n from i18next; import { initReactI18next } from react-i18next;import en from ./locales/en/public; import zh from ./locales/zh/public;i18n.use(initReactI18next) .init({resources: {en: { translation:…

生信自学路线|R语言的数据变量类型与对应运算

R 是一种动态类型语言&#xff0c;使用灵活&#xff0c;变量无需预先声明类型。掌握 R 的数据类型和变量机制&#xff0c;是后续进行数据处理和建模分析的基础。本章节主要介绍 R 语言中的常量、变量、基本数据类型及常用数据结构&#xff0c;并结合示例进行说明。 文章目录 一…

UI前端大数据处理优化策略:提升数据处理速度与准确性

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字化浪潮下&#xff0c;前端面临的数据规模正呈指数级增长 ——IDC 预测&#xff0c;2025…

技术调研:时序数据库(二)

除了 InfluxDB、TDengine 和 TimescaleDB&#xff0c;还有其他多个主流的开源时序数据库&#xff0c;各自针对不同场景优化。以下是补充的时序数据库选型清单&#xff0c;涵盖其核心特性、适用场景及局限性&#xff1a; 1. 监控与运维场景 (1) Prometheus 核心优势&#xff1…

【C++/C】十进制数转为十六进制时,如何区分正负? 负数补码高位是1,那么一个很大的正数,高位也会出现1,会和负数搞混吗?

文章目录 1 十进制数转为十六进制时&#xff0c;如何区分正负&#xff1f;1.1 正数处理1.2 负数处理‌1.3 关键点‌ 2 负数补码高位是1&#xff0c;那么一个很大的正数&#xff0c;高位也会出现1&#xff0c;会和负数搞混吗&#xff1f;2.1 符号位明确区分‌2.2 补码的数值范围…

Elasticsearch 如果保证读写一致

Elasticsearch 通过多机制组合保障读写一致性&#xff0c;针对高并发场景优化设计&#xff0c;具体实现如下&#xff1a; 一、写入一致性控制‌ ‌1.1 一致性级别参数&#xff08;consistency&#xff09;‌ 写操作时指定分片确认数量&#xff0c;确保数据可靠同步&am…

内嵌lua解释器 作为组件命令调试

给不同的组件传递不通的参数 好处就是调试代码 只在 lua 代码出现&#xff0c;同时为设备初始化 增加了外部脚本配置的功能接口

Excel工具箱WPS版 增强插件 文本处理、批量录入 数据对比 高级排序

各位Excel办公达人们&#xff0c;今天咱来聊聊方方格子Excel工具箱V3.6.6.0&#xff08;WPS版&#xff09;&#xff01;这玩意儿啊&#xff0c;就是专门给WPS Office用户量身打造的Excel增强插件。它集成了上百项实用功能&#xff0c;能帮咱高效处理数据、优化表格操作&#xf…