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),仅供参考
