Schema 渲染
核心组件
Schema 渲染相关组件包括:
提供 schema 渲染所需的上下文
用于扩展 components 和 scopes,非必须
用于渲染 schema,必须用在 内部
什么是 scope?
scope 指的是 schema 内可用的变量或函数。例如以下例子的函数 t() 需要注册到 scope 里,才能正确渲染 title
<SchemaComponent
scope={{ t }}
schema={{
title: '{{t("Hello")}}',
}}
>
注册 components 和 scopes
SchemaComponentProvider、SchemaComponentOptions 和 SchemaComponent 都可以注册 components 和 scopes。区别在于:
SchemaComponentProvider 提供最顶层的上下文
SchemaComponentOptions 用于局部上下文的替换和扩展
SchemaComponent 为当前 schema 的上下文
<SchemaComponentProvider components={{ ComponentA }}>
<SchemaComponent components={{ ComponentB }} schema={schema1}>
<SchemaComponent components={{ ComponentC }} schema={schema2}>
<SchemaComponentOptions components={{ ComponentD }}>
<SchemaComponent components={{ ComponentE }} schema={schema3}>
<SchemaComponent components={{ ComponentF }} schema={schema4}>
</SchemaComponentOptions>
</SchemaComponentProvider>
- schema1 里可以使用 ComponentA、ComponentB
- schema2 里可以使用 ComponentA、ComponentC
- schema3 里可以使用 ComponentA、ComponentD、ComponentE
- schema4 里可以使用 ComponentA、ComponentD、ComponentF
在 Application 里使用
Tachybase 客户端的 Application 的 Providers 内置了 SchemaComponentProvider 组件
class Application {
// 默认提供的 Providers
addDefaultProviders() {
this.addProvider(SchemaComponentProvider, {
scopes: this.scopes
components: this.components,
});
}
}
最终渲染的组件结构如下:
<Router>
{/* 路由的 Context Provider */}
<SchemaComponentProvider components={app.components} scopes={app.scopes}>
{/* 其他自定义 Provider 组件 - 开始标签 */}
<Routes />
{/* 其他自定义 Provider 组件 - 结束标签 */}
</SchemaComponentProvider>
</Router>
应用内部使用时,无需再套 SchemaComponentProvider,直接用 SchemaComponent 就可以了
在应用的生命周期方法内可以使用 app.addComponents() 和 app.addScopes() 扩展全局的 components 和 scopes。
class PluginHello extends Plugin {
async load() {
this.app.addComponents({
// 扩展的组件
});
this.app.addScopes({
// 扩展的 scope
});
}
}