Appearance
表单组件
**本文引用的文件** - [baseForm.vue](file://app/devicemate-app/components/dd-form/baseForm.vue) - [dynamic-form.vue](file://dm/lemes-web/src/components/std/form/dynamic-form.vue) - [le-form.vue](file://dm/lemes-web/src/components/std/form/le-form.vue) - [le-select.vue](file://dm/lemes-web/src/components/std/form/le-select.vue) - [le-upload.vue](file://dm/lemes-web/src/components/std/form/le-upload.vue) - [index.vue](file://dm/lemes-web/src/components/Tinymce/index.vue) - [form.js](file://dm/lemes-web/src/directive/form.js) - [validate.js](file://dm/lemes-web/src/utils/validate.js) - [le-form-example.vue](file://dm/lemes-web/src/views/example/form/le-form-example.vue)目录
简介
本文件面向 DeviceMate 项目,系统化梳理表单组件体系,覆盖动态表单、标准表单与富文本编辑器三类能力。重点包括:
- 动态表单:基于配置驱动的表单项渲染与联动校验
- 标准表单:统一的字段布局、校验规则合并与事件绑定
- 富文本编辑器:基于 TinyMCE 的可视化编辑与内容管理
- 表单验证机制、数据绑定与事件处理
- 组件可复用性设计、属性配置与插槽使用
- 与 Element UI 的集成方式、样式定制与主题适配
- 使用示例、最佳实践与常见问题解决方案
- 性能优化、用户体验提升与可访问性设计建议
项目结构
DeviceMate 的表单相关代码主要分布在两套前端工程中:
- 小程序端(devicemate-app):包含基础表单组件 baseForm.vue,用于移动端场景的表单渲染与上传等
- Web 管理端(lemes-web):包含标准表单 le-form.vue、动态表单 dynamic-form.vue、通用选择器 le-select.vue、上传组件 le-upload.vue,以及富文本编辑器 Tinymce/index.vue
图表来源
- baseForm.vue:1-672
- dynamic-form.vue:1-117
- le-form.vue:1-262
- le-select.vue:1-62
- le-upload.vue:1-246
- index.vue:1-249
- form.js:1-39
- validate.js:1-114
章节来源
- baseForm.vue:1-672
- dynamic-form.vue:1-117
- le-form.vue:1-262
- le-select.vue:1-62
- le-upload.vue:1-246
- index.vue:1-249
- form.js:1-39
- validate.js:1-114
核心组件
- 基础表单(小程序端):支持输入框、下拉选择、日期/时间选择、图片/文件上传、审核弹窗与按钮区,具备禁用态控制与必填校验联动
- 标准表单(Web 端):按字段配置渲染,支持多种内置组件与插槽扩展;动态加载远程枚举并合并校验规则
- 动态表单(Web 端):根据 formItemList 渲染表单项,支持远程枚举加载与输入联动
- 通用选择器:支持字符串形式的多选绑定
- 通用上传:封装 Element Upload,支持图片/文件、自动上传与手动上传两种模式
- 富文本编辑器:TinyMCE 集成,支持工具栏、菜单栏、全屏切换与内容变更事件
章节来源
- baseForm.vue:42-121
- le-form.vue:1-40
- dynamic-form.vue:1-24
- le-select.vue:1-62
- le-upload.vue:1-29
- index.vue:1-8
架构总览
整体架构围绕“配置驱动 + 组件组合”的思路展开:
- 配置层:通过 props 传递表单模型、字段清单、校验规则、远程动作等
- 渲染层:根据字段类型与组件映射,渲染对应控件
- 数据层:双向绑定 innerValue,监听变更并向上派发 input 事件
- 校验层:合并全局规则与字段级规则,支持远程校验
- 交互层:上传、选择、日期时间、富文本等增强交互
图表来源
详细组件分析
基础表单(小程序端)
- 功能要点
- 输入框、下拉选择、日期/时间选择、图片/文件上传、审核弹窗与底部按钮区
- 必填联动禁用:当存在未完成上传或字段为空时,提交按钮禁用
- 审核流程:弹窗选择“通过/不通过”,支持填写意见
- 只读态:根据类型切换显示模式(只读文本或上传预览)
- 关键流程
- 字段渲染:根据 item.type 判断渲染类型
- 选择器:支持本地列表、字典码远程加载、或自定义函数
- 上传:自动上传到指定地址,维护 fileList 并回显图片/文件
- 提交:汇总 model 与 fileList,向上派发 submit 事件
图表来源
章节来源
标准表单(Web 端)
- 功能要点
- 字段级组件映射:Input、Select、TimePicker、DatePicker、DateTimePicker、File
- 插槽扩展:支持具名插槽 slot,灵活替换复杂控件
- 远程枚举:按 action 加载 Select 下拉数据,支持多选、创建、默认值
- 校验合并:将全局 rules 与字段 rules 合并,支持远程校验器
- 日期兼容:对异常日期字符串进行容错处理与格式化
- 关键流程
- 初始化:监听 items,异步加载 action 对应的枚举数据
- 渲染:根据字段配置与 actionConfig 合并后的 item 渲染
- 校验:validateAction 远程校验,支持 blur/change 触发
- 数据流:innerValue 双向绑定,向外派发 input 事件
图表来源
章节来源
动态表单(Web 端)
- 功能要点
- 通过 formItemList 驱动渲染,支持输入框与选择器
- 远程枚举:按 type 异步加载 Select 数据
- 输入联动:watch innerValue,支持条件校验与防抖
- 关键流程
- 初始化:监听 formItemList,按需加载枚举
- 数据绑定:value -> innerValue,innerValue -> input
- 校验:validateValue 条件校验,避免无效写入
图表来源
章节来源
通用选择器(Web 端)
- 功能要点
- 支持字符串形式的多选绑定,通过 multipleStringSplit 控制分隔符
- 内部维护 selectedValues,对外派发 input 事件
- 关键流程
- value 变更:解析为数组或直接赋值
- selectedValues 变更:按分隔符拼接字符串或原样派发
图表来源
章节来源
通用上传(Web 端)
- 功能要点
- 支持图片/文件上传,自动上传与手动上传两种模式
- 限制数量、文件类型与大小,错误提示与成功回调
- 预览、删除、下载等交互
- 关键流程
- 初始化:根据 value 解析 fileList
- 上传:before-upload 校验,on-success 汇总文件
- 数据流:files -> input,支持字符串逗号连接
图表来源
章节来源
富文本编辑器(Web 端)
- 功能要点
- 基于 TinyMCE,支持工具栏、菜单栏、全屏切换
- 内容变更监听,向上派发 input 事件
- CDN 动态加载,支持国际化语言
- 关键流程
- 初始化:动态加载 TinyMCE 资源
- 编辑:NodeChange/Change/KeyUp/SetContent 事件触发 input
- 生命周期:mounted/activated/deactivated/destroyed 管理实例
图表来源
章节来源
依赖关系分析
- 组件耦合
- 标准表单依赖通用选择器与上传组件,形成“表单 + 专业控件”的组合
- 动态表单依赖远程枚举接口,强调“配置即数据”
- 基础表单与 Element UI 无直接耦合,采用小程序 UI 组件
- 外部依赖
- TinyMCE CDN 资源与本地静态资源路径
- Element Upload/Select/DatePicker 等第三方组件
- 指令与工具
- 自定义指令:禁用多选标签的取消按钮
- 校验工具:常用正则与空值判断
图表来源
- le-form.vue:42-49
- dynamic-form.vue:97-113
- baseForm.vue:1-672
- index.vue:22-22
- form.js:1-39
- validate.js:1-114
章节来源
- le-form.vue:1-262
- dynamic-form.vue:1-117
- baseForm.vue:1-672
- index.vue:1-249
- form.js:1-39
- validate.js:1-114
性能考量
- 渲染优化
- 标准表单在加载远程枚举时使用 Promise.all 并延迟渲染,减少白屏与重复请求
- 动态表单仅在需要时加载枚举,避免不必要的网络开销
- 事件节流/防抖
- 基础表单对输入事件使用防抖,降低频繁校验与状态更新
- 上传优化
- 上传计数与禁用联动,避免并发上传导致的数据不一致
- 上传前本地校验文件类型与大小,减少无效请求
- 资源加载
- 富文本编辑器按需加载 TinyMCE 资源,避免首屏体积过大
- DOM 生命周期
- 富文本编辑器在 deactivated/destroyed 主动销毁实例,防止内存泄漏
章节来源
故障排查指南
- 表单提交按钮不可用
- 检查是否存在未完成上传(uploadSuccessCount > 0)
- 校验必填字段是否为空
- 参考:checkDisabled:421-442
- 上传失败或文件未回显
- 确认 headers 中的 Authorization 是否正确
- 检查 before-upload 校验(类型/大小)
- 参考:beforeUpload:360-394,beforeAvatarUpload:154-164
- 日期/时间选择异常
- 标准表单对异常日期字符串做了容错处理与格式化
- 参考:loadSelectListByAction 日期处理:183-223
- 多选标签无法取消
- 使用指令 defaultSelect 控制默认标签的关闭图标
- 参考:directive/form.js:5-38
- 富文本编辑器空白或无法编辑
- 确认 TinyMCE 资源已成功加载
- 检查初始化回调与内容设置
- 参考:initTinymce:116-146
章节来源
结论
DeviceMate 的表单体系以“配置驱动 + 组件组合”为核心,兼顾移动端与 Web 端的不同需求。通过标准表单与动态表单的协同,实现了高扩展与低耦合;配合通用选择器、上传组件与富文本编辑器,满足多样化的业务场景。建议在实际使用中:
- 明确字段配置与远程枚举策略,减少不必要的网络请求
- 合理使用校验规则与远程校验,保证数据质量
- 注重上传与富文本的生命周期管理,避免资源泄漏
- 通过插槽与指令扩展复杂交互,保持组件简洁可复用
附录
- 使用示例
- 标准表单示例:le-form-example.vue:10-24
- 最佳实践
- 字段级规则优先,全局规则兜底
- 多选字符串绑定时明确分隔符
- 上传组件尽量使用自动上传,必要时开启手动上传
- 富文本编辑器在路由切换时主动销毁实例
- 可访问性建议
- 为必填字段添加星号标识与 aria-required
- 上传组件提供错误提示与键盘可操作性
- 富文本编辑器提供替代文本与无障碍说明