低代码 Runtime 闭环验证:一段 JSON 驱动一个可交互页面

一、回顾和目标

在过去几个迭代中,我逐步实现了 Runtime 的各项能力:

arduino 复制代码
Runtime 能力
├── Context + Expression    → 数据容器 + 表达式引擎
├── 调度系统                 → ctx.set → notifyUpward → rerender
├── Schema Runtime          → 逻辑解析(condition / loop)
├── Lifecycle               → onMount / onUnmount 生命周期,执行时机
├── DataSource              → 声明式对接外部 API,数据请求能力
└── Events                  → 用户交互绑定

我打算在一个 Schema 中让这些能力协同工作,完成一个"可交互的列表页"的闭环验证。


二、验证清单

我设计的这个"可交互的列表页"覆盖了以下 7 项 Runtime 能力:

vbnet 复制代码
页面加载(onMount)→ 组件挂载时触发初始化逻辑
数据请求(DataSource)→ 声明式加载外部接口数据 
loading 状态(Expression)→ 动态数据绑定到 UI
列表渲染(loop) → 数组展开为多个节点
条件控制(condition) → 根据状态控制节点显隐
用户点击(event)→ 用户交互触发方法执行
UI 更新(调度)→ 状态变更驱动视图更新

如果这 7 项能在一个 Demo 中同时工作,说明 Runtime 最小版形成了完整闭环。


三、案例案例:可交互的列表页

Demo Schema 设计如下:

typescript 复制代码
export const schema: Schema = {
  id: 'page',
  componentName: 'div',
  state: { postList: [], loading: false },
  methods: {
    loadList: {
      type: 'JSFunction',
      value: `async function(ctx) {
        ctx.set('state.loading', true);
        const data = await fetch('https://jsonplaceholder.typicode.com/posts?_limit=5')
          .then(r => r.json());
        ctx.set('state.postList', data);
        ctx.set('state.loading', false);
      }`,
    },
  },
  lifeCycles: {
    onMount: {
      type: 'JSFunction',
      value: `function(ctx) { ctx.methods.loadList(ctx) }`,
    },
  },
  dataSource: {
    list: [
      {
        id: 'authorList',
        type: 'fetch',
        options: { uri: 'https://jsonplaceholder.typicode.com/users?_limit=3', method: 'GET' },
        isInit: true,
      },
    ],
  },
  children: [
    {
      id: 'author-title',
      componentName: 'p',
      props: { children: '作者(DataSource 自动加载):' },
    },
    {
      id: 'author-item',
      componentName: 'span',
      loop: 'data.authorList',
      loopArgs: ['author'],
      props: { children: '{{author.name}} | ' },
    },
    {
      id: 'refresh-btn',
      componentName: 'button',
      props: { children: '刷新文章' },
      events: { onClick: 'loadList' },
    },
    {
      id: 'loading-text',
      componentName: 'p',
      condition: 'state.loading',
      props: { children: '加载中...' },
    },
    {
      id: 'postList-item',
      componentName: 'p',
      loop: 'state.postList',
      loopArgs: ['post'],
      props: { children: '{{post.title}}' },
    },
  ],
}

整个页面分为两个区域------作者区 (DataSource 驱动)和文章区(onMount + Events 驱动),分别验证两种不同的数据获取方式。


四、每项能力在 Schema 中的映射

能力 Schema 片段 详细设计
DataSource dataSource: { list: [{ id: 'authorList', isInit: true, ... }] } 低代码接入外部数据能力:DataSource Runtime 的设计
Lifecycle lifeCycles: { onMount: { type: 'JSFunction', value: '...' } } 低代码 Runtime Lifecycle:逻辑执行时机
Events events: { onClick: 'loadList' } 低代码页面如何响应用户交互:Events Runtime 的设计
condition condition: 'state.loading' 低代码的逻辑解释能力:Schema Runtime 的设计
loop loop: 'state.postList', loopArgs: ['post'] 低代码的逻辑解释能力:Schema Runtime 的设计
Expression props: { children: '{{post.title}}' } 低代码 Runtime 策略注入:让表达式引擎真正可扩展
调度系统 ctx.set('state.loading', true) → rerender 低代码 Runtime 的调度系统:"数据变化 → UI更新"的最小架构

