Skip to content

表单组件开发

**本文引用的文件** - [baseForm.vue](file://app/devicemate-app/components/dd-form/baseForm.vue) - [dictMixins.js](file://app/devicemate-app/utils/dictMixins.js) - [request.js](file://app/devicemate-app/config/request.js) - [form.vue](file://app/devicemate-app/pages/user/form.vue) - [baseUrl.js](file://app/devicemate-app/config/baseUrl.js)

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本指南围绕 DeviceMate 表单组件(dd-form)进行系统性解析,重点覆盖以下方面:

  • 基础表单组件的设计与实现:动态字段生成、数据绑定、交互控制与事件流
  • 字典与远程数据联动:下拉选择、字典加载与本地缓存策略
  • 表单校验与禁用态控制:必填项检测、上传进度阻塞、按钮可用性联动
  • 数据收集、格式化与提交:模型拼装、文件列表合并、异步上传与提交
  • 实战示例与扩展开发:字段类型、验证规则、样式定制与最佳实践

项目结构

  • 组件层:dd-form/baseForm.vue 提供统一表单容器与交互行为
  • 工具层:dictMixins.js 提供字典加载与名称映射能力
  • 请求层:config/request.js 封装统一请求与鉴权头注入
  • 页面示例:pages/user/form.vue 展示如何配置与使用表单组件
  • 基础配置:baseUrl.js 提供上传与接口域名

图表来源

章节来源

核心组件

  • 组件职责

    • 动态渲染表单字段:根据配置 props 逐项生成输入控件
    • 数据绑定与变更:双向绑定 model,实时更新字段值
    • 交互控制:下拉选择、日期/时间选择、图片上传、审核弹窗
    • 禁用态与按钮联动:基于必填与上传状态动态控制提交按钮
    • 事件发射:提交、选择变更、禁用状态变化、审核操作
  • 关键特性

    • 字典联动:支持静态 list、远程字典编码 dictCode、自定义函数
    • 文件上传:多文件上传、上传进度计数、上传完成前禁止提交
    • 审核流程:弹窗选择“通过/不通过”,可选填写意见
    • 只读模式:根据 formConfig.type 切换只读或编辑态

章节来源

架构总览

下图展示从页面到组件再到服务的整体调用链路。

图表来源

详细组件分析

组件类图

图表来源

章节来源

字段类型与动态生成

  • 支持类型
    • 普通输入框:normal-input(文本/数字/文本域)
    • 下拉选择:select-input(支持静态 list、远程字典 dictCode、自定义函数)
    • 日期选择:calendar-input(日期/范围等)
    • 时间选择:time-input(可配置年月日/时分秒)
    • 图片上传:upload-input(多文件、带进度、只读态显示图片/文件列表)
  • 渲染逻辑
    • 通过 props 数组逐项渲染 u-form-item,并根据 type 切换对应控件
    • 必填标记与占位符逻辑:未赋值时显示占位提示
    • 只读态:根据 formConfig.type 切换是否可编辑

章节来源

数据绑定与事件流

  • 输入绑定
    • 普通输入:inputChange 同步更新 model[prop]
    • 选择/日期/时间:选择确认后写回 model 并触发禁用态检查
  • 禁用态控制
    • checkDisabled:若存在未完成上传或必填字段为空,则禁用提交按钮
    • 通过 emit('disabled', flag) 通知父级按钮状态

图表来源

章节来源

字典与远程数据联动

  • 优先级
    • 若 item.list 存在且非空:直接使用本地 list
    • 若 item.customFunc 存在:调用自定义函数获取数据
    • 否则按 dictCode 远程拉取字典并缓存到 item.list
  • 名称映射
    • getDictName:根据 dictValue 在 list 中匹配 name

图表来源

章节来源

上传与文件处理

  • 上传入口
    • beforeUpload:并发上传多个文件,维护 uploadSuccessCount 计数
    • 成功后将服务端返回的文件对象写入 fileList
  • 只读态展示
    • getImg:筛选图片并以 HTML 形式渲染
    • getFiles:筛选非图片文件并展示下载链接
  • 提交拦截
    • submit:若仍有上传任务未完成则提示并阻止提交

图表来源

章节来源

审核流程

  • 弹窗选择:通过/不通过
  • 不通过时可选填写意见
  • confirmModal:将选择与意见通过事件传递给父级

章节来源

页面使用示例

  • 页面 form.vue 通过传入 formConfig 定义字段、模型与默认值
  • 支持多种字段类型:普通输入、数字输入、时间选择、文本域、上传
  • 提交时接收 model,结合 fileList 进行业务提交

章节来源

依赖关系分析

  • 组件对工具与配置的依赖
    • 字典:通过 dictMixins.js 的 getDict 与 getDictName
    • 请求:通过 request.js 的 get/post 注入鉴权头
    • 上传:通过 baseUrl.js 拼接上传地址
  • 组件内部耦合
    • 与 uView 组件组合使用(u-form、u-form-item、u-input、u-select、u-calendar、u-picker、u-upload、u-modal、u-button)
    • 与 uni API 交互(uni.uploadFile、uni.downloadFile、uni.showToast、uni.showLoading)

图表来源

章节来源

性能考量

  • 防抖与节流
    • 输入变更采用防抖策略,降低频繁计算与渲染压力
  • 上传并发与计数
    • 多文件上传并发执行,使用计数器确保全部完成后才允许提交
  • 懒加载与缓存
    • 字典按需加载并缓存到字段配置中,避免重复请求
  • 渲染优化
    • 条件渲染与只读态切换,减少不必要的 DOM 更新

章节来源

故障排查指南

  • 上传未完成即提交
    • 现象:点击提交提示“还有图片在上传中”
    • 排查:确认 uploadSuccessCount 是否归零;检查 beforeUpload 的 complete 回调是否执行
  • 必填字段导致按钮不可用
    • 现象:按钮始终禁用
    • 排查:检查 formConfig.props 中 required 字段是否赋值;确认 checkDisabled 逻辑
  • 下拉字典不显示
    • 现象:选择框空白
    • 排查:确认 dictCode 是否正确;若使用自定义函数,确认返回值结构;检查 getDict 返回结果
  • 上传地址或鉴权问题
    • 现象:上传失败或 401
    • 排查:确认 baseUrl.js 地址;检查 request.js 注入的 Authorization 是否有效

章节来源

结论

dd-form 基础表单组件通过清晰的配置驱动与完善的交互控制,实现了字段动态生成、字典联动、文件上传与禁用态联动等关键能力。结合页面示例与工具层封装,开发者可以快速搭建复杂表单场景,并通过扩展字段类型、自定义校验与样式定制进一步提升用户体验与开发效率。

附录

配置项与使用要点

  • formConfig
    • type:表单类型(如 apply/approval 等),决定只读与底部按钮显示
    • props:字段数组,每项包含 label、prop、type、required、align、position、inputType、maxlength、timeParams、calendarMode、customFunc、dictCode、list 等
    • model:字段值模型,初始值在此定义
    • labelWidth、maxDate:标签宽度与日期最大值
  • 事件
    • submit:提交时触发,返回 model 与 fileList
    • baseForm-selectChange:选择变更时触发,返回 prop 与选中项
    • change:表单值或文件列表变化时触发
    • disabled:禁用态变化时触发
    • approval:审核弹窗确认时触发,返回选择与意见

章节来源