ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

form-create-designer工作原理剖析:设计器如何渲染、生成与实时更新JSON表单规则

form-create-designer工作原理剖析:设计器如何渲染、生成与实时更新JSON表单规则 form-create-designer工作原理剖析设计器如何渲染、生成与实时更新JSON表单规则【免费下载链接】FcDesigner好用的Vue低代码可视化 AI 表单设计器可以通过拖拽的方式快速创建表单提高开发者对表单的开发效率。支持PC端和移动端目前在政务系统、OA系统、ERP系统、电商系统、流程管理等系统中已稳定应用。项目地址: https://gitcode.com/xaboy/form-create-designerform-create-designerFcDesigner是一款 Vue 低代码可视化表单设计器你只需拖拽组件、点击配置它就能实时渲染出表单画布并生成可落库的标准 JSON 表单规则。本文将从源码视角剖析它的工作原理画布如何渲染、JSON 规则如何生成、配置修改又是如何实时更新并双向同步的。一、整体架构三栏式布局的可视化表单设计器整个设计器由一个核心组件撑起——FcDesigner.vue采用经典的三栏布局区域职责核心内容左侧栏组件源组件菜单、结构树、JSON 面板、AI 助理中间画布拖拽区域渲染设计态表单支持拖入/移动/删除右侧栏配置面板字段、属性、样式、事件、验证 5 类配置左侧组件菜单来自 menu.js 定义的分组结构具体组件则由 config/index.js 中注册的 40 条规则ruleList填充。 一个有意思的事实设计器自己就是一个表单——它用 FormCreate 渲染了用来设计表单的表单这是理解其工作原理的钥匙。二、画布渲染每个组件如何被包装成可拖拽单元1. 规则定义组件 一份 JSON 模板以输入框为例看 config/rule/input.js每个组件规则都定义了rule()创建组件时的初始 JSON 规则type、field、title 等props()右侧属性面板的元表单规则disabled、type、maxlength……也就是说组件本身和它的配置面板都是用 JSON 规则描述出来的——这就是低代码表单描述表单的核心思想。2. makeRule给规则套上拖拽外壳当组件被拖入画布FcDesigner.vue 中的makeRule()会做三件事注入元信息打上_fc_id唯一标识、_menu原始配置、自动生成的name与field包裹 DragTool把真实规则包进一层 DragTool.vue 壳提供选中高亮、移动、复制、追加子项、删除等操作按钮可嵌套容器加 DragBox若组件支持子项如 Row、Tabs则通过 DragBox.vue 结合 vuedraggable 生成嵌套拖拽容器并挂载dragAdd / dragEnd / dragStart回调。最终画布上你看到的每一个虚线框 按钮都是DragTool外壳→ DragBox可嵌套容器→ 真实组件的三层结构。3. 用表单渲染画布designerForm 工厂utils/form.js 里有两个关键实例viewForm负责渲染预览态表单打开预览、数据录入时使用designerForm由formCreate.factory()创建的设计态专用工厂渲染中间画布初始化时执行data.dragForm.rule makeDragRule(children)把整棵规则树交给 FormCreate 递归渲染。由于规则是 Vue 响应式数据只要数据变化画布自动重渲染——不需要任何手动刷新逻辑。三、配置面板字段修改如何实时写回 JSON 规则选中组件后右侧面板会出现 5 个由 JSON 规则驱动的元表单baseForm / propsForm / styleForm / validateForm / eventConfig面板模板分别来自 base/field.js、base/style.js、base/validate.js。实时同步靠一对双向函数1. 拉取updateRuleFormData规则 → 面板updateRuleFormData() 在激活组件时把activeRule的每个字段、props 子项展开成表单值如formCreatePropslabel填充到配置面板中。2. 回写handleChange面板 → 规则当你在面板里修改任意值handleChange() 会解析字段路径支持props这类深层路径直接修改activeRule上的对应属性。空值自动删除字段保证 JSON 干净。⚡ 因为规则对象本身是响应式的这一改就触发画布组件即时重渲染——改即所见全程零延迟。四、JSON 表单规则生成parseRule 如何脱壳还原画布里存的是带 DragTool/DragBox 外壳的设计态规则而对外输出需要纯净的业务 JSON。关键在 parseRule()递归脱壳遇到DragBox直接取 children 展开遇到DragTool取其内部第一个子规则剥离内部字段删除_menu、key、component、_fc_drag_tag、所有__开头的运行时属性还原别名把_control、_on、_hidden等带下划线前缀的临时字段还原为正式字段清理空值空对象、空数组、null 属性一律剔除。最终对外接口非常简洁getRule()parseRule(deepCopy(dragForm.rule[0].children))得到纯净规则对象getJson()交给designerForm.toJson()输出 JSON 字符串getOptionsJson()同理导出表单级配置提交按钮、事件、多语言等反向流程由 loadRule() 完成把外部 JSON 重新匹配组件配置、补全_fc_id与 field再经makeRule包壳交给 setRule() 重建画布——这就是导入已有表单继续编辑的底层原理。五、实时更新机制双向同步、操作记录与结构树1. JSON 面板双向同步左侧 JSON 面板由 JsonPreview.vue 实现双向机制很精巧画布 → JSONmounted时 deep watchchildren画布任何变动都会实时刷新 JSON 编辑器JsonPreview.vueJSON → 画布编辑器blur时对比旧值若 JSON 有改动则调用setRule/setOptions反向重建画布JsonPreview.vue。因此无论是拖拽组件还是手改 JSON两边永远一致。2. 操作记录与撤销重做watchActiveRule() 对activeRule做深度监听拖拽、删除、复制、排序等操作统一收敛到 addOperationRecord()最多保存 20 步快照配合 CtrlZ / CtrlShiftZ 实现撤销重做。属性连续修改则走 3 秒节流的记录策略避免记录爆炸。3. 结构树的防抖更新左侧结构树依赖 updateTree()以 300ms 防抖 nextTick 重新遍历规则树生成treeInfo在高频拖拽场景下保持流畅。4. 快捷键与复制粘贴设计器还内置了一整套效率快捷键CtrlC / CtrlX 复制规则以FormCreate:前缀写入剪贴板、CtrlV 粘贴、↑↓ 调整顺序、Delete 删除、1~4 切换面板FcDesigner.vue。粘贴时自动批量替换 field 与 ID避免字段冲突——细节决定体验。六、从设计到交付预览与模板导出点击预览按钮时openPreview() 会先调用getJson()生成纯净规则再用 template.js 中的三套模板一键产出可运行代码表单模式viewForm渲染真实表单可直接填写、提交验证组件模式生成 Vue 组件完整代码含script setup写法HTML 模式生成引入 CDN 的独立 HTML 页面。再配合左侧的 AI 助理面板用自然语言描述需求即可批量修改表单规则进一步压缩开发链路。总结一张图看懂数据流组件规则(config/rule/*.js) │ makeRule 包壳 ▼ 设计态规则树(data.children) ──响应式渲染──▶ 中间画布(DragForm) │ ▲ │ 选中/配置修改 拖拽事件 ▼ │ 右侧配置面板(updateRuleFormData) ──handleChange──┘ │ │ getRule → parseRule 脱壳 ▼ 纯净 JSON 规则 ──▶ JsonPreview 实时预览 / 预览 / 导出模板 / 落库form-create-designer 的精髓可以概括为一句话用 JSON 描述组件、用 JSON 描述配置面板、再用 Vue 响应式把三者串成实时闭环。理解了这个表单描述表单的架构你不仅能用好它还能通过addMenu/addDragRule轻松扩展自己的业务组件。【免费下载链接】FcDesigner好用的Vue低代码可视化 AI 表单设计器可以通过拖拽的方式快速创建表单提高开发者对表单的开发效率。支持PC端和移动端目前在政务系统、OA系统、ERP系统、电商系统、流程管理等系统中已稳定应用。项目地址: https://gitcode.com/xaboy/form-create-designer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表