lowcode-engine 事件设置器 EventSetter 详解:从 configure.supports.events 声明到 ${extParams} 扩展传参的完整实践
【免费下载链接】lowcode-engineAn enterprise-class low-code technology stack with scale-out design / 一套面向扩展设计的企业级低代码技术体系项目地址: https://gitcode.com/GitHub_Trending/lo/lowcode-engine
本文围绕 lowcode-engine 的 EventSetter(事件设置器)展开:如何通过在物料协议的configure.supports.events中声明组件支持的事件列表、如何绑定已有函数或新建事件函数、如何配置扩展参数(extParams)、以及如何用events.template为新建事件生成默认函数模板。读完本文,你能够独立为任意物料配置完整的事件绑定能力,并理解事件函数在 schema 中的存储与消费方式。
EventSetter 解决什么问题
EventSetter 的核心用途一句话概括:可以将事件绑定在物料上。与直接书写属性值的设置器不同,事件绑定面向的是"组件交互"这一类诉求——当用户在设计器中选中一个按钮、表格或弹窗组件时,可以在属性面板中为onClick、onChange、onExpand等事件挂上处理函数:
- 如果工程里已有可复用的函数,直接从已有事件列表中挑选绑定;
- 如果还没有,则新建一个函数,系统会跳转到代码面板生成函数骨架;
- 若业务需要在触发事件的原有参数之外再传递数据,还可以打开扩展参数设置,在代码面板中补充自定义参数对象。
这套机制与 FunctionSetter 的扩展参数约定(${extParams}占位符、参数包装规则)完全一致,两者常配合使用。
声明组件自带事件列表:configure.supports.events
事件绑定能力的第一来源是物料协议。在组件的 configure 中,通过supports.events声明该物料支持哪些事件:
{ "configure": { "supports": { "style": true, "events": [ { "name": "onChange" }, { "name": "onExpand" }, { "name": "onVisibleChange" } ] } } }supports是"通用扩展面板支持性配置",除了事件列表外还可以声明loop(循环设置)、condition(条件设置)等能力,完整结构可在 物料协议规范 的"通用扩展面板支持性配置 supports"一节中查到。
从源码类型定义看,events数组中的每一项既可以是简单字符串,也可以是带完整元信息的配置对象。metadata.ts 中的定义如下:
export type ConfigureSupportEvent = string | ConfigureSupportEventConfig; export interface ConfigureSupportEventConfig { name: string; // 事件名,如 onChange propType?: IPublicTypePropType; // 属性值类型 description?: string; // 事件描述 template?: string; // 新建函数时使用的函数模板 } export interface ConfigureSupport { /** 支持事件列表 */ events?: ConfigureSupportEvent[]; // ... loop / condition / style 等 }也就是说:
| 字段 | 作用 | 是否必填 |
|---|---|---|
name | 事件名,必须与物料真实接收的回调 prop 名一致 | 是 |
propType | 声明该事件属性的值类型 | 否 |
description | 事件说明文案 | 否 |
template | 新建函数时自动生成的函数模板,可含${extParams}占位符 | 否 |
如果只需要最简单的事件声明,写成字符串形式即可,规范文档给出的最简示例:
{ "configure": { "supports": { "events": ["onClick", "onChange"] } } }事件绑定流程:绑定已有函数或新建事件
当物料声明了事件列表后,选中画布中的该组件,属性面板会出现事件绑定入口。事件绑定提供两条路径:
- 选择已有事件:下拉列表中展示的是 schema 中
methods节点下已存在的函数。也就是说,页面级函数统一沉淀在 schema 的methods中,EventSetter 从这里取候选项,天然支持跨组件复用同一段处理逻辑; - 新建事件:选择新建时,系统会按命名规则自动生成函数名——默认会在名字后追加
_new后缀以避免与既有函数冲突。点击确定后,编辑器会自动跳转到代码插件(CodePanel)对应的区块,光标落在新生成的函数内,开发者可以直接开始编辑函数体。
这条"设置器 -> 代码面板"的联动依赖设计器与代码插件之间的通信机制(见 editor 设计文档 中对插件间协作的描述),开发者无需在 EventSetter 配置中做任何额外接线。
扩展参数(extParams):在原有参数之外再传数据
事件函数本身已有固定入参(如onClick(e)的事件对象e)。当业务需要在此基础上附加上下文数据时,可以打开扩展参数设置,在代码面板中编辑参数内容。使用规则有三条,务必遵守:
- 额外参数必须被包装成一个对象,不能是散装的多个形参;
- 可以使用动态变量,例如
this.state.xxx、this.items等运行时表达式; - 扩展参数是追加参数,会加在原有参数后面,函数消费方需按"原有参数在前、扩展参数在后"的顺序解构。
参数模板的典型写法:
{ testKey: this.state.text, }以在onClick中加入扩展传参为例,最终函数消费端的正确姿势如下:
// e 为 onClick 原有函数传参,extParams 为自定义传参 onClick(e, extParams) { this.setState({ isShowDialog: extParams.isShowDialog, }); }注意extParams整体是一个对象({ isShowDialog: ..., testKey: ... }),在方法体内通过属性访问取值,而不是当作第二个裸值使用。
事件新建函数模板:events.template 与 ${extParams} 占位符
新建函数时如果每次都从空函数体写起体验较差。可以在物料协议的事件声明中配置template字段,新建函数时会自动生成模板代码:
{ "configure": { "supports": { "style": true, "events": [ { "name": "onChange", "template": "templeteTest(e,${extParams}){this.setState({isShowDialog: false})}" }, { "name": "onExpand" }, { "name": "onVisibleChange" } ] } } }关键约定:
${extParams}是扩展参数占位符。如果用户最终没有声明扩展参数,代码生成阶段会移除该占位符对应的参数声明,生成的函数签名保持干净;- 定义模板后,每次创建完函数都会自动生成模板函数体,开发者只需在骨架上填充业务逻辑。
在仓库中可以看到这一机制被大量真实物料采用。例如 code-generator 的测试 schema 中,Button、Dialog、Form 等组件的template均按"原生参数 +${extParams}"的格式声明:
"template": "onClick(event,${extParams}){\n// 点击按钮时的回调\nconsole.log('onClick', event);}""template": "onFinish(values,${extParams}){\n// 提交表单且数据验证成功后回调事件\nconsole.log('onFinish',values);}"这些 schema 同时作为代码生成器的回归测试输入,说明${extParams}的解析与函数体生成链路经过了 code-generator 的持续验证(对应测试用例见 icejs-js-function1.test.ts)。
补充一点类型层面的细节:template字段在 ConfigureSupportEventConfig 中被声明为可选字符串,配合 FunctionSetter 侧的同名templateprop(见 FunctionSetter 文档),构成了"事件声明层"与"设置器属性层"两种配置入口,可按物料组织习惯择一使用。
实践小结
- 先声明后绑定:事件能力必须由物料的
configure.supports.events显式声明,设计器不会自动扫描组件 props 猜测事件名; - 函数资产沉淀在 schema 的 methods 节点:EventSetter 绑定的是可复用函数,新建时以
_new后缀防撞名并联动跳转代码面板; - 扩展参数是对象、追加在末尾:模板中统一用
${extParams}占位,无声明时自动移除; - 模板能力在 code-generator 侧有测试保障:真实物料 schema 中大量使用
template字段,可作为声明格式的直接参考。
沿着本文的线索,可继续查阅 Setter 附录总览、物料协议规范 与 FunctionSetter,完整理解 lowcode-engine 中"属性设置器 + 事件/函数模板"这一整套物料交互配置体系。
【免费下载链接】lowcode-engineAn enterprise-class low-code technology stack with scale-out design / 一套面向扩展设计的企业级低代码技术体系项目地址: https://gitcode.com/GitHub_Trending/lo/lowcode-engine
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考