基于 vue3 的动态表单组件设计与实现

这段代码实现了一个基于 Element Plus 的通用表单弹窗组件,主要用于创建和编辑应用授权信息。下面是对代码的详细分析:

1. 组件结构

模板部分 (<template>)

  • 使用了 el-dialog 作为弹窗容器,支持居中显示和追加到 body
  • 内部包含一个可滚动的表单区域 (el-scrollbar)
  • 表单使用 el-form 实现,支持动态生成表单项
  • 表单项通过 v-for 循环 formItems 数组动态生成
  • 支持多种表单控件类型:input、select、radio、switch、checkbox、input-number、tree-select、date-picker、text 等
  • 底部有确定和取消按钮

脚本部分 (<script setup>)

  • 使用 Vue 3 的 <script setup> 语法
  • 定义了组件 props 和 emits
  • 实现了表单数据管理、验证、提交等功能
  • 支持异步获取选项数据、表单项监听、计算属性等高级功能

2. 主要功能

动态表单生成

  • 通过 modalConfig.formItems 配置动态生成表单

  • 每个表单项可以配置:

    • 类型 (type)
    • 标签 (label)
    • 属性 (attrs)
    • 验证规则 (rules)
    • 选项 (options 或异步获取方法 fetchOptions)
    • 事件处理 (events)
    • 监听器 (watch, watchEffect, computed)

数据管理

  • formData 存储表单数据

  • formRules 存储验证规则

  • 提供方法操作表单数据:

    • getFormData() - 获取表单数据
    • setFormData() - 设置表单数据
    • setFormItemData() - 设置单个表单项数据

弹窗控制

  • setModalVisible() - 显示弹窗并可设置初始数据
  • handleClose() - 隐藏弹窗
  • handleCloseModal() - 关闭弹窗时重置表单

表单提交

  • 使用 useThrottleFn 对提交方法进行节流
  • 提交前执行验证
  • 支持 beforeSubmit 钩子处理数据格式
  • 提交成功后显示消息并触发事件

3. 具体实现分析

优点

  1. 高度可配置 :通过 modalConfig 可以灵活配置表单的各种属性
  2. 动态性强:支持动态表单项、异步选项加载、各种表单控件
  3. 功能完善:包含表单验证、数据格式化、节流提交、弹窗控制等
  4. 代码复用:通用组件可以在多个地方复用

4. 具体配置分析 (modalConfig)

配置了一个用于应用授权管理的表单,包含以下字段:

  1. 应用选择 (appId)

    • 类型:select
    • 异步获取应用列表
    • 编辑模式下禁用
  2. 经营单位选择 (ouId)

    • 类型:select
    • 异步获取经营单位列表
    • 编辑模式下禁用
  3. API调用次数限制 (apiLimits)

    • 类型:input-number
    • 最小值 0
  4. 授权日期范围 (authDateFrom, authDateTo)

    • 类型:date-picker
    • 提交前会格式化日期

5. 改进建议

  1. 移除多余的 <template> 嵌套
  2. 增加更详细的错误处理和用户反馈
  3. 考虑将 prepareFuncs 的逻辑优化,避免潜在的内存泄漏
  4. 增加表单控件的默认值处理
  5. 考虑添加表单加载状态指示

6. 使用示例

markdown 复制代码
javascript
	// 父组件中使用

	import modalConfig from './modalConfig';

	 

	const modalRef = ref();

	 

	// 显示弹窗

	function showModal() {

	  modalRef.value.setModalVisible();

	}

	 

	// 处理提交

	function handleSubmit() {

	  // 刷新列表等操作

	}

	</script>

	 

	<template>

	  <UniversalModal ref="modalRef" :modal-config="modalConfig" @submit-click="handleSubmit" />

	</template>

这个组件设计得非常灵活,可以适应多种表单场景,特别是需要动态生成表单或有多样表单控件的情况。通过合理的配置,可以快速实现各种表单功能而无需重复编写模板代码。

js(https://code.juejin.cn/pen/7532770366641405961) 复制代码
相关推荐
有味道的男人9 分钟前
搜好货平台关键词商品搜索接口:分页容错与商品数据轻量化提取方案
服务器·前端·javascript
lovingsoft1 小时前
Chrome Lighthouse 详解
前端·chrome
Qlly1 小时前
全栈工程师怎么接需求?从一句「加个功能」聊到能开发、能验收
前端·后端
马可家的菠萝1 小时前
你的微信“文件传输助手”,是不是已经成了第二个网盘?
前端·后端·架构
略略略啦1 小时前
Vibe Coding 基于Spec DD和TDD的实践指南
前端
shmily麻瓜小菜鸡1 小时前
前端实现图片与PDF文字识别敏感信息打码方案
前端·pdf·状态模式
打工仔折腾 AI1 小时前
LangChain 工具调用实战:从 Tool 定义到 Agent 执行链路拆解
java·前端·人工智能·后端·python·langchain·ai agent 实战
汉堡大王95272 小时前
单次输出拉到100万Token:拆完 Gemini 4 Argon 的续写协议,才看懂谷歌这7个月在憋什么
前端·人工智能·后端
看浪的路人2 小时前
第9讲:大模型应用监控与可观测性——OpenTelemetry + Prometheus + Grafana 全链路追踪
java·前端·spring
内存过载2 小时前
用表格模拟甘特图:项目排期的土办法
前端·低代码