UNPKG

@whynotsnow/dynamic-form

Version:

DynamicForm 是一个基于 React 和 Ant Design 的动态表单组件,支持复杂的表单联动、自定义处理器、状态管理和性能优化。

163 lines (133 loc) 6.77 kB
# DynamicForm 技术架构图 ## 整体架构 ``` ┌─────────────────────────────────────────────────────────────────┐ │ DynamicForm 组件架构 │ ├─────────────────────────────────────────────────────────────────┤ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │ │ │ Ant Design │ │ React State │ │ Effect │ │ │ │ Form │◄──►│ (useReducer) │◄──►│ Engine │ │ │ └─────────────────┘ └─────────────────┘ └─────────────┘ │ │ │ │ │ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │ │ │ FieldRegistry │ │ useStateSync │ │EffectResult │ │ │ │ Components │ │ (Sync Hook) │ │ Handler │ │ │ └─────────────────┘ └─────────────────┘ └─────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ``` ## 数据流图 ### 用户输入流程 ``` 用户输入 ↓ Ant Design Form.onValuesChange ↓ DynamicForm.handleFinishValuesChange ↓ useStateSync.syncFormStateToStore ↓ dispatch(SET_FIELD_VALUE) ↓ React State 更新 ↓ Effect Engine 检测依赖 ↓ 执行 Effect 函数 ↓ EffectResultHandler 处理结果 ↓ dispatch(更新相关字段) ↓ useStateSync useEffect ↓ form.setFieldsValue ↓ 组件重新渲染 ``` ### 双向同步机制 ``` ┌─────────────────┐ ┌─────────────────┐ │ Form Values │ │ State Values │ └─────────────────┘ └─────────────────┘ │ │ │ Form → State │ State → Form ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ │ handleForm │ │ useEffect │ │ ValuesChange │ │ (State → Form) │ └─────────────────┘ └─────────────────┘ │ │ │ 比较值并更新 │ 比较值并更新 ▼ ▼ ┌─────────────────┐ ┌─────────────────┐ │ dispatch │ │ setFieldsValue │ │ (SET_FIELD_VALUE)│ │ │ └─────────────────┘ └─────────────────┘ ``` ## 核心组件职责 | 组件 | 文件 | 职责 | | ---------------------------- | ---------------------------------- | ---------------------------- | | FormChainEffectEngineWrapper | `formChainEffectEngineWrapper.tsx` | 状态管理、Effect Engine 集成 | | useStateSync | `useStateSync.ts` | 双向数据同步 | | EffectResultHandler | `effectResultHandler.ts` | Effect 结果处理 | | FieldComponentRenderer | `FieldComponentRenderer.tsx` | 字段渲染 | | FieldComponentRegistry | `FieldComponentRegistry.tsx` | 字段组件注册 | ## 状态管理 ### FormState 结构 ```typescript interface FormState { fields: Record<string, BaseFieldConfig>; // 字段配置 fieldValues: Record<string, any>; // 字段值 initialized: boolean; // 初始化状态 } ``` ### Reducer Actions ```typescript type FormAction = | { type: 'INIT'; payload: { fields: Record<string, BaseFieldConfig> } } | { type: 'SET_FIELD_VALUE'; payload: { fieldId: string; value: any } } | { type: 'SET_FIELD_VALUES'; payload: Record<string, any> } | { type: 'UPDATE_META'; payload: { fieldId: string; meta: Partial<FieldMeta> } } | { type: 'SET_GROUP_META'; payload: { groupKey: string; meta: Partial<GroupMeta> } }; ``` ## 同步机制 ### 防循环策略 1. **精确比较**: 只比较真正不同的值 2. **依赖控制**: 移除不必要的依赖 3. **延迟更新**: 使用 `requestAnimationFrame` ### 性能优化 1. **批量更新**: 收集变化后一次性更新 2. **渲染优化**: 使用 `React.memo``shouldUpdate` 3. **按需触发**: 只在依赖变化时触发 Effect ## 扩展点 ### 字段类型扩展 ```typescript // 注册新字段类型 const FieldRegistry = { CustomField: ({ field, value, onChange, ...props }) => { return <CustomComponent value={value} onChange={onChange} {...props} />; } }; ``` ### Effect 处理器扩展 ```typescript // 注册新处理器 registerEffectResultHandler({ name: 'customHandler', canHandle: (key) => key === 'custom', handle: (context, value) => { /* 处理逻辑 */ } }); ``` ## 错误处理 ### 常见问题 1. **循环引用警告**: 优化同步逻辑和依赖 2. **数据丢失**: 确保 reducer 正确使用展开运算符 3. **性能问题**: 启用渲染优化和精确更新 ### 调试机制 1. **详细日志**: 关键节点添加日志 2. **数据追踪**: 完整的数据流追踪 3. **性能监控**: 渲染和同步性能监控