🧩 Formily 从 Designable 到运行态全流程解析
🧠 What --- 从 Designable 到 Formily
| 阶段 | 框架 | 作用 | 输出 | 
|---|---|---|---|
| 🧩 设计态 | Designable | 拖拽组件、配置字段属性 | 生成 Schema(JSON 格式) | 
| 🗄️ 后端 | 存储层 | 保存 Schema 到数据库 | schema: string (JSON) | 
| 🧠 运行态 | Formily | 前端根据 Schema 渲染真实表单 | const form = createForm(); <SchemaField schema={schema} /> | 
💡 Why --- 为什么使用 Formily
- ✅ 复杂表单场景更轻松:适合字段多、联动复杂、条件渲染的表单;
 - ✅ 低代码支持 :使用 Schema 描述字段、校验、联动逻辑,摆脱大量重复的 
<Form.Item>、useState、onChange; - ✅ 性能优化良好:针对大规模动态表单优化渲染,不会整表单频繁刷新;
 - ✅ 可扩展:支持自定义组件、响应式计算、设计器接入。
 
⚙️ How --- 核心流程拆解
1️⃣ 设计态(Designable)
输入 :组件元信息(注册表)
输出:Schema(JSON)
🧩 流程概述:
- 
用户在可视化设计器中 拖拽组件 → 属性编辑 → 保存;
 - 
Designable 内部使用
TreeNode描述组件层级; - 
每次操作封装为
Operation(支持撤销 / 重做); - 
设计器引擎
Engine将 NodeTree 转换为标准 JSON Schema:tsconst schema = engine.getCurrentTree().serialize(); - 
前端通过 API 将
schema持久化保存到后端。 
📦 产物: schema.json(表单结构模板)
2️⃣ 存储层
输入 :schema
输出 :schema + config
🗄️ 后端逻辑:
- 后端保存两类数据:
schema:组件结构、字段定义;config:表单初始值或用户配置;
 - 支持版本号管理(v1、v2、v3);
 - 提供接口:
GET /api/schema/:idPOST /api/config/:id
 
3️⃣ 运行态(Formily)
输入 :schema + config
输出:渲染出的动态表单与字段绑定关系
Formily 是一个 Schema 驱动的表单渲染引擎 。
它不会写死表单结构,而是解析 schema 中的层级关系、组件类型与修饰器,动态生成对应的 React 节点。
🧩 渲染流程:
- 
加载后端返回的 schema 与 config:
tsconst { schema, config } = await fetch("/api/schema-config").then((res) => res.json() ); - 
创建表单实例与组件映射:
tsconst form = createForm(); const SchemaField = createSchemaField({ components: { FormItem, Input, Select, Switch, Text }, });每个
x-component对应一个真实 React 组件:"Input"→<Input />"Select"→<Select />"Switch"→<Switch />"x-decorator": "FormItem"决定是否包裹在<Form.Item>内。
 - 
初始化表单数据:
tsform.setValues(config); - 
渲染阶段:
tsx<FormProvider form={form}> <SchemaField schema={schema} /> </FormProvider>- Formily 递归遍历 Schema 树;
 - 每个节点生成对应的 Field;
 schema.name映射为form.values的字段路径;- 属性(placeholder、title、x-validator 等)自动绑定。
 
 
🧩 字段映射关系
| Schema 字段 | 数据路径 | 渲染组件类型 | 示例 | 
|---|---|---|---|
discord_link | 
form.values.discord_link | 
Input | 
Discord 链接输入框 | 
title | 
form.values.title | 
Text | 
静态文本标题 | 
isVisible | 
form.values.isVisible | 
Switch | 
布尔开关 | 
Formily 根据 schema 自动完成 字段注册、依赖追踪与响应式更新。
4️⃣ 数据交互与保存
输入 :用户交互数据
输出 :新的 config
🔁 流程:
- 
用户修改表单;
 - 
Formily 自动更新
form.values; - 
点击保存按钮后提交到后端:
tsfetch("/api/config", { method: "POST", body: JSON.stringify(form.values), }); - 
后端更新
config字段。 
📄 最终结果:
结构(schema)与数据(config)完全解耦,可复用、可版本化、可低代码配置。
📚 总结
| 阶段 | 框架 | 核心产物 | 关键点 | 
|---|---|---|---|
| 设计态 | Designable | Schema(JSON) | 可视化拖拽生成结构描述 | 
| 存储层 | 后端 | Schema + Config | 持久化与版本管理 | 
| 运行态 | Formily | 动态表单 | 解析 Schema → 渲染组件 | 
| 数据层 | Formily + API | Config | 响应式绑定与数据保存 |