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

🧩 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:

    ts 复制代码
    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:

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

    ts 复制代码
    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. 初始化表单数据:

    ts 复制代码
    form.setValues(config);
  4. 渲染阶段:

    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

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

  2. Formily 自动更新 form.values

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

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

📄 最终结果:

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


📚 总结

阶段 框架 核心产物 关键点
设计态 Designable Schema(JSON) 可视化拖拽生成结构描述
存储层 后端 Schema + Config 持久化与版本管理
运行态 Formily 动态表单 解析 Schema → 渲染组件
数据层 Formily + API Config 响应式绑定与数据保存
相关推荐
路多辛6 小时前
为什么我要做一个开发者工具箱?聊聊 Kairoa 的诞生
前端·后端
jerryinwuhan6 小时前
理论及算法_时间抽取论文
前端·算法·easyui
秋子aria6 小时前
模块的原理及使用
前端·javascript
菜市口的跳脚长颌6 小时前
一个 Vite 打包配置,引发的问题—— global: 'globalThis'
前端·vue.js·vite
胖虎2656 小时前
实现无缝滚动无滚动条的 Element UI 表格(附完整代码)
前端·vue.js
小左OvO6 小时前
基于百度地图JSAPI Three的城市公交客流可视化(一)——线路客流
前端
星链引擎6 小时前
企业级智能聊天机器人 核心实现与场景落地
前端
GalaxyPokemon6 小时前
PlayerFeedback 插件开发日志
java·服务器·前端
爱加班的猫6 小时前
深入理解防抖与节流
前端·javascript