# 动态表单组件组使用文档 > **版本**: v1.0.0 > **作者**: 动态表单组件组 > **创建时间**: 2025-01-24 --- ## 📋 目录 1. [组件概述](#组件概述) 2. [核心组件](#核心组件) 3. [字段组件](#字段组件) 4. [工具函数](#工具函数) 5. [Composable](#composable) 6. [使用示例](#使用示例) 7. [API文档](#api文档) 8. [最佳实践](#最佳实践) --- ## 组件概述 动态表单组件组是资产管理系统的核心组件库,用于支持不同设备类型的自定义字段渲染和验证。 ### 主要特性 - ✅ 支持多种字段类型(text、number、date、select、multiselect、boolean、textarea、tree等) - ✅ 动态验证规则(必填、长度、正则、自定义验证) - ✅ 字段联动(显示/隐藏、启用/禁用、值联动) - ✅ 栅格布局支持 - ✅ 响应式设计 - ✅ TypeScript完整类型支持 - ✅ 统一的API接口 ### 组件清单 | 组件名称 | 文件路径 | 功能说明 | |---------|---------|---------| | DynamicFieldRenderer | `@/components/form/DynamicFieldRenderer.vue` | 动态字段渲染器(核心组件) | | FieldDesigner | `@/components/form/FieldDesigner.vue` | 字段配置设计器 | | TextField | `@/components/form/fields/TextField.vue` | 单行文本输入 | | NumberField | `@/components/form/fields/NumberField.vue` | 数字输入 | | TextareaField | `@/components/form/fields/TextareaField.vue` | 多行文本输入 | | DateField | `@/components/form/fields/DateField.vue` | 日期选择器 | | SelectField | `@/components/form/fields/SelectField.vue` | 下拉选择器 | | MultiSelectField | `@/components/form/fields/MultiSelectField.vue` | 多选下拉 | | BooleanField | `@/components/form/fields/BooleanField.vue` | 开关/复选框 | | TreeSelect | `@/components/common/TreeSelect.vue` | 树形选择器 | --- ## 核心组件 ### DynamicFieldRenderer 动态字段渲染器 最核心的组件,根据字段配置动态渲染表单。 #### 基础用法 ```vue ``` #### Props | 参数 | 类型 | 默认值 | 说明 | |------|------|--------|------| | modelValue | `FormData` | - | 表单数据(v-model) | | fields | `FieldConfig[]` | [] | 字段配置列表 | | readonly | `boolean` | false | 是否只读模式 | | labelWidth | `string \| number` | '120px' | 标签宽度 | | labelPosition | `'left' \| 'right' \| 'top'` | 'right' | 标签位置 | | gutter | `number` | 20 | 栅格间隔 | | dependencies | `FieldDependency[]` | [] | 字段联动配置 | #### Emits | 事件名 | 参数 | 说明 | |--------|------|------| | update:modelValue | `(value: FormData)` | 表单数据更新 | | field-change | `(event: FieldChangeEvent)` | 字段值变化 | | validation-change | `(state: FormValidationState)` | 验证状态变化 | #### Methods | 方法名 | 参数 | 返回值 | 说明 | |--------|------|--------|------| | validateField | `(fieldName: string)` | `Promise` | 验证单个字段 | | validateForm | - | `Promise` | 验证整个表单 | | resetForm | - | `void` | 重置表单 | | clearValidation | - | `void` | 清除验证 | | setFieldValue | `(fieldName: string, value: any)` | `void` | 设置字段值 | | getFieldValue | `(fieldName: string)` | `any` | 获取字段值 | | getFormData | - | `FormData` | 获取表单数据 | | setFormData | `(data: FormData)` | `void` | 设置表单数据 | --- ## 字段组件 ### FieldConfig 字段配置 ```typescript interface FieldConfig { id: string // 字段唯一标识 name: string // 字段名称(用于提交) label: string // 字段标签(显示名称) fieldType: FieldType // 字段类型 required?: boolean // 是否必填 defaultValue?: any // 默认值 placeholder?: string // 占位符 options?: Array<{ // 选项(select/multiselect) label: string value: any disabled?: boolean }> validationRules?: { // 验证规则 min?: number max?: number pattern?: string custom?: (value: any, allData: Record) => boolean | string customMessage?: string } span?: number // 栅格占列数(1-24) visible?: boolean | ((data: Record) => boolean) // 是否显示 disabled?: boolean | ((data: Record) => boolean) // 是否禁用 description?: string // 字段描述 className?: string // 自定义类名 treeData?: TreeNode[] // 树形数据(tree类型) multiple?: boolean // 是否多选(tree类型) } ``` ### 字段类型(FieldType) | 类型 | 说明 | 组件 | |------|------|------| | `text` | 单行文本 | TextField | | `textarea` | 多行文本 | TextareaField | | `number` | 数字输入 | NumberField | | `date` | 日期选择 | DateField | | `select` | 下拉选择 | SelectField | | `multiselect` | 多选下拉 | MultiSelectField | | `boolean` | 开关/复选框 | BooleanField | | `tree` | 树形选择 | TreeSelect | | `url` | URL链接 | TextField(带验证) | | `email` | 邮箱 | TextField(带验证) | | `phone` | 手机号 | TextField(带验证) | --- ## 工具函数 ### fieldValidator 字段验证器 ```typescript import { validateField, validateFields } from '@/utils/fieldValidator' // 验证单个字段 const result = validateField(value, field, allFormData) // 返回: { isValid: boolean, errors: string[] } // 验证所有字段 const errors = validateFields(data, fields) // 返回: Record ``` ### FieldDependencyManager 字段联动管理器 ```typescript import { FieldDependencyManager, DependencyConditions, DependencyActions } from '@/utils/fieldDependency' const manager = new FieldDependencyManager() // 添加联动配置 manager.addDependency({ sourceField: 'deviceType', targetField: 'cpu', type: 'show', condition: DependencyConditions.equals('desktop') }) // 触发联动 const results = manager.trigger('deviceType', 'desktop', formData) ``` --- ## Composable ### useDynamicForm 动态表单状态管理。 ```typescript import { useDynamicForm } from '@/composables/useDynamicForm' const { formData, // 表单数据 validationErrors, // 验证错误 isValid, // 是否有效 isDirty, // 是否已修改 isSubmitting, // 是否正在提交 setFieldValue, // 设置字段值 validateField, // 验证字段 validateAll, // 验证所有 resetForm, // 重置表单 getFormData, // 获取表单数据 submitForm // 提交表单 } = useDynamicForm(fields) ``` ### useFieldConfig 字段配置管理。 ```typescript import { useFieldConfig } from '@/composables/useFieldConfig' const { loadFieldConfig, // 加载字段配置 getCachedFieldConfig, // 获取缓存配置 clearCache // 清除缓存 } = useFieldConfig() // 加载设备类型的字段配置 const fields = await loadFieldConfig(deviceTypeId) ``` --- ## 使用示例 ### 示例1:基础表单 ```vue ``` ### 示例2:带字段联动 ```vue ``` ### 示例3:自定义验证 ```vue ``` --- ## API文档 ### 类型定义完整参考 详见 `@/types/form.ts` ### 常见问题 **Q: 如何动态加载选项?** A: 使用字段联动配置的 `setValue` 类型配合异步函数: ```typescript { sourceField: 'category', targetField: 'product', type: 'setValue', condition: () => true, action: async () => { const products = await api.getProducts() return products } } ``` **Q: 如何实现条件验证?** A: 使用 `custom` 验证函数: ```typescript validationRules: { custom: (value, allData) => { if (allData.type === 'special' && !value) { return '特殊类型必须填写此字段' } return true } } ``` --- ## 最佳实践 ### 1. 字段命名规范 - 使用camelCase命名:`assetName`、`purchaseDate` - 避免使用保留字:`name`、`id`、`value` - 使用语义化命名:`cpuModel` 而非 `field1` ### 2. 验证规则设置 - 必填字段始终设置 `required: true` - 文本字段设置合理的 `max` 限制 - 数字字段设置 `min` 和 `max` 范围 - 使用 `custom` 进行复杂验证 ### 3. 字段联动设计 - 避免循环依赖 - 条件函数保持简单 - 联动动作尽可能轻量 ### 4. 性能优化 - 使用字段缓存减少API请求 - 大表单使用懒加载 - 合理设置字段span优化布局 ### 5. 错误处理 - 提供清晰的错误提示 - 使用自定义错误消息 - 验证失败时高亮显示错误字段 --- ## 更新日志 ### v1.0.0 (2025-01-24) - ✨ 初始版本发布 - ✨ 支持基础字段类型 - ✨ 实现字段验证 - ✨ 实现字段联动 - ✨ 实现栅格布局 - 📝 完善文档和示例 --- ## 支持 如有问题或建议,请联系开发团队。