designable和formily实现简单的低代码平台学习

116 阅读3分钟

🧩 Formily 从 Designable 到运行态全流程解析

源码仓库:github.com/alibaba/for…


🧠 What — 从 Designable 到 Formily

阶段框架作用输出
🧩 设计态Designable拖拽组件、配置字段属性生成 Schema(JSON 格式)
🗄️ 后端存储层保存 Schema 到数据库schema: string (JSON)
🧠 运行态Formily前端根据 Schema 渲染真实表单const form = createForm(); <SchemaField schema={schema} />

💡 Why — 为什么使用 Formily

  • 复杂表单场景更轻松:适合字段多、联动复杂、条件渲染的表单;
  • 低代码支持:使用 Schema 描述字段、校验、联动逻辑,摆脱大量重复的 <Form.Item>useStateonChange
  • 性能优化良好:针对大规模动态表单优化渲染,不会整表单频繁刷新;
  • 可扩展:支持自定义组件、响应式计算、设计器接入。

⚙️ How — 核心流程拆解


1️⃣ 设计态(Designable)

输入:组件元信息(注册表)
输出:Schema(JSON)

🧩 流程概述:
  1. 用户在可视化设计器中 拖拽组件 → 属性编辑 → 保存

  2. Designable 内部使用 TreeNode 描述组件层级;

  3. 每次操作封装为 Operation(支持撤销 / 重做);

  4. 设计器引擎 Engine 将 NodeTree 转换为标准 JSON Schema:

    const schema = engine.getCurrentTree().serialize();
    
  5. 前端通过 API 将 schema 持久化保存到后端。

📦 产物: schema.json(表单结构模板)


2️⃣ 存储层

输入schema
输出schema + config

🗄️ 后端逻辑:
  • 后端保存两类数据:
    • schema:组件结构、字段定义;
    • config:表单初始值或用户配置;
  • 支持版本号管理(v1、v2、v3);
  • 提供接口:
    • GET /api/schema/:id
    • POST /api/config/:id

3️⃣ 运行态(Formily)

输入schema + config
输出:渲染出的动态表单与字段绑定关系

Formily 是一个 Schema 驱动的表单渲染引擎
它不会写死表单结构,而是解析 schema 中的层级关系、组件类型与修饰器,动态生成对应的 React 节点。


🧩 渲染流程:
  1. 加载后端返回的 schema 与 config:

    const { schema, config } = await fetch("/api/schema-config").then((res) =>
      res.json()
    );
    
  2. 创建表单实例与组件映射:

    const 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> 内。
  3. 初始化表单数据:

    form.setValues(config);
    
  4. 渲染阶段:

    <FormProvider form={form}>
      <SchemaField schema={schema} />
    </FormProvider>
    
    • Formily 递归遍历 Schema 树;
    • 每个节点生成对应的 Field;
    • schema.name 映射为 form.values 的字段路径;
    • 属性(placeholder、title、x-validator 等)自动绑定。

🧩 字段映射关系
Schema 字段数据路径渲染组件类型示例
discord_linkform.values.discord_linkInputDiscord 链接输入框
titleform.values.titleText静态文本标题
isVisibleform.values.isVisibleSwitch布尔开关

Formily 根据 schema 自动完成 字段注册、依赖追踪与响应式更新


4️⃣ 数据交互与保存

输入:用户交互数据
输出:新的 config

🔁 流程:
  1. 用户修改表单;

  2. Formily 自动更新 form.values

  3. 点击保存按钮后提交到后端:

    fetch("/api/config", {
      method: "POST",
      body: JSON.stringify(form.values),
    });
    
  4. 后端更新 config 字段。

📄 最终结果:
结构(schema)与数据(config)完全解耦,可复用、可版本化、可低代码配置。


📚 总结

阶段框架核心产物关键点
设计态DesignableSchema(JSON)可视化拖拽生成结构描述
存储层后端Schema + Config持久化与版本管理
运行态Formily动态表单解析 Schema → 渲染组件
数据层Formily + APIConfig响应式绑定与数据保存