魔笔提供了一套API用于支持组件开发。本文介绍API的功能,API完整的定义请参考模板中的src/api/mobiComponentApi.ts
。
获取API
对于函数组件,可以通过如下方式获取:
import { useApi } from "../../../api/createApi"; const Demo = (props: any) => { // 获取API const api = useApi(props); return <div/>; }
对于类组件,可以通过如下方式获取:
import { createApiFromProps } from "../../../api/createApi"; import MobiComponentApi from "../../../api/mobiComponentApi"; class Demo extends React.Component<any> { private _api: MobiComponentApi; constructor(props: any) { super(props); this._api = createApiFromProps(props); } }
API说明
环境判断API
用于在组件中判断当前是否是运行时,主要用来区分运行时和设计时。
export default interface MobiComponentApi { /** * 判断是否是运行时 */ isPreview: (props: object) => boolean; }
样式计算API
export default interface MobiComponentApi { /** * 计算宽度,width和margin在setter进行设置时,保存的数据结构是定制的,所以需要通过此api计算 * 传入margin是为了在宽度的基础上减去左右margin获得宽度,避免在宽度设置是100%时,组件在页面上产生横向滚动条 * 容器类或者可能占满全屏的组件建议传入margin。其它组件看情况 */ getWidth: (width?: any, margin?: any) => string; /** * 计算高度 */ getHeight: (height?: any) => string; }
getWidth是通过宽度、margin的prop计算设置的宽度。
getHeight是通过高度的prop计算设置的高度。
宽度和高度的setter因为尺寸的表达方式比较多,所以设置的prop是一个对象,需要通过API计算,才能获取正确的值。
margin不用计算,setter设置的就是"0px 0px 0px 0px" 这种格式。
数据字段获取、更新API
/** * prop的字段名 参数 * 用于获取或者更新某个prop, 对应的value可能是任何数据类型 */ export interface KeyArgs { /** * prop的字段名 */ key: string; } /** * 数据字段参数 * 用于指定是数据的哪个字段 */ export interface FieldArgs { field: any; } /** * 数据标识参数 * 用于指定当前操作的是哪个数据 */ export interface DataArgs { data: any; } /** * 前端组件通过回调之类的方式传回来的值 * 用于更新动态字段 */ export interface UIValueArgs { uiValue: any; } type getDCValueByKeyOrField = (props: object, args: KeyArgs | FieldArgs) => any; type getDCValueByKeyOrFieldAndData = ( props: object, args: (KeyArgs | FieldArgs) & DataArgs ) => any; type setDCValueByKeyOrField = ( props: object, args: (KeyArgs | FieldArgs) & UIValueArgs ) => void; type setDCValueByKeyOrFieldAndData = ( props: object, args: (KeyArgs | FieldArgs) & DataArgs & UIValueArgs ) => void; export default interface MobiComponentApi { /** * 获取字段的值 */ getDcValue: getDCValueByKeyOrField & getDCValueByKeyOrFieldAndData; /** * 更新字段的值 * value 参数是必须的 * 其它参数的情况和 getDcValue 一样 */ setDcValue: setDCValueByKeyOrField & setDCValueByKeyOrFieldAndData; /** * 判断字段是否不可编辑,没有或者只读 都是不可编辑 */ isDisabled: isDisabledByKeyOrField & isDisabledByKeyOrFieldAndData; }
getDcValue是获取实体对象字段的值。
setDcValue是更新实体对象字段的值。
isDisabled是用于判断实体对象字段是否可以编辑。
getDcValue、setDcValue和isDisabled均有两个参数:props和args,props是最新的组件props,
args是一个组合参数。
key或者field表示是哪个实体字段,key是prop的名称,field是描述字段的数据。如果通过prop配置的实体字段,则field=props[key],所以传key或者field其中一个就行。
data描述获取哪个实体对象的字段,不传则表示当前组件绑定的实体对象。
uiValue描述是组件返回的数据,用于更新实体对象字段。
事件触发API
type emitByKeyOrEvent = ( props: object, args: (KeyArgs | EventArgs) & EventExtraArgs ) => void | Promise<any>; type emitByKeyOrEventAndDataDc = ( props: object, args: (KeyArgs | EventArgs) & EventExtraArgs & DataArgs & DCArgs ) => void | Promise<any>; export default interface MobiComponentApi { /** * 执行prop绑定的事件 */ emitDcEvent: emitByKeyOrEvent & emitByKeyOrEventAndDataDc; }
通过emitDcEvent可以触发通过prop配置的事件,包括页面操作(跳转页面)、数据操作(保存、更新数据)、逻辑流操作(触发逻辑流)
emitDcEvent有两个参数:props和args。props是最新的组件props,args是一个组合参数。
key或者action表示是哪个事件,key是prop的名称,action是描述事件的数据。如果通过prop配置的事件,则action=props[key],所以传key或者action其中一个就行。
async表示调用事件作为异步处理,true会返回一个Promise,false不会返回数据。当需要从逻辑流中获取返回的数据时,需要设置为true,默认false。
data和dc表示数据,在一些复杂场景会使用,一般不传,表示从当前绑定的数据获取参数。
数据源相关API
export default interface MobiComponentApi { /** * 加载数据源, 返回透传对象 */ processDataSource: (props: object, args: { aggregate: boolean }) => object; /** * 包装children */ createListItemContent: ( props: object, itemComponentOptions: { ItemComponent: React.JSXElementConstructor<any>; name: string; }, children: any[], passParams: any ) => any[]; /** * 获取数据列表 */ getListItems: (props: object) => any[]; }
processDataSource用于加载数据源,返回的对象需要透传给children。
createListItemContent用于在List类型的组件中包装ListItem。
getListItems用于List-Data类型的组件,获取实体对象列表。
具体使用请参见模板中的
src/Sample/data-container/func
。分页、排序、过滤逻辑API
export default interface MobiComponentApi { /** * 获取数据总数 */ getListTotalCount: (props: object) => number; /** * 配置分页 */ updateDataFilter: (options: RetrieveParams) => void; /** * 用于在配置分页之后更新数据 */ updateData: (props: object, options: { reload: boolean }) => void; }
getListTotalCount用于获取一共有多少数据。
updateDataFilter用于配置分页、排序、过滤条件。
updateData用于配置条件后更新数据。
updateDataFilter的参数如下:
/** * filter: { * type: 'AND' | 'OR', * groups: [ * { * type: 'AND' | 'OR', * filters: [ * { * attrId: * type: ISNULL | NOTNULL | EQ | NEQ | GT | GTE | LT | LTE | CONTAINS | NOTCONTAIN | STARTSWITH | ENDSWITH | BETWEEN * values: [] * } * ] * } * ] * } * sort: [ * {attrId, type} * ], * page: { * number:, * size: * } */ interface Filter { field: any; type: | "ISNULL" | "NOTNULL" | "EQ" | "NEQ" | "GT" | "GTE" | "LT" | "LTE" | "CONTAINS" | "NOTCONTAIN" | "STARTSWITH" | "ENDSWITH" | "BETWEEN"; values: any[]; } interface FilterGroup { type: "AND" | "OR"; filters: Filter[]; } export interface FilterParam { type: "AND" | "OR"; groups: FilterGroup[]; } export interface SortParam { field: any; type: "DESC" | "ASC" | "DEFAULT"; } export interface RetrieveParams { filter?: FilterParam; sort?: SortParam[]; page?: { number: number; size: number; }; }
其中:
page用于配置分页条件。
sort用于配置排序条件。
filter用于配置过滤条件。
参数中的field字段表示实体字段。