一、技术选型与初始化
-
框架与工具
- Next.js 15:支持React 18+,提供SSR/SSG能力,优化路由和性能。
- Tailwind CSS:用于快速实现三栏布局和组件样式定制。
- Ant Design:作为基础UI库,提供表单、按钮、弹窗等组件。
- Zustand/Redux Toolkit:轻量级状态管理,用于全局管理表单配置、操作历史等数据。
- Dnd-Kit :React拖拽库,支持高性能拖拽交互,替代
react-beautiful-dnd
。 - Monaco Editor:集成代码编辑器,支持实时预览和JSON配置编辑。
-
初始化项目
bashnpx create-next-app@latest form-builder --typescript pnpm install tailwindcss antd @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities @monaco-editor/react zustand
二、核心架构设计
1. 三栏布局实现
-
左侧面板(组件库)
使用Tailwind的网格布局(
grid grid-cols-3
),展示Ant Design支持的表单项组件(输入框、选择器、日期选择器等),每个组件可拖拽到中间画布。tsx// 示例:拖拽组件项 <div className="p-2 border cursor-move" role="button" {...attributes} {...listeners}> <InputOutlined /> 输入框 </div>
-
中间画布(表单设计区)
通过
DndContext
监听拖拽事件,接收组件并更新表单配置数据。支持嵌套布局(如栅格、卡片),通过SortableContext
实现组件排序。 -
右侧面板(属性配置)
根据当前选中组件,动态渲染对应的属性表单(如标签、占位符、校验规则),通过Zustand状态更新配置。
2. 数据模型设计
-
表单Schema结构
使用JSON定义表单配置,包含组件类型、属性、布局信息等:
tsinterface FormSchema { id: string; type: 'input' | 'select' | 'datepicker'; // 组件类型 props: Record<string, any>; // 组件属性(如label、placeholder) layout: { span?: number }; // 布局配置 children?: FormSchema[]; // 嵌套组件(如栅格内多元素) }
-
状态管理
通过Zustand管理全局状态:
tsinterface FormState { schema: FormSchema[]; // 当前表单结构 history: FormSchema[][]; // 操作历史(用于撤销/重做) selectedId: string | null; // 当前选中组件ID }
三、核心功能实现
1. 拖拽生成表单
-
拖拽交互
使用
Dnd-Kit
的useDraggable
和useDroppable
实现组件拖放,通过onDragEnd
事件将组件添加到画布:tsx<DndContext onDragEnd={handleDragEnd}> {/* 左侧组件库 */} <ComponentLibrary /> {/* 中间画布 */} <SortableContext items={schema.map(item => item.id)}> {schema.map(item => <FormItemComponent key={item.id} data={item} />)} </SortableContext> </DndContext>
-
动态渲染组件
根据
schema
递归渲染Ant Design组件:tsxconst renderComponent = (item: FormSchema) => { switch (item.type) { case 'input': return <Input {...item.props} />; case 'select': return <Select options={item.props.options} />; // 其他组件... } };
2. 属性配置与实时预览
-
属性表单生成
根据选中组件的类型,动态渲染Ant Design的
Form
组件,绑定Zustand状态:tsx<Form onValuesChange={(_, values) => updateProps(selectedId, values)}> <Form.Item label="标签" name="label"> <Input /> </Form.Item> {/* 其他属性字段 */} </Form>
-
实时预览
在画布区域直接渲染表单,或通过
iframe
嵌入独立页面实现沙盒预览。
3. 操作历史管理
-
撤销/重做功能
使用Zustand记录每次操作的历史快照,通过指针控制当前状态:tsconst handleUndo = () => { if (historyIndex > 0) { setState({ schema: history[historyIndex - 1], historyIndex: historyIndex - 1 }); } };
4. 代码生成与导出
- JSON配置导出
将schema
序列化为JSON,支持导入/导出功能。 - React代码生成
通过模板引擎(如mustache
)将schema
转换为可运行的Ant Design代码。
四、优化与扩展
-
性能优化
- 使用
React.memo
和useCallback
避免不必要的渲染。 - 对大型表单采用虚拟滚动(如
react-virtuoso
)。
- 使用
-
扩展功能
- 表单校验 :集成
yup
或ajv
,通过属性配置生成校验规则。 - 数据联动 :通过
watch
监听字段变化,动态更新其他组件属性。 - 主题定制:结合Tailwind与Ant Design的Less变量实现主题切换。
- 表单校验 :集成
-
部署与协作
- 使用Next.js的API路由实现配置保存到数据库。
- 集成Monaco Editor实现多人协作编辑。
五、参考实现与资源
-
类似项目参考
k-form-design
:基于Ant Design的表单设计器,支持JSON配置。form-create
:跨框架表单生成器,支持动态渲染。
-
核心代码片段
- 拖拽实现 :Dnd-Kit官方示例
- 状态管理 :Zustand文档