基于 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) 复制代码
相关推荐
Dream-Y.ocean2 小时前
鸿蒙PC平台宅匠 3D 室内设计适配实战:基于 Electron 壳方案的 Three.js 双渲染引擎与参数化户型编辑器开发
javascript·3d·harmonyos
Csvn3 小时前
性能监控
前端
Highcharts.js3 小时前
Highcharts Gantt使用符号的自定义数据标签开发甘特图示例
javascript·甘特图·highcharts·图表开发·实战代码·响应式图表
Csvn3 小时前
构建工具
前端
FRing034 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
Java小卷4 小时前
JuanForm vs FormCreate!Vue3 表单引擎联动配置 PK!
vue.js·低代码
kyriewen6 小时前
Skills 榜前 10 我全装了:只有 3 个能直接用
前端·javascript·程序员
IT_陈寒6 小时前
当Java的hashCode遇上Lombok,我的缓存被全清了
前端·人工智能·后端
工控丫丫7 小时前
帆软看板中经常使用的公式函数及经常搭的组合
前端·javascript·数据库
jerrywus7 小时前
我用 GPT-6.1-sol 做了台会讲解的 3D 售货机:60 罐饮料,一口没喝上
前端·agent·claude