八、 动态表单
1. 表单工厂
页面交互还有重要的一环:表单数据的交互。sw-frontend提供了近三十种输入形式的表单项以供表单设计选择使用,对于Form表单提供了界面化的属性配置如:表单项类型、是否展示、表单项数据源、表单项条件渲染、表单项label、表单项key,表单拖拽排序,动态添加表单项等。
对于表单数据的编辑回填,以及表单和页面的数据流以及action交互,也做了模型化的抽象处理,这个在后面页面操作章节做详细介绍。
2. 过滤器/表单Action
对于页面的表单Action,如新增、编辑等,sw-frontend抽象为单独的操作区块,每个操作区块创建时会生成unikey,在页面组件工具栏区添加好操作button后,可以通过页面交互或源码编辑的形式建立绑定关系。
源码视角下,在table组件的toolbar字段下,“新建应用”button以blockId的形式跟新建应用的表单操作区块建立了绑定关系;当模板引擎解析到toolbar工具栏,会用该blockId获取到该操作区块的配置,然后根配置以表单工厂函数加载对应表单项并对其表单项值初始化。
3. 过滤器
过滤器是对传统页面开发条件中过滤表单的一种抽象,在设计器中对过滤器的定义和action表单操作大体一致,只是过滤器没有表单提交地址,关联组件如table的过滤刷新,是经由过滤器将表单项的字段值投递到参数阈,table的数据源获取执行器进而通过侦听对比参数阈的关联字段值的变化重新拉取数据,来间接完成表格数据的过滤查询操作;而action操作则是将表单提交到后端地址,确认成功提交后通过callback来完成参数阈投递更新,间接完成组件的数据刷新操作。
过滤器
action操作
4. 数据源
sw-frontend提供了灵活的数据流处理机制,降低对接口的数据格式及参数的固定要求,使应用富客户端化,这也是serverless体验的关键一环:在此用户可以灵活定义组件/页面节点数据源类型,提供类似GraphQL的模式,在设计器中对返回数据进行灵活处理。
对于数据源为API格式的地址中使用$(变量名),会统一从参数阈中渲染替换,然后获取组件数据源的数据;同时提供请求前置函数和请求后置函数的执行钩子,在这里可以进行数据的拆解或组装以及写入一些业务逻辑代码。
九、 页面操作(Action)
页面操作是低代码工程设计里面的重要一环,承载着很大一部分运维需求场景,sw-frontend将页面操作抽象为四个大的类别:工程内置操作类,过滤器类,表单提交类,超链跳转类。
1. 工程内置操作类
sw-frontend在组件的工具栏内置了若干通用的按钮类的操作,根据操作类型map,识别相应操作进行渲染。典型的如“组件刷新”操作,用户在界面添加该按钮,配置唯一识别字段“__refresh__”,即可完成组件刷新操作的配置,该刷新Button通过触发参数阈改变事件,间接完成组件的数据刷新操作。
2. 超链跳转类
超链跳转类别的操作,常用于表格等组件的行内操作,一般以JSXRender的形式进行配置,渲染为Button/Link。进行路由跳转或者超链跳转时,表格行内数据可以作为传入参数使用。
3. 过滤器类
过滤器本质而言是对传统开发方式下页面查询的一种抽象:组件本身定义有数据源,过滤器的职能是触发组件重新获取数据。在sw-frontend中,过滤器的表现形式可以是一组tab、一组表单项。
以表单类过滤器为例:用户在填充各过滤条件之后,“提交”操作本质并没有直接的提交地址,而是进行表单参数的投递--改变节点参数阈,组件通过监听参数阈关联字段的改变,重新拉取数据,完成传统页面的查询操作。
4. 表单提交类
表单操作承载了大部分的页面操作,sw-frontend将常规的“增”、“删”、“改”都抽象为表单提交类的事件,对这类Action操作,在完成和服务端交互后,以callback的形式,进行节点参数阈字段的投递,以触发数据渲染类组件的刷新从而完成“增”、“删”、“改”类的操作,如下两图分别为Action操作定义和运行时渲染界面:
其中在进行数据编辑时的表单数据回填,大多数场景为列表类数据的编辑:定义在行内的“编辑”操作会绑定一个表单Action区块;在点击事件发生时,会将该行内数据对象rowData与当前节点参数阈合并,作为actionParams传入该Action表单区块,表单区块通过读取actionParams的对应字段value作为各表单项的initValue,完成数据回填。
十、 节点参数域
节点参数阈是以Redux状态管理机制为依托,建立路由节点页面共享参数对象nodeParams,节点页面各组件通过对nodeParams的修改和对应字段侦听来间接完成组件间的信息传递和事件交互。
sw-frontend在节点页创建之初,会初始化节点参数域:nodeParams;在节点页面的生命周期内,也会将url中变量参数,一些页面交互产生的runtime参数以及外部函数投递来的参数整合到节点参数域中来。
随之组件在经过统一数据源处理器获取数据流渲染之后,会对节点参数阈的target字段值通过监听对比,以触发数据reload刷新机制,重新获取数据源数据;同时页面的一些action表单操作,也是通过参数阈投递更新目标字段值进行进行间接触发相应组件的reload刷新渲染。
十一、 组件扩展
sw-frontend提供了声明式内置组件的注册机制,同时开辟了用户自定义组件的入口,用户可以将一些常用的自定义组件嵌入到我们的组件列表,以供前端设计器统一调拨;当前自定义组件以JSXRender的方式进行执行,可以直接书写JSX代码,同时能够识别antd组件,赋予用户更加灵活的页面渲染能力。
十二、 愿景与规划
现sw-frontend已内置运维场景常用的基础组件,图表组件,landing组件,布局组件等五十余个组件,除此之外还开放了用户自定义简单JSX组件的入口,让用户对自定义组件进行编辑管理,以拓展组件扩展和插拔使用的空间。同时动态加载远程组件,建立运维组件生态市场也纳入到了后面的版本规划中;以期能够共建打造出一个丰富共享的运维组件生态来,这也是我们将其开源的一个初衷愿景。
• 版本动态
我们会根据工作项目节奏,持续对功能进行完善优化和升级。近期发布的版本加入了页面模板保存和从模板快速创建的功能,以进一步聚焦“复用”,提升开发效率。