低代码事件配置能力设计
本文详细介绍低代码平台中事件配置系统的设计思路,包括事件触发机制、动作分类体系和数据结构设计。
概念说明
在低代码平台的事件配置系统中,核心概念如下:
核心概念
- 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 表达式 | 需要配置表达式内容 |
动作执行特性
- 条件执行:每个动作都可以配置执行条件
- 异步支持:支持异步动作的串行和并行执行
- 错误处理:内置错误捕获和处理机制
- 上下文传递:动作间可以传递执行上下文和数据
数据结构设计
事件配置结构
事件配置的顶层数据结构:
| 字段名称 | 类型 | 含义 | 必填 |
|---|---|---|---|
event | string | 组件支持的事件名称(如 click, change) | ✅ |
key | string | 事件配置的唯一标识 | ✅ |
name | string | 事件处理函数的名称 | ✅ |
handle | array | 事件触发时执行的动作集合 | ✅ |
动作配置结构
单个动作的详细配置:
| 字段名称 | 类型 | 含义 | 必填 |
|---|---|---|---|
key | string | 动作的唯一标识 | ✅ |
type | string | 动作类型(component/service/custom) | ✅ |
name | string | 动作的显示名称 | ✅ |
content | object/string | 动作的具体配置内容 | ✅ |
condition | object | 动作执行的条件判断 | ❌ |
async | boolean | 是否异步执行 | ❌ |
timeout | number | 执行超时时间(毫秒) | ❌ |
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