组件预览 previewSchema 指南
本文档面向“工作空间共享组件”的作者,说明如何在后台为组件维护独立的 previewSchema JSON,从而让组件预览支持:
props面板slots面板mock静态状态配置presets预设切换
当前组件预览运行在 Runtime 的纯沙箱宿主页中,正式组件源码仍通过发布产物远程模块方式加载。
1. 基本约定
previewSchema 不再从组件源码里读取,而是由 Backend 单独保存并随组件预览配置一起下发。
推荐在组件管理后台的独立 previewSchema (.json) 编辑器中维护,例如:
json
{
"props": {},
"slots": {},
"mocks": {},
"presets": []
}注意:
previewSchema必须是合法 JSON 对象。- 不支持函数、表达式或任意可执行代码。
- 没有配置
previewSchema的组件仍然可以被预览,但后台不会显示调参面板。
2. props 字段
当前支持的字段类型:
stringtextareanumberbooleanselectjson
示例:
ts
{
props: {
title: {
type: 'string',
label: '标题',
default: '季度经营看板',
},
collapsed: {
type: 'boolean',
label: '默认收起',
default: false,
},
tone: {
type: 'select',
label: '视觉风格',
default: 'primary',
options: [
{ label: '主色', value: 'primary' },
{ label: '成功', value: 'success' },
{ label: '警示', value: 'warning' },
],
},
metrics: {
type: 'json',
label: '指标列表',
default: [
{ label: '订单量', value: 1280 },
{ label: '支付率', value: 0.73 },
],
},
},
}建议:
string、textarea用于普通文案。number只用于真正的数值输入,不要混用字符串数字。json适合复杂对象、数组、配置项集合。select的default值应与options[].value精确匹配。
3. slots 字段
当前 slots 采用声明式节点描述,不支持任意模板字符串或 JS 渲染函数。
支持的节点类型:
texthtmlcomponent
3.1 text
ts
slots: {
default: {
label: '默认插槽',
default: [
{ type: 'text', value: '这里是一段默认插槽文案。' },
],
},
}3.2 html
ts
slots: {
footer: {
label: '底部说明',
default: [
{ type: 'html', value: '<strong>数据更新时间:</strong> 09:30' },
],
},
}说明:
html适合少量受控富文本。- 请只写可信内容,不要把不受控用户输入直接拼进去。
3.3 component
ts
slots: {
actions: {
label: '操作区',
default: [
{
type: 'component',
component: '@runtime-kit/public/components/primitives/Icon.v1.vue',
props: {
name: 'star',
size: 18,
},
},
],
},
}component 节点当前只允许引用:
- Runtime Kit 公开清单中的版本化基础能力:
@runtime-kit/... - 工作空间组件:
@workspace-components/<component_code>/v/<version_no>
不允许引用:
@/views/...@/components、@/layouts、@/core、@/styles等 Runtime 私有路径- Runtime Kit manifest 未声明的模块
- 任意动态
import()
4. mock 静态状态
mocks 是 component-preview 宿主页内部的静态状态,不通过 @runtime-kit 向页面源码、工作空间组件源码或智能体公开。普通组件应优先通过 props 和 slots 接收可调数据。
面板中的 mocks 当前仅支持 JSON/文本级静态值,不支持:
- 函数
- 表达式
- HTTP 请求 mock
示例:
ts
{
mocks: {
stats: {
label: '统计数据',
default: [
{ label: '新增客户', value: 12, trend: '+18%' },
{ label: '续费率', value: '84%', trend: '+6%' },
],
},
},
}5. presets 预设
presets 用于快速切换一组完整的 props / slots / mocks。
示例:
ts
{
presets: [
{
key: 'compact',
label: '紧凑版',
props: {
title: '紧凑看板',
collapsed: true,
},
},
{
key: 'highlight',
label: '强调版',
props: {
tone: 'warning',
},
mocks: {
stats: [
{ label: '异常数', value: 23, trend: '+12%' },
],
},
},
],
}建议:
key保持稳定,不要使用会频繁变化的值。label直接面向后台使用者展示,尽量简短清晰。- 预设只写覆盖值,未声明的字段会回退到 schema 默认值。
6. 完整示例
仓库内提供了一个完整示例组件实现,可直接参考:
它演示了组件在预览场景中的这些能力:
props的多种字段类型slots的text / html / componentmocks静态状态presets预设
7. 推荐实践
- 保持
previewSchema和组件真实 API 一致,不要为了预览单独发明一套 props 名称。 mocks更适合承载列表、统计卡片、图表数据等大块结构化数据。- 对插槽优先提供可读的默认值,方便第一次打开时立即看到效果。
- 如果一个组件非常复杂,优先先给出 2 到 3 个高质量
presets,再补细粒度字段。 - 不要在组件源码中导入 component-preview 专用的 Runtime 内部能力;需要可调数据时优先建模为
props或slots。
8. 当前限制
当前版本暂不支持:
- 自动从
defineProps推导表单 - 任意 JS 表达式 / render 函数
- 动态
import() - 通过网络请求拉取 mock 数据
- 在后台直接编辑或组合 slot 子组件树的可视化拖拽