五、执行流程全景

页面从加载到用户交互的完整链路:

kotlin 复制代码
=== 页面加载 ===

1. ReactRenderer.render(schema)
   → RendererRoot 挂载
   → PreviewRuntime.createContext 创建 rootCtx(编译 methods、缓存 lifeCycles)

2. RendererNodeItem useEffect 触发:
   ├── runLifecycle('onMount')
   │     → fn(ctx) → ctx.methods.loadList(ctx)
   │     → ctx.set('state.loading', true)  → rerender → "加载中..." 出现
   │     → fetch → ctx.set('state.postList', data) → rerender → 文章列表渲染
   │     → ctx.set('state.loading', false) → rerender → "加载中..." 消失
   │
   └── runDataSource(ctx, schema)
         → isInit=true → fetch users
         → ctx.set('data.authorList', data) → rerender → 作者列表渲染

=== 用户点击"刷新文章" ===

3. onClick 触发 resolveEvents 包装的回调
   → rootCtx.methods.loadList(rootCtx, event)
   → 重复 Step 2 的 loadList 流程
   → loading 显隐 + 文章列表更新

两条数据加载路径独立运行、互不干扰:

  • DataSource 路径isInit → 自动 fetch → data.authorList → loop 渲染
  • onMount/Events 路径 :method 内手动 fetch → state.postList → loop 渲染

两者最终都通过 ctx.set → notifyUpward → rerender 驱动 UI 更新,共享同一套调度机制。


六、总结

回顾整个 Runtime 系统的能力演进:

kotlin 复制代码
能力            作用                  核心机制
─────────────────────────────────────────────────────
Renderer        能显示                Schema → React Element
Expression      能计算                {{state.xxx}} → 值
调度系统         能刷新                ctx.set → notifyUpward → rerender
Lifecycle       能调度                onMount/onUnmount 时机触发
DataSource      能接入数据             声明式配置 → 自动请求 → ctx.data
Events          能交互                事件声明 → 方法查找 → 回调执行

这些能力的完成,已经构成了 Runtime 的 MVP 版图。即一段 JSON 能驱动一个可交互、有数据、有状态的页面 ------ 这就是 Runtime 层的价值:让 Schema 从"描述"变成"执行"。

相关推荐
UXbot1 天前
帮助企业低门槛开展AI应用开发的平台推荐
前端·低代码·ui·交互·产品经理·原型模式·web app
盟接之桥1 天前
电子数据交换(EDI)|制造业汽车零配件场景方案
大数据·网络·人工智能·安全·低代码·汽车·制造
UXbot2 天前
如何选择适合公司项目的UI设计工具?企业选型指南
前端·低代码·ui·团队开发·原型模式·设计规范·web app
UXbot2 天前
原型设计工具如何帮助新人快速进入产品行业?
前端·低代码·ui·交互·团队开发·原型模式·web app
NocoBase2 天前
程序员和软件还有前途吗 —— 从 NocoBase 收入再翻倍谈起
低代码·ai·开源·无代码·管理工具·内部工具·无代码开发平台
盟接之桥2 天前
制造业汽车零配件EDI软件场景方案
网络·安全·低代码·汽车·制造
小龙报2 天前
用ChatGPT 5.5构建个人写作工作流:从大纲、初稿到风格润色的提示词链
人工智能·神经网络·低代码·自然语言处理·chatgpt·gpt-3·知识图谱
撑死胆大的3 天前
2026开发变局:国标落地后,软件开发彻底换赛道
前端·低代码·ai·大模型
API开发平台4 天前
API智能开发与治理平台v5.0发布
低代码·ai编程
oioihoii4 天前
探索React与Microi吾码的完美结合:快速搭建项目,低代码便捷开发教程
react.js·低代码·rxjava