loyep.com avatar loyep
  • techAugust 5, 2024

    低代码事件配置能力设计

    详细介绍低代码平台中事件配置系统的设计思路,包括动作分类、数据结构和具体实现方案

    low-codeeventsdesign事件配置动作系统

    低代码事件配置能力设计

    本文详细介绍低代码平台中事件配置系统的设计思路,包括事件触发机制、动作分类体系和数据结构设计。

    概念说明

    在低代码平台的事件配置系统中,核心概念如下:

    核心概念

    • Events(事件):组件支持的各种用户交互事件,如点击、输入、焦点变化等
    • Handler(处理函数):组件事件触发时调用的函数,包含具体的处理逻辑
    • Action(动作):处理函数内部执行的具体操作,是事件响应的最小执行单元

    事件流程

    用户交互 → 触发事件 → 调用处理函数 → 执行动作序列 → 产生结果

    动作设计

    动作系统采用分类设计,主要分为组件类、服务类、自定义JS类三大类别,支持灵活扩展。

    组件类动作

    控制组件状态和行为的动作:

    动作类型动作名称描述配置要求
    component.show显示组件控制指定组件显示需要配置目标组件 ID
    component.hide隐藏组件控制指定组件隐藏需要配置目标组件 ID
    component.toggle切换显示切换组件的显示/隐藏状态需要配置目标组件 ID
    navigation.link页面跳转跳转到指定链接需要配置目标 URL
    notification.message消息提醒显示消息提示框需要配置消息内容和类型
    page.refresh刷新页面刷新当前页面无需额外配置
    page.back返回上页返回浏览器上一页无需额外配置

    服务类动作

    与数据服务交互的动作:

    动作类型动作名称描述配置要求
    service.request接口请求调用指定的数据源接口需要选择页面配置的数据源
    service.submit表单提交提交表单数据到服务端需要配置提交接口和数据映射
    service.refresh数据刷新重新加载指定数据源需要选择要刷新的数据源

    自定义 JS 类动作

    允许用户编写自定义逻辑的动作:

    动作类型动作名称描述配置要求
    custom.function自定义函数执行用户定义的 JavaScript 代码需要在代码编辑器中编写函数逻辑
    custom.expression表达式执行执行 JavaScript 表达式需要配置表达式内容

    动作执行特性

    • 条件执行:每个动作都可以配置执行条件
    • 异步支持:支持异步动作的串行和并行执行
    • 错误处理:内置错误捕获和处理机制
    • 上下文传递:动作间可以传递执行上下文和数据

    数据结构设计

    事件配置结构

    事件配置的顶层数据结构:

    字段名称类型含义必填
    eventstring组件支持的事件名称(如 click, change)
    keystring事件配置的唯一标识
    namestring事件处理函数的名称
    handlearray事件触发时执行的动作集合

    动作配置结构

    单个动作的详细配置:

    字段名称类型含义必填
    keystring动作的唯一标识
    typestring动作类型(component/service/custom)
    namestring动作的显示名称
    contentobject/string动作的具体配置内容
    conditionobject动作执行的条件判断
    asyncboolean是否异步执行
    timeoutnumber执行超时时间(毫秒)

    content 字段详解

    根据动作类型的不同,content 字段的结构也不同:

    组件类动作

    {
      "type": "component.show",
      "content": {
        "componentId": "button-001",  // 目标组件ID
        "animation": "fade"           // 动画效果(可选)
      }
    }

    服务类动作

    {
      "type": "service.request",
      "content": {
        "dataSourceId": "api-user-list",  // 数据源ID
        "params": {                       // 请求参数
          "page": 1,
          "size": 10
        }
      }
    }

    自定义JS类动作

    {
      "type": "custom.function",
      "content": {
        "code": "function() { console.log('Custom action executed'); }"
      }
    }

    配置示例

    完整配置示例

    以下是一个完整的事件配置示例,展示了按钮点击事件的多动作配置:

    [
      {
        "event": "click",
        "key": "btn-click-handler",
        "name": "按钮点击处理",
        "handle": [
          {
            "key": "action-show-modal",
            "type": "component.show",
            "name": "显示确认弹窗",
            "content": {
              "componentId": "confirm-modal",
              "animation": "slide"
            },
            "condition": {
              "type": "JSExpression",
              "value": "this.state.user.isLoggedIn"
            }
          },
          {
            "key": "action-fetch-data",
            "type": "service.request",
            "name": "获取用户数据",
            "content": {
              "dataSourceId": "user-api",
              "params": {
                "userId": {
                  "type": "JSExpression",
                  "value": "this.state.currentUserId"
                }
              }
            },
            "async": true,
            "timeout": 5000
          },
          {
            "key": "action-custom-log",
            "type": "custom.function",
            "name": "记录操作日志",
            "content": {
              "code": "function(context) { console.log('用户点击了按钮', context.event); }"
            }
          }
        ]
      },
      {
        "event": "change",
        "key": "input-change-handler",
        "name": "输入框变化处理",
        "handle": [
          {
            "key": "action-validate",
            "type": "custom.function",
            "name": "输入验证",
            "content": {
              "code": "function(value) { return value.length > 0; }"
            }
          },
          {
            "key": "action-update-state",
            "type": "component.setState",
            "name": "更新状态",
            "content": {
              "statePath": "formData.username",
              "value": {
                "type": "JSExpression",
                "value": "event.target.value"
              }
            }
          }
        ]
      }
    ]

    实现方案

    动作分类实现

    常规可枚举操作

    内置的标准动作类型,提供可视化配置界面:

    • 组件控制:显示/隐藏组件、切换状态等
    • 页面导航:跳转链接、刷新页面、返回上页等
    • 数据操作:发送请求、提交表单、刷新数据等
    • 用户反馈:消息提醒、确认对话框等

    自定义操作

    支持用户编写自定义逻辑:

    • 代码编辑器:提供语法高亮的 JavaScript 编辑器
    • 上下文 API:提供丰富的上下文对象和工具函数
    • 错误处理:内置错误捕获和用户友好的错误提示
    • 调试支持:提供调试工具和日志输出

    技术架构

    ┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
    │   事件触发器     │───▶│   动作调度器     │───▶│   动作执行器     │
    └─────────────────┘    └─────────────────┘    └─────────────────┘
             │                       │                       │
             ▼                       ▼                       ▼
    ┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
    │   事件监听管理   │    │   条件判断引擎   │    │   上下文管理器   │
    └─────────────────┘    └─────────────────┘    └─────────────────┘

    扩展性设计

    • 插件化架构:支持第三方动作插件注册
    • 类型系统:完整的 TypeScript 类型定义
    • 配置验证:运行时配置校验和错误提示
    • 性能优化:动作执行池和缓存机制

    参考示例

    在线体验地址:Amis 编辑器示例

    该示例展示了完整的事件配置界面和动作执行效果,可作为实现参考。

    Last updated on