Pack
通常我们将一些用来包裹其他组件的组件通过 Pack 组件进行注册,它们也被称为 容器组件 。在具备布局能力的视图中,这类组件通常是非常有意义的。
一、Pack 组件图谱

二、Pack 组件的注册
(一)Pack 组件的注册可选项
/**
* Pack组件注册可选项
*/
export interface BasePackOptions extends SPIOptions {
/**
* 指定视图类型
*/
viewType?: ViewType | ViewType[];
/**
* 指定组件名称或别称
*/
widget?: string | string[];
/**
* 指定是否内敛组件
*/
inline?: boolean;
/**
* 指定模型
*/
model?: string | string[];
/**
* 指定视图名称
*/
viewName?: string | string[];
}从上述类型声明中不难发现,其分类维度涵盖以下多个方面:视图类型、组件名称、是否内联组件、模型编码以及视图名称。这些维度用于描述组件的使用位置。一般而言,位置描述得越“精确”,在相应位置进行渲染时,该组件所具备的优先级也就越高。在完全相同的位置描述的情况下,后注册的组件会覆盖先注册的组件。
(二)注册组件
1、注册 Pack 默认组件
在不指定 widget 属性时,该组件将注册为 Pack 默认组件。以 DefaultGroupWidget 为例:
@SPI.ClassFactory(BasePackWidget.Token({}))
export class DefaultGroupWidget extends BasePackWidget对于这个组件,在 DSL 中通过 pack 标签使用:
<pack>
...
</pack>2、注册指定名称的组件
对于其他组件,我们通过 widget 来指定组件名称,这样就可以和其他组件进行区分。以 DefaultBlockWidget 组件为例:
@SPI.ClassFactory(
BasePackWidget.Token({
widget: 'block'
})
)
export class DefaultBlockWidget extends BasePackWidget对于这个组件,在 DSL 中通过 pack 标签使用,并指定 widget 属性:
<pack widget="block">
...
</pack>三、常见布局和容器组件的使用
(一)栅格布局
参考 Antd Grid 栅格 For Vue ,Oinone 的栅格布局同样分为 24 栅格。下面我们来看一下栅格布局在 DSL 中的使用。
与原生组件支持的栅格布局不同,Oinone 提供了 cols 和 span 组合来灵活的处理栅格数。通过 cols 属性定义一行的栅格数,通过 span 属性决定单个栅格的跨度,默认跨度与栅格数一致。
一行三列(1:1:1)
<pack widget="row" cols="3">
<pack widget="col" span="1"></pack>
<pack widget="col" span="1"></pack>
<pack widget="col" span="1"></pack>
</pack>1:3
<pack widget="row" cols="4">
<pack widget="col" span="1"></pack>
<pack widget="col" span="3"></pack>
</pack>两行(自动换行)
<pack widget="row" cols="3">
<!-- 第一行 -->
<pack widget="col" span="1"></pack>
<pack widget="col" span="1"></pack>
<pack widget="col" span="1"></pack>
<!-- 第二行 -->
<pack widget="col" span="1"></pack>
<pack widget="col" span="3"></pack>
</pack>(二)标签页组件
参考 Antd Tabs 标签页 For Vue ,对于 父子组合 类型的组件,其使用方式与原生组件支持的使用方式类似,父子组件需要相邻定义。
基本用法
<pack widget="tabs">
<pack widget="tab" title="Tab 1"></pack>
<pack widget="tab" title="Tab 2"></pack>
<pack widget="tab" title="Tab 3"></pack>
</pack>(三)内置栅格布局
在 Oinone 中,有一部分组件内置使用了栅格布局,你不需要显式定义栅格布局组件就可以直接使用。
分组中使用栅格布局
<pack title="基础信息" cols="3">
<field data="code" label="编码" span="1" />
<field data="name" label="名称" span="2" />
<field data="description" label="描述" span="3" />
</pack>上面的 DSL 与 下面的 DSL 是等价的:
<pack title="基础信息">
<pack widget="row" cols="3">
<pack widget="col" span="1">
<field data="code" label="编码" />
</pack>
<pack widget="col" span="2">
<field data="name" label="名称" />
</pack>
<pack widget="col" span="3">
<field data="description" label="描述" />
</pack>
</pack>
</pack>内置栅格布局是通过类似于 组件混入 的方式实现的,对于父组件来说,其混入了 row 组件的全部属性和功能,对于子组件来说,其混入了 col 组件的全部属性和功能,以此来简化 DSL 中对于栅格布局的使用。
四、Reference List
(一)布局组件
1、DefaultBlockWidget
类型声明:
@SPI.ClassFactory(
BasePackWidget.Token({
widget: 'block'
})
)
export class DefaultBlockWidget extends BasePackWidget属性:
- defaultGutter:默认间距。(
StandardGutterType) - flex:是否为弹性布局。(
boolean) - flexDirection:弹性布局方向。(
string | undefined) - gutter:间距。(
number[]) - inline:是否内联。(
boolean) - layout:布局方式。(
string | undefined)
2、DefaultRowWidget
类型声明:
@SPI.ClassFactory(
BasePackWidget.Token({
widget: 'row'
})
)
export class DefaultRowWidget extends BasePackWidget属性:
- align:布局对齐方式。(
string) - containersGutter:布局容器的栅格间隔。(
number[]) - customDefaultGutter:自定义默认间距。(
StandardGutterType | undefined) - defaultGutter:默认间距。(
StandardGutterType) - flexDirection:弹性布局方向。(
string) - flexLayout:弹性布局类型。(
string) - gutter:栅格间隔。(
number[]) - isCard:是否为卡片布局。(
boolean | undefined) - justify:内容排列方式。(
string) - wrap:是否换行。(
boolean | undefined)
3、DefaultColWidget
类型声明:
@SPI.ClassFactory(
BasePackWidget.Token({
widget: 'col'
})
)
export class DefaultColWidget extends BasePackWidget属性:
- maxWidth:最大宽度。(
any) - minWidth:最小宽度。(
any) - mode:布局模式。(
string | undefined) - offset:栅格偏移量。(
number) - span:栅格占位格数。(
number) - width:宽度。(
any)
4、DefaultContainersWidget
类型声明:
@SPI.ClassFactory(
BasePackWidget.Token({
widget: 'containers'
})
)
export class DefaultContainersWidget extends DefaultRowWidget属性:
- border:是否显示边框。(
boolean) - borderTop:是否显示上边框。(
boolean) - borderBottom:是否显示下边框。(
boolean) - borderLeft:是否显示左边框。(
boolean) - borderRight:是否显示右边框。(
boolean) - borderColor:边框颜色。(
string | undefined) - borderSize:边框大小。(
string) - borderStyle:边框样式。(
string | undefined) - colGutter:列间距。(
string) - currentGutter:当前栅格间隔。(
number[]) - layout:布局方式。(
string | undefined) - margin:外间距。(
string) - marginBottom:底部外边距。(
string) - marginLeft:左侧外边距。(
string) - marginRight:右侧外边距。(
string) - marginTop:顶部外边距。(
string) - padding:内间距。(
string) - paddingBottom:底部内边距。(
string) - paddingLeft:左侧内边距。(
string) - paddingRight:右侧内边距。(
string) - paddingTop:顶部内边距。(
string) - rowGutter:行间距。(
string) - showInternalBorder:是否显示内部边框。(
boolean)
5、DefaultContainerWidget
类型声明:
@SPI.ClassFactory(
BasePackWidget.Token({
widget: 'container'
})
)
export class DefaultContainerWidget extends DefaultRowWidget属性:
- allInvisible:是否全部不可见。(
boolean) - border:是否显示边框。(
boolean) - borderTop:是否显示上边框。(
boolean) - borderBottom:是否显示下边框。(
boolean) - borderLeft:是否显示左边框。(
boolean) - borderRight:是否显示右边框。(
boolean) - borderColor:边框颜色。(
string | undefined) - borderSize:边框大小。(
string) - borderStyle:边框样式。(
string | undefined) - colGutter:列间距。(
string) - currentGutter:当前栅格间隔。(
number[]) - layout:布局方式。(
string | undefined) - margin:外间距。(
string) - marginBottom:底部外边距。(
string) - marginLeft:左侧外边距。(
string) - marginRight:右侧外边距。(
string) - marginTop:顶部外边距。(
string) - padding:内间距。(
string) - paddingBottom:底部内边距。(
string) - paddingLeft:左侧内边距。(
string) - paddingRight:右侧内边距。(
string) - paddingTop:顶部内边距。(
string) - rowGutter:行间距。(
string) - showInternalBorder:是否显示内部边框。(
boolean) - style:组件样式。(
CSSStyleDeclaration)
(二)容器组件
1、DefaultGroupWidget
类型声明:
@SPI.ClassFactory(
BasePackWidget.Token({})
)
export class DefaultGroupWidget extends BasePackWidget属性:
- border:是否显示边框。(
boolean) - description:描述文本。(
string) - help:帮助内容。(
any) - layout:布局方式。(
string | undefined) - title:分组标题。(
string)
2、DefaultTabsWidget
类型声明:
@SPI.ClassFactory(
BasePackWidget.Token({
widget: 'tabs'
})
)
export class DefaultTabsWidget extends BasePackWidget属性:
- defaultActiveIndex:默认激活的标签索引。(
number | undefined) - layout:布局方式。(
string | undefined) - parentMountedCallChaining:父级挂载链式调用实例。(
CallChaining | undefined) - tabAlign:标签对齐方式。(
string) - tabPosition:标签位置。(
string)
方法:
computeDefaultActiveKey
- 功能描述:计算默认激活的标签键(基于默认索引或报告的键)。
- 类型:
() => string | undefined - 返回值:默认激活的标签键。
findNextActiveIndex
- 功能描述:根据不可见标志和当前索引,查找下一个可见的标签索引(优先前后搜索)。
- 类型:
(invisibleFlags: boolean[], currentActiveIndex: number) => number - 参数:
invisibleFlags:子标签不可见状态数组。currentActiveIndex:当前激活的标签索引。
- 返回值:下一个可见标签的索引,未找到则返回
-1。
getActiveKey
- 功能描述:获取当前激活的标签键。
- 类型:
() => string | undefined - 返回值:当前激活的标签键。
onActiveKeyChange
- 功能描述:处理标签激活状态变化,更新激活键。
- 类型:
(key: string) => void - 参数:
key:新激活的标签键。
resetInvisible
- 功能描述:重置标签可见性,自动切换到下一个可见标签(若当前标签不可见)。
- 类型:
() => void
setActiveKey
- 功能描述:设置当前激活的标签键。
- 类型:
(key: string | undefined) => void - 参数:
key:待激活的标签键。
3、DefaultTabWidget
类型声明:
@SPI.ClassFactory(
BasePackWidget.Token({
widget: 'tab'
})
)
export class DefaultTabWidget extends BasePackWidget属性:
- currentTabKey:当前标签键(基于当前句柄)。(
string) - disabled:是否禁用(支持表达式)。(
boolean) - forceRender:是否强制渲染。(
boolean) - layout:布局方式。(
string | undefined) - parentMountedCallChaining:父级挂载链式调用实例。(
CallChaining | undefined) - title:标签标题(支持表达式,默认值为
DEFAULT_TAB_TITLE)。(string)
方法:
isDefaultActive
- 功能描述:判断是否为默认激活状态(基于
dsl中的defaultActive配置)。 - 类型:
() => boolean - 返回值:返回是否默认激活状态。
4、DefaultMultiViewTabsWidget
类型声明:
@SPI.ClassFactory(
BasePackWidget.Token({
widget: 'MultiViewTabs'
})
)
export class DefaultMultiViewTabsWidget extends DefaultTabsWidget属性:
- allInvisible:是否全部不可见。(
boolean | undefined) - invisible:是否不可见。(
boolean) - multiViewKeyCache:多视图键缓存实例。(
ReturnType<MultiViewKeyCache>)
方法:
onActiveKeyChange
- 功能描述:处理激活键变化事件,更新多视图键缓存。
- 类型:
(tabKey: string) => void - 参数:
tabKey:新激活的标签键。
5、DefaultMultiViewTabWidget
类型声明:
@SPI.ClassFactory(
BasePackWidget.Token({
widget: 'MultiViewTab'
})
)
export class DefaultMultiViewTabWidget extends DefaultTabWidget属性:
- activeRecords:当前激活记录。(
ActiveRecord[] | undefined) - allInvisible:是否全部不可见。(
boolean | undefined) - dataSource:数据源。(
ActiveRecord[] | undefined) - forceRender:是否强制渲染。(
boolean) - invisible:是否不可见。(
boolean) - metadataViewWidget:元数据视图组件实例。(
MetadataViewWidget | undefined) - runtimeView:运行时视图。(
RuntimeView | undefined) - runtimeViewContext:运行时视图上下文。(
RuntimeContext | undefined) - viewName:视图名称。(
string | undefined) - viewModel:视图模型名称。(
string | undefined)
方法:
createMetadataViewWidget
- 功能描述:创建元数据视图组件实例(带唯一句柄和配置)。
- 类型:
() => MetadataViewWidget - 返回值:元数据视图组件实例。
initRuntimeContext
- 功能描述:通过元数据子视图和运行时视图初始化上下文。
- 类型:
(metadataSubviewWidget: MetadataViewWidget, view: RuntimeView) => RuntimeContext - 参数:
metadataSubviewWidget:元数据子视图组件。view:运行时视图实例。
- 返回值:运行时上下文。
initView
- 功能描述:异步加载运行时视图并初始化上下文和属性。
- 类型:
async () => void
initViewAfterProperties
- 功能描述:视图属性初始化后的钩子函数(空实现,供子类扩展)。
- 类型:
() => void
reloadActiveRecords
- 功能描述:重新加载激活记录并更新当前状态。
- 类型:
(records: ActiveRecords | undefined) => void - 参数:
records:新的激活记录数据(可选)。
reloadDataSource
- 功能描述:重新加载数据源并更新当前状态。
- 类型:
(records: ActiveRecords | undefined) => void - 参数:
records:新的数据源数据(可选)。
6、DefaultCollapseWidget
类型声明:
@SPI.ClassFactory(
BasePackWidget.Token({
widget: 'collapse'
})
)
export class DefaultCollapseWidget extends BasePackWidget属性:
- accordion:是否为手风琴模式。(
boolean | undefined) - collapseMethod:折叠方法。(
string) - expandAll:是否全部展开(默认
true)。(boolean | undefined) - expandIconPosition:展开图标位置(默认
right)。(string) - layout:布局方式。(
string | undefined) - type:折叠类型(默认
bordered)。(string)
方法:
getActiveKey
- 功能描述:获取当前激活的键。
- 类型:
() => string | string[] | undefined - 返回值:当前激活键。
onActiveKeyChange
- 功能描述:处理激活键变化,更新激活状态。
- 类型:
(key: string | string[]) => void - 参数:
key:新激活的键。
setActiveKey
- 功能描述:设置当前激活的键。
- 类型:
(key: string | string[] | undefined) => void - 参数:
key:待激活的键。
7、DefaultCollapsePanelWidget
类型声明:
@SPI.ClassFactory(
BasePackWidget.Token({
widget: ['collapsePanel', 'collapse-panel', 'CollapsePanel']
})
)
export class DefaultCollapsePanelWidget extends BasePackWidget属性:
- currentTabKey:当前标签键。(
string) - disabled:是否禁用。(
boolean) - forceRender:是否强制渲染。(
boolean) - layout:布局方式。(
string | undefined) - title:标题。(
string)
(三)其他组件
1、DefaultSpinWidget
类型声明:
@SPI.ClassFactory(
BasePackWidget.Token({
widget: 'spin'
})
)
export class DefaultSpinWidget extends BasePackWidget属性:
- delay:延迟时间(毫秒)。(
number | undefined) - loadingIndicator:自定义加载指示器。(
VNode | undefined) - size:加载图标大小。(
string | undefined) - tip:加载提示文本。(
string | undefined) - wrapperClassName:外层容器类名。(
string | string[] | undefined)
方法:
load
- 功能描述:执行异步操作并显示加载状态。
- 类型:
async <R>(fn: (...args: any[]) => R, ...args: any[]) => Promise<R> - 参数:
fn:要执行的异步函数。...args:传递给异步函数的参数。
- 返回值:异步函数的返回结果。