HOW - 前端页面低代码 Schema 驱动最小范式

文章目录

可以把"低代码 Schema 驱动前端"的最小范式理解为:

用一份 JSON(或类似结构)描述 UI + 行为 + 数据,然后用一个运行时解释执行。

下面介绍一个工程上可落地的最小闭环模型(MVP 级)。

一、最小范式(核心三要素)

一个低代码页面,最少只需要 3 个东西:

Schema(描述 UI)

描述"长什么样"

ts 复制代码
type Schema = {
  type: string;            // 组件类型
  props?: Record<string, any>;
  children?: Schema[];
};

本质:组件树 JSON 化。

Renderer(解释执行)

把 schema 渲染成 React/Vue 组件

ts 复制代码
function render(schema: Schema): ReactNode {
  const Comp = componentMap[schema.type];

  return (
    <Comp {...schema.props}>
      {schema.children?.map(render)}
    </Comp>
  );
}

本质:JSON → UI 的解释器

Data + Action(驱动行为)

让页面"活起来":

ts 复制代码
type Action =
  | { type: 'request'; api: string }
  | { type: 'setState'; key: string; value: any }
  | { type: 'navigate'; to: string };

本质:声明式行为系统(替代写 JS)

二、最小可运行 Demo(核心结构)

页面 Schema

json 复制代码
{
  "type": "Page",
  "children": [
    {
      "type": "Button",
      "props": {
        "text": "加载数据",
        "onClick": {
          "type": "request",
          "api": "/api/list"
        }
      }
    },
    {
      "type": "Table",
      "props": {
        "data": "{{list}}"
      }
    }
  ]
}

Renderer(极简版)

ts 复制代码
const componentMap = {
  Page: ({ children }) => <div>{children}</div>,
  Button: ({ text, onClick }) => (
    <button onClick={() => runAction(onClick)}>{text}</button>
  ),
  Table: ({ data }) => <pre>{JSON.stringify(data)}</pre>
};

状态 + 表达式系统

ts 复制代码
const store = {
  list: []
};

function resolve(value) {
  if (typeof value === 'string' && value.startsWith('{{')) {
    const key = value.slice(2, -2);
    return store[key];
  }
  return value;
}

Action 执行器

ts 复制代码
async function runAction(action) {
  switch (action.type) {
    case 'request':
      const res = await fetch(action.api).then(r => r.json());
      store.list = res;
      rerender();
      break;
  }
}

三、这个"最小范式"本质是什么

一句话总结:

Schema = UI AST + 行为 DSL + 数据绑定

拆开看:

UI 是 AST(抽象语法树)

text 复制代码
Schema ≈ React Element Tree

你是在"描述 UI",不是写 UI

行为是 DSL(领域语言)

json 复制代码
{ "type": "request", "api": "/api/list" }

替代:

ts 复制代码
onClick={() => fetch()}

数据是响应式上下文

text 复制代码
{{list}}  → store.list

类似:

  • Vue template
  • React state + selector

四、为什么这是"最小范式"

能力 是否必须
组件描述 ✅
渲染器 ✅
状态存储 ✅
行为系统 ✅

五、工程上常见扩展(从 MVP → 企业级)

在这个最小模型上逐步长出来:

表达式系统(升级版)

json 复制代码
{
  "visible": "{{user.role === 'admin'}}"
}

引入:

  • 表达式解析器(如 new Function / safe-eval)

Action Pipeline

json 复制代码
{
  "type": "sequence",
  "actions": [
    { "type": "request", "api": "/api/a" },
    { "type": "setState", "key": "a" }
  ]
}

组件协议(关键)

ts 复制代码
type LowCodeComponent = {
  propsSchema: JSONSchema;
  events: string[];
};

解决:

  • 设计器配置
  • 表单驱动

数据源抽象

ts 复制代码
{
  "type": "dataSource",
  "fetch": "/api/list",
  "autoLoad": true
}

插槽 / 作用域

json 复制代码
{
  "type": "Table",
  "children": [
    {
      "type": "Column",
      "props": {
        "render": "{{row.name}}"
      }
    }
  ]
}

总结

低代码 = 用 JSON 描述组件树 + 用解释器渲染 + 用 DSL 驱动行为 + 用表达式绑定数据

相关推荐
三小河7 小时前
从 Markdown 到 Generative UI:AI 如何从“生成答案”进化到“生成界面”?
前端·人工智能·后端
请为小H留灯8 小时前
Windows 本地前端项目一键运行指南:Volta+Node+pnpm + 阿里镜像完整初始化流程
前端·pnpm·node·js
J船长8 小时前
从 App 开发到 Unity 游戏开发:建立认知地图,结合 AI 开始实践
前端
牛奔8 小时前
mise 管理多版本 Go 项目
开发语言·前端·chrome·后端·golang
能源革命9 小时前
Vue 网格拖拽布局组件全景指南:7 大方案深度对比
前端·javascript·vue.js
PC2005_cloud9 小时前
AI 汉字漂移实录:它为什么总把「学习」写成日语「学習」
前端·后端
穆梓兰煊9 小时前
AI供应链安全不再只是包安全,还涉及模型与数据
前端·数据库
RaaS1009 小时前
AI网关能做Prompt注入防护吗?AI网关核心功能详解
前端·后端
deli00710 小时前
Skill 怎么写才被 Agent 命中?18 条规则做成 SKILL.md 校验器,规范样例 92 分
前端