cdp-material-sdk 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +67 -0
- package/dist/DataScope-B7ffH5qN.js +106 -0
- package/dist/components/core/types.d.ts +16 -0
- package/dist/components/data-scope/DataScope.d.ts +45 -0
- package/dist/constants/event.d.ts +22 -0
- package/dist/context/DataContainerRuntimeContext.d.ts +16 -0
- package/dist/context/DataScopeContext.d.ts +51 -0
- package/dist/context/PageContext.d.ts +26 -0
- package/dist/hooks/useConcurrentLoading.d.ts +16 -0
- package/dist/hooks/useDataContainer.d.ts +61 -0
- package/dist/hooks/useDualLoading.d.ts +22 -0
- package/dist/host-react.d.ts +15 -0
- package/dist/host-react.js +11 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +42 -0
- package/dist/plugin.d.ts +45 -0
- package/dist/portable.d.ts +20 -0
- package/dist/portable.js +33 -0
- package/dist/protocol/adapter.d.ts +50 -0
- package/dist/protocol/common-schemas.d.ts +64 -0
- package/dist/protocol/events.d.ts +48 -0
- package/dist/protocol/manifest-types.d.ts +10 -0
- package/dist/protocol/manifest.d.ts +144 -0
- package/dist/protocol/traits.d.ts +7 -0
- package/dist/types/category.d.ts +15 -0
- package/dist/utils/mergeInitialValue.d.ts +10 -0
- package/dist/validateManifest-CYqjvQe_.js +355 -0
- package/dist/validation/validateManifest.d.ts +59 -0
- package/docs/component-development/FAQ.md +203 -0
- package/docs/component-development/README.md +176 -0
- package/docs/component-development/getting-started/01-/345/210/233/345/273/272/346/210/226/346/216/245/345/205/245/347/273/204/344/273/266/345/272/223/345/267/245/347/250/213.md +172 -0
- package/docs/component-development/getting-started/02-/345/210/233/345/273/272/347/273/204/344/273/266/345/214/205/345/271/266/346/263/250/345/206/214.md +185 -0
- package/docs/component-development/getting-started/03-/345/274/200/345/217/221/346/234/200/345/260/217/345/217/257/350/277/220/350/241/214/347/273/204/344/273/266.md +196 -0
- package/docs/component-development/getting-started/04-/346/236/204/345/273/272/345/217/221/345/270/203/344/270/216/345/256/277/344/270/273/346/216/245/345/205/245.md +147 -0
- package/docs/component-development/getting-started/05-/350/207/252/346/243/200/344/270/216/346/216/222/351/224/231.md +186 -0
- package/docs/component-development/recipes//344/275/277/347/224/250Adapter/351/200/202/351/205/215/347/273/204/344/273/266API.md +131 -0
- package/docs/component-development/recipes//345/243/260/346/230/216/344/272/213/344/273/266.md +229 -0
- package/docs/component-development/recipes//345/243/260/346/230/216/345/212/250/344/275/234/344/270/216/347/212/266/346/200/201.md +188 -0
- package/docs/component-development/recipes//345/243/260/346/230/216/345/270/203/345/261/200/345/256/271/345/231/250/347/273/204/344/273/266.md +221 -0
- package/docs/component-development/recipes//345/243/260/346/230/216/346/217/222/346/247/275.md +141 -0
- package/docs/component-development/recipes//345/243/260/346/230/216/346/225/260/346/215/256/345/255/227/346/256/265/347/273/204/344/273/266.md +147 -0
- package/docs/component-development/recipes//345/243/260/346/230/216/346/225/260/346/215/256/345/256/271/345/231/250/347/273/204/344/273/266.md +258 -0
- package/docs/component-development/recipes//346/216/245/345/205/245/347/254/254/344/270/211/346/226/271React/347/273/204/344/273/266/345/272/223.md +209 -0
- package/docs/component-development/recipes//351/205/215/347/275/256DOM/346/240/271/350/212/202/347/202/271/346/263/250/345/205/245.md +222 -0
- package/docs/component-development/recipes//351/205/215/347/275/256Loading/347/255/226/347/225/245.md +198 -0
- package/docs/component-development/recipes//351/205/215/347/275/256/350/256/276/350/256/241/345/231/250/345/205/203/344/277/241/346/201/257.md +153 -0
- package/docs/component-development/reference/ActionsState/346/250/241/345/236/213.md +124 -0
- package/docs/component-development/reference/DOM/346/240/271/350/212/202/347/202/271/346/263/250/345/205/245/346/250/241/345/236/213.md +125 -0
- package/docs/component-development/reference/Events/346/250/241/345/236/213.md +170 -0
- package/docs/component-development/reference/Loading/347/255/226/347/225/245/346/250/241/345/236/213.md +140 -0
- package/docs/component-development/reference/Manifest/345/255/227/346/256/265/345/217/202/350/200/203.md +251 -0
- package/docs/component-development/reference/SDK/345/257/274/345/205/245/350/276/271/347/225/214.md +119 -0
- package/docs/component-development/reference/Slots/346/250/241/345/236/213.md +110 -0
- package/docs/component-development/reference/Traits/350/203/275/345/212/233/346/250/241/345/236/213.md +165 -0
- package/docs/component-development/reference/validateManifest/346/240/241/351/252/214/350/247/204/345/210/231.md +171 -0
- package/docs/component-development/reference//345/274/225/346/223/216/345/237/272/347/241/200/350/203/275/345/212/233/346/250/241/345/236/213.md +70 -0
- package/docs/component-development/reference//347/244/272/344/276/213/344/273/243/347/240/201/347/264/242/345/274/225.md +163 -0
- package/package.json +67 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: recipe
|
|
3
|
+
capability: designer-meta
|
|
4
|
+
related:
|
|
5
|
+
- reference/Manifest字段参考.md
|
|
6
|
+
- getting-started/03-开发最小可运行组件.md
|
|
7
|
+
- reference/validateManifest校验规则.md
|
|
8
|
+
---
|
|
9
|
+
# 配置设计器元信息
|
|
10
|
+
|
|
11
|
+
`meta` 中的几个字段决定组件在设计器物料面板里如何被找到、如何被分组、是否可见。它们不影响运行时渲染,但直接影响设计器使用体验和 AI 工具识别。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 适用场景
|
|
16
|
+
|
|
17
|
+
- 组件需要更友好的图标或显示名。
|
|
18
|
+
- 组件应该归到分类下的某个子分组。
|
|
19
|
+
- 组件是某个父组件的内部部件,不应单独出现在物料面板。
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 可以跳过的情况
|
|
24
|
+
|
|
25
|
+
- 组件用默认分类、不需要图标、希望直接出现在物料面板。
|
|
26
|
+
- 组件还在最小实现阶段,先按 [03-开发最小可运行组件](../getting-started/03-开发最小可运行组件.md) 跑通再回来配置。
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 字段总览
|
|
31
|
+
|
|
32
|
+
| 字段 | 类型 | 默认 | 影响 |
|
|
33
|
+
|------|------|------|------|
|
|
34
|
+
| `meta.title` | `string` | 必填 | 物料面板显示名、设计器节点名 |
|
|
35
|
+
| `meta.description` | `string` | 无 | 物料面板 Tooltip、AI 工具理解组件用途 |
|
|
36
|
+
| `meta.category` | `ComponentCategory` | 必填 | 物料面板顶层分类 |
|
|
37
|
+
| `meta.subGroup` | `string` | 无 | 在 `category` 下进一步分组 |
|
|
38
|
+
| `meta.icon` | `string` | 无 | 物料面板图标、设计器节点图标 |
|
|
39
|
+
| `meta.hiddenInComponentList` | `boolean` | `false` | 是否在物料面板中隐藏 |
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 配置示例
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
import {
|
|
47
|
+
COMPONENT_CATEGORY,
|
|
48
|
+
type ComponentManifest,
|
|
49
|
+
} from 'cdp-material-sdk/portable';
|
|
50
|
+
|
|
51
|
+
export const acmeAvatarManifest = {
|
|
52
|
+
type: 'acme.Avatar',
|
|
53
|
+
meta: {
|
|
54
|
+
title: '头像',
|
|
55
|
+
description: '用于展示用户头像、首字母或占位图',
|
|
56
|
+
category: COMPONENT_CATEGORY.DATA_DISPLAY,
|
|
57
|
+
subGroup: '用户信息',
|
|
58
|
+
icon: 'user-circle',
|
|
59
|
+
},
|
|
60
|
+
// ...
|
|
61
|
+
} satisfies ComponentManifest;
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## icon
|
|
67
|
+
|
|
68
|
+
`meta.icon` 是字符串,具体含义由设计器决定。常见约定:
|
|
69
|
+
|
|
70
|
+
- 设计器内置图标库的图标名(例如 `user-circle`、`table-2`)。
|
|
71
|
+
- 组件包随附的 SVG 资源标识(如 `acme://icons/avatar`)。
|
|
72
|
+
- 远程图标 URL(部分设计器支持)。
|
|
73
|
+
|
|
74
|
+
经验法则:
|
|
75
|
+
|
|
76
|
+
- 优先使用设计器内置图标库,跨组件保持视觉一致。
|
|
77
|
+
- 不写就会用分类的默认图标,作者在最小实现阶段可以先不填。
|
|
78
|
+
- 不要把业务态图标(如「在线 / 离线」)放进 `icon`,那是组件运行时的渲染范围。
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## subGroup
|
|
83
|
+
|
|
84
|
+
`subGroup` 在 `category` 之下做二次分组,物料面板会把同一 `subGroup` 的组件聚合显示。
|
|
85
|
+
|
|
86
|
+
| 用法 | 示例 |
|
|
87
|
+
|------|------|
|
|
88
|
+
| 同分类下的功能子集 | `category: DATA_ENTRY`、`subGroup: '日期时间'` |
|
|
89
|
+
| 同源组件聚合 | `category: DATA_DISPLAY`、`subGroup: '用户信息'` |
|
|
90
|
+
| 业务领域聚合 | `category: GENERAL`、`subGroup: '工作流'` |
|
|
91
|
+
|
|
92
|
+
经验法则:
|
|
93
|
+
|
|
94
|
+
- 同包内尽量复用相同的 `subGroup` 字符串,避免出现「日期时间」「日期 / 时间」「日期类」这种近义但不同的分组。
|
|
95
|
+
- 跨包的 `subGroup` 由设计器决定是否合并展示,不要依赖跨包合并行为。
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## hiddenInComponentList
|
|
100
|
+
|
|
101
|
+
声明 `hiddenInComponentList: true` 后,组件不会出现在物料面板,但仍可以:
|
|
102
|
+
|
|
103
|
+
- 通过父组件的 `slots.allowedChildren` 或 `nesting.allowedChildren` 被自动加入。
|
|
104
|
+
- 被设计器复制粘贴、撤销恢复。
|
|
105
|
+
- 在运行时渲染。
|
|
106
|
+
|
|
107
|
+
典型场景:
|
|
108
|
+
|
|
109
|
+
- **父子绑定的子部件**:例如 `acme.TabPane`、`acme.StepItem`、`acme.TableColumn`,必须在父容器里使用,不应单独拖入。
|
|
110
|
+
- **内部辅助组件**:例如某个仅在 wrapper 中使用的中间层组件。
|
|
111
|
+
- **过渡期废弃组件**:保持 `type` 兼容性,但不希望新页面再使用。
|
|
112
|
+
|
|
113
|
+
经验法则:
|
|
114
|
+
|
|
115
|
+
- 子部件类组件几乎都应该 `hiddenInComponentList: true`,并通过父组件的 `nesting` / `slots` 暴露入口。
|
|
116
|
+
- 不要用 `hiddenInComponentList` 来"软删除"组件——保留 manifest 但不可见会让维护者困惑。彻底废弃应通过版本号或 `alias` 标记。
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 自检
|
|
121
|
+
|
|
122
|
+
- [ ] `meta.title` 与 `meta.description` 都是面向使用者的可读文案。
|
|
123
|
+
- [ ] `meta.category` 选择合适的顶层分类。
|
|
124
|
+
- [ ] 同包内 `subGroup` 字符串保持一致。
|
|
125
|
+
- [ ] `meta.icon` 引用设计器或组件包能够解析的标识。
|
|
126
|
+
- [ ] 子部件类组件已声明 `hiddenInComponentList: true`,并由父组件通过 `nesting` / `slots` 暴露。
|
|
127
|
+
- [ ] `validateManifest()` 没有 error。
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 常见错误
|
|
132
|
+
|
|
133
|
+
### 用 hiddenInComponentList 隐藏未实现的组件
|
|
134
|
+
|
|
135
|
+
物料面板看不到,但 manifest 仍会被加载、校验。请直接不导出该组件,或用包级开关控制。
|
|
136
|
+
|
|
137
|
+
### 在 title 里塞业务前缀
|
|
138
|
+
|
|
139
|
+
`meta.title` 是物料面板的显示名,建议简洁可读("头像"、"日期选择")。业务来源信息可以放进 `description`,或通过 `subGroup` 分组。
|
|
140
|
+
|
|
141
|
+
### subGroup 写得太散
|
|
142
|
+
|
|
143
|
+
每写一次新的 `subGroup` 字符串,物料面板就会多一个分组。同一类组件若要聚合,请在包内复用同一个常量。
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 关联文档
|
|
148
|
+
|
|
149
|
+
本文档只保留本层级职责内容:Recipe 提供任务步骤,Reference 提供稳定模型和规则,validateManifest 文档提供校验级别事实源。
|
|
150
|
+
|
|
151
|
+
- 字段参考:[Manifest字段参考](../reference/Manifest字段参考.md)
|
|
152
|
+
- 起步流程:[03-开发最小可运行组件](../getting-started/03-开发最小可运行组件.md)
|
|
153
|
+
- 校验规则:[validateManifest校验规则](../reference/validateManifest校验规则.md)
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: reference
|
|
3
|
+
capability: actions-state
|
|
4
|
+
related:
|
|
5
|
+
- recipes/声明动作与状态.md
|
|
6
|
+
- reference/validateManifest校验规则.md
|
|
7
|
+
- reference/示例代码索引.md
|
|
8
|
+
---
|
|
9
|
+
# Actions / State 模型
|
|
10
|
+
|
|
11
|
+
Actions 和 State 共用 React ref 通道:组件通过 `useImperativeHandle` 暴露方法和只读运行时状态。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Actions
|
|
16
|
+
|
|
17
|
+
Action 是宿主调用组件的方法。
|
|
18
|
+
|
|
19
|
+
Manifest:
|
|
20
|
+
|
|
21
|
+
```ts
|
|
22
|
+
actions: {
|
|
23
|
+
refresh: {
|
|
24
|
+
title: '刷新',
|
|
25
|
+
returns: { type: 'boolean' },
|
|
26
|
+
},
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
实现:
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
useImperativeHandle(ref, () => ({
|
|
34
|
+
refresh: async () => true,
|
|
35
|
+
}), []);
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
规则:
|
|
39
|
+
|
|
40
|
+
- `actions.*.title` 必填。
|
|
41
|
+
- `params` 如果声明,`type` 必须是 `object`。
|
|
42
|
+
- `returns` 建议声明。
|
|
43
|
+
- action key 必须和 ref 方法名一致。
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## State
|
|
48
|
+
|
|
49
|
+
State 是组件暴露给宿主的只读运行时快照。
|
|
50
|
+
|
|
51
|
+
Manifest:
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
state: {
|
|
55
|
+
highlighted: {
|
|
56
|
+
title: '高亮状态',
|
|
57
|
+
schema: { type: 'boolean' },
|
|
58
|
+
},
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
实现:
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
import { COMPONENT_STATE_KEY } from 'cdp-material-sdk/portable';
|
|
66
|
+
|
|
67
|
+
useImperativeHandle(ref, () => ({
|
|
68
|
+
[COMPONENT_STATE_KEY]: {
|
|
69
|
+
highlighted,
|
|
70
|
+
},
|
|
71
|
+
}), [highlighted]);
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
规则:
|
|
75
|
+
|
|
76
|
+
- `state.*.title` 必填。
|
|
77
|
+
- `state.*.schema` 必填。
|
|
78
|
+
- state key 必须出现在 `COMPONENT_STATE_KEY` 对象中。
|
|
79
|
+
- state 是只读的;修改组件应通过 action。
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 诊断工具
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
import {
|
|
87
|
+
COMPONENT_STATE_KEY,
|
|
88
|
+
diagnoseMissingActionImpls,
|
|
89
|
+
diagnoseMissingStateKeys,
|
|
90
|
+
} from 'cdp-material-sdk/portable';
|
|
91
|
+
|
|
92
|
+
const missingActions = diagnoseMissingActionImpls(
|
|
93
|
+
Object.keys(manifest.actions ?? {}),
|
|
94
|
+
ref.current,
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
const missingStates = diagnoseMissingStateKeys(
|
|
98
|
+
manifest,
|
|
99
|
+
ref.current?.[COMPONENT_STATE_KEY],
|
|
100
|
+
);
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 模型边界
|
|
106
|
+
|
|
107
|
+
| 边界 | 说明 |
|
|
108
|
+
|------|------|
|
|
109
|
+
| action key 与 ref 方法 | manifest 中声明的 action key 是宿主调用 ref 方法的名称 |
|
|
110
|
+
| action params | 声明参数时,`params.type` 必须是 `object` |
|
|
111
|
+
| state 写操作 | State 是只读运行时快照,需要修改组件时应通过 action |
|
|
112
|
+
| 诊断工具 | 实现一致性检查见任务文档和 `diagnoseMissingActionImpls()` / `diagnoseMissingStateKeys()` |
|
|
113
|
+
|
|
114
|
+
具体 error / warning 级别见 [validateManifest 校验规则](./validateManifest校验规则.md)。
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 任务路径
|
|
119
|
+
|
|
120
|
+
本文档只保留本层级职责内容:Recipe 提供任务步骤,Reference 提供稳定模型和规则,validateManifest 文档提供校验级别事实源。
|
|
121
|
+
|
|
122
|
+
- 任务 Recipe:[声明动作与状态](../recipes/声明动作与状态.md)
|
|
123
|
+
- 校验规则:[validateManifest校验规则](./validateManifest校验规则.md)
|
|
124
|
+
- 示例索引:[示例代码索引](./示例代码索引.md)
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: reference
|
|
3
|
+
capability: rootpath
|
|
4
|
+
related:
|
|
5
|
+
- reference/引擎基础能力模型.md
|
|
6
|
+
- recipes/配置DOM根节点注入.md
|
|
7
|
+
- reference/Manifest字段参考.md
|
|
8
|
+
- reference/validateManifest校验规则.md
|
|
9
|
+
---
|
|
10
|
+
# DOM 根节点注入模型
|
|
11
|
+
|
|
12
|
+
DOM 根节点注入定义宿主把组件基础能力所需的根节点 props 注入到组件 props 的位置。
|
|
13
|
+
|
|
14
|
+
字段路径:`manifest.engine.render.injection.rootPath`。
|
|
15
|
+
|
|
16
|
+
`rootPath` 是 SDK 字段名。对组件作者来说,可以把它理解为“组件真实 DOM 根节点在哪里接收宿主注入”。
|
|
17
|
+
|
|
18
|
+
DOM 根节点注入不是单纯的 DOM 标记配置。它决定宿主赋予组件的基础能力能否与真实 DOM 对齐,尤其影响设计器选中、路径定位和显隐控制。基础能力模型见 [引擎基础能力模型](./引擎基础能力模型.md)。
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 宿主需要注入什么
|
|
23
|
+
|
|
24
|
+
宿主会向组件根节点注入实现基础能力所需的 props 和 ref。组件作者不需要关心宿主内部使用了哪些 DOM 标记,只需要确保这些 props 最终落到真实 DOM 节点上。
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 为什么 DOM 根节点注入是必确认项
|
|
29
|
+
|
|
30
|
+
| 如果注入位置正确 | 如果注入位置不正确 |
|
|
31
|
+
|-------------------|---------------------|
|
|
32
|
+
| 设计器能定位和选中组件根节点 | 选中框可能偏移或找不到目标 DOM |
|
|
33
|
+
| 路径定位能与真实组件区域对齐 | 路径定位不稳定 |
|
|
34
|
+
| 显隐控制能作用于真实组件根节点 | 显隐控制可能只影响 wrapper 或无效节点 |
|
|
35
|
+
| ref 和系统属性能进入正确节点 | 运行时能力可能无法与组件 DOM 对齐 |
|
|
36
|
+
|
|
37
|
+
因此,正式组件开发时应把 DOM 根节点注入当作交付前必须确认的契约,而不是可选优化。
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 支持的模式
|
|
42
|
+
|
|
43
|
+
| rootPath 字段值 | 说明 | 推荐场景 |
|
|
44
|
+
|----------|------|----------|
|
|
45
|
+
| 不声明 | 宿主外层 `<div>` 兜底 | 黑盒组件、临时接入 |
|
|
46
|
+
| `$root` | 直接合并到组件 props 根层 | props 会透传到根 DOM 的原子组件 |
|
|
47
|
+
| `slotProps.root` | 注入到 `slotProps.root` | 推荐默认方式 |
|
|
48
|
+
| 自定义路径 | 注入到指定 props 路径 | 包装组件或特殊组件 API |
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 推荐模式:`slotProps.root`
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
<div {...slotProps?.root}>...</div>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
import { INJECT_PATH_SLOT_PROPS } from 'cdp-material-sdk/portable';
|
|
60
|
+
|
|
61
|
+
engine: {
|
|
62
|
+
render: {
|
|
63
|
+
injection: {
|
|
64
|
+
rootPath: INJECT_PATH_SLOT_PROPS,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 自定义路径
|
|
73
|
+
|
|
74
|
+
自定义路径不是错误,但作者必须负责透传:
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
engine: {
|
|
78
|
+
render: {
|
|
79
|
+
injection: {
|
|
80
|
+
rootPath: 'containerProps.root',
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
```tsx
|
|
87
|
+
<section {...props.containerProps?.root}>...</section>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
`validateManifest()` 会提示确认透传是否完成。若已按规则实现,可忽略该 warning。
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 选择建议
|
|
95
|
+
|
|
96
|
+
| 场景 | 建议 |
|
|
97
|
+
|------|------|
|
|
98
|
+
| 新组件 | `slotProps.root` |
|
|
99
|
+
| 包装第三方组件 | wrapper 外层 DOM + `slotProps.root` |
|
|
100
|
+
| 原子 DOM 组件 | `$root` |
|
|
101
|
+
| 黑盒组件 | 不声明 rootPath |
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 模型边界
|
|
106
|
+
|
|
107
|
+
| 边界 | 说明 |
|
|
108
|
+
|------|------|
|
|
109
|
+
| 真实 DOM | 宿主系统属性需要最终落到真实 DOM 节点,不能只停留在不会透传 DOM 属性的 React 组件上 |
|
|
110
|
+
| 宿主兜底 | 不声明 rootPath 时,宿主可以外层 wrapper 兜底,但可能影响 DOM 结构 |
|
|
111
|
+
| 自定义路径 | 合法,但作者必须确认该路径会透传到 DOM |
|
|
112
|
+
| 基础能力 | 基础能力由宿主提供,DOM 根节点注入负责让这些能力与真实 DOM 对齐 |
|
|
113
|
+
|
|
114
|
+
具体 warning 处理建议见 [validateManifest 校验规则](./validateManifest校验规则.md)。
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## 任务路径
|
|
119
|
+
|
|
120
|
+
本文档只保留本层级职责内容:Recipe 提供任务步骤,Reference 提供稳定模型和规则,validateManifest 文档提供校验级别事实源。
|
|
121
|
+
|
|
122
|
+
- 模型参考:[引擎基础能力模型](./引擎基础能力模型.md)
|
|
123
|
+
- 任务 Recipe:[配置DOM根节点注入](../recipes/配置DOM根节点注入.md)
|
|
124
|
+
- 字段参考:[Manifest字段参考](./Manifest字段参考.md)
|
|
125
|
+
- 校验规则:[validateManifest校验规则](./validateManifest校验规则.md)
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: reference
|
|
3
|
+
capability: events
|
|
4
|
+
related:
|
|
5
|
+
- recipes/声明事件.md
|
|
6
|
+
- recipes/使用Adapter适配组件API.md
|
|
7
|
+
- reference/validateManifest校验规则.md
|
|
8
|
+
- reference/示例代码索引.md
|
|
9
|
+
---
|
|
10
|
+
# Events 模型
|
|
11
|
+
|
|
12
|
+
Events 用于描述组件会向宿主发出的通知。事件是可选能力,不需要对外通知时可以不声明。
|
|
13
|
+
|
|
14
|
+
声明事件时优先使用标准事件;只有标准事件无法表达业务语义或 payload 结构时,才声明自定义事件。
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 事件类型
|
|
19
|
+
|
|
20
|
+
| 类型 | 声明位置 | 说明 |
|
|
21
|
+
|------|----------|------|
|
|
22
|
+
| 标准事件 | `events` | 宿主协议内置事件,例如 `click`、`valueChange` |
|
|
23
|
+
| 自定义事件 | `customEvents` | 组件或业务自定义事件,必须 namespaced |
|
|
24
|
+
| Adapter 事件 | `adapter.events` / `adapter.customEvents` | 将组件实际事件 prop、回调参数和作用域映射到 manifest 事件 |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 标准事件
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
events: {
|
|
32
|
+
click: { title: '点击' },
|
|
33
|
+
valueChange: { title: '值变化' },
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
标准事件类型必须属于 SDK 定义的事件协议。
|
|
38
|
+
|
|
39
|
+
标准事件表:
|
|
40
|
+
|
|
41
|
+
| type | 含义 | 标准 payload | 标准 props |
|
|
42
|
+
|------|------|--------------|------------|
|
|
43
|
+
| `mount` | 组件挂载 | 无 | `onMount` |
|
|
44
|
+
| `unmount` | 组件卸载 | 无 | `onUnmount` |
|
|
45
|
+
| `click` | 点击 | 无 | `onClick` |
|
|
46
|
+
| `focus` | 聚焦 | 无 | `onFocus` |
|
|
47
|
+
| `blur` | 失焦 | 无 | `onBlur` |
|
|
48
|
+
| `valueChange` | 主值变化 | `{ newValue: any; oldValue: any }` | `onChange` |
|
|
49
|
+
| `itemClick` | 条目点击 | `{ index: number; item: Record<string, any> }` | `onItemClick` |
|
|
50
|
+
| `itemDoubleClick` | 条目双击 | `{ index: number; item: Record<string, any> }` | `onItemDoubleClick` |
|
|
51
|
+
| `itemRightClick` | 条目右键点击 | `{ index: number; item: Record<string, any> }` | `onItemRightClick` |
|
|
52
|
+
| `itemLongPress` | 条目长按 | `{ index: number; item: Record<string, any> }` | `onItemLongPress` |
|
|
53
|
+
| `dataFetch` | 请求数据 | `{ panelCode: string; condition?: Record<string, any>; keyword?: string; pageNo?: number; pageSize?: number; orderBy?: Array<Record<string, unknown>>; advancedConditions?: Record<string, unknown>; fieldInfo?: { fieldName: string } }` | `onDataFetch` |
|
|
54
|
+
|
|
55
|
+
这里的标准 props 是组件作者建议暴露的回调 prop 名。第三方组件实际 prop 名不同,或回调参数不符合标准 payload 时,使用 Adapter 映射。
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 自定义事件
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
customEvents: {
|
|
63
|
+
'acme:rowClick': {
|
|
64
|
+
title: '行点击',
|
|
65
|
+
payloadSchema: {
|
|
66
|
+
type: 'object',
|
|
67
|
+
properties: {
|
|
68
|
+
rowKey: { type: 'string' },
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
规则:
|
|
76
|
+
|
|
77
|
+
- 事件名必须是 namespaced 形态,例如 `acme:rowClick`。
|
|
78
|
+
- 必须声明 `payloadSchema`。
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Adapter 映射
|
|
83
|
+
|
|
84
|
+
Adapter 用于把组件实际 props 和回调参数转换为 CDP 事件协议。它适合第三方组件 prop 名不同,或回调参数需要转换成标准 payload 的场景。完整用法见 [使用 Adapter 适配组件 API](../recipes/使用Adapter适配组件API.md)。
|
|
85
|
+
|
|
86
|
+
标准事件 prop 名不同:
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
events: {
|
|
90
|
+
click: { title: '点击' },
|
|
91
|
+
},
|
|
92
|
+
adapter: {
|
|
93
|
+
events: {
|
|
94
|
+
click: {
|
|
95
|
+
propName: 'onPress',
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
标准事件 payload 不同:
|
|
102
|
+
|
|
103
|
+
```ts
|
|
104
|
+
events: {
|
|
105
|
+
valueChange: { title: '值变化' },
|
|
106
|
+
},
|
|
107
|
+
adapter: {
|
|
108
|
+
events: {
|
|
109
|
+
valueChange: {
|
|
110
|
+
propName: 'onSelectedValueChange',
|
|
111
|
+
transform: (nextValue, previousValue) => ({
|
|
112
|
+
newValue: nextValue,
|
|
113
|
+
oldValue: previousValue,
|
|
114
|
+
}),
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
自定义事件映射:
|
|
121
|
+
|
|
122
|
+
```ts
|
|
123
|
+
customEvents: {
|
|
124
|
+
'acme:rowAction': {
|
|
125
|
+
title: '行操作',
|
|
126
|
+
payloadSchema: {
|
|
127
|
+
type: 'object',
|
|
128
|
+
properties: {
|
|
129
|
+
action: { type: 'string' },
|
|
130
|
+
rowKey: { type: 'string' },
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
adapter: {
|
|
136
|
+
customEvents: {
|
|
137
|
+
'acme:rowAction': {
|
|
138
|
+
propName: 'onRowAction',
|
|
139
|
+
transform: (action, record) => ({
|
|
140
|
+
action,
|
|
141
|
+
rowKey: record.id,
|
|
142
|
+
}),
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Adapter 只能映射已经声明过的事件。具体校验级别见 [validateManifest 校验规则](./validateManifest校验规则.md)。
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 事件与 actions 的区别
|
|
153
|
+
|
|
154
|
+
| 对比 | Events | Actions |
|
|
155
|
+
|------|--------|---------|
|
|
156
|
+
| 方向 | 组件通知宿主 | 宿主调用组件 |
|
|
157
|
+
| 触发者 | 组件内部行为 | 外部流程、指令或 AI |
|
|
158
|
+
| 示例 | 点击、值变化、行选择 | 刷新、清空、聚焦 |
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## 任务路径
|
|
164
|
+
|
|
165
|
+
本文档只保留本层级职责内容:Recipe 提供任务步骤,Reference 提供稳定模型和规则,validateManifest 文档提供校验级别事实源。
|
|
166
|
+
|
|
167
|
+
- 任务 Recipe:[声明事件](../recipes/声明事件.md)
|
|
168
|
+
- 任务 Recipe:[使用Adapter适配组件API](../recipes/使用Adapter适配组件API.md)
|
|
169
|
+
- 校验规则:[validateManifest校验规则](./validateManifest校验规则.md)
|
|
170
|
+
- 示例索引:[示例代码索引](./示例代码索引.md)
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: reference
|
|
3
|
+
capability: loading
|
|
4
|
+
related:
|
|
5
|
+
- recipes/配置Loading策略.md
|
|
6
|
+
- reference/Manifest字段参考.md
|
|
7
|
+
- recipes/声明动作与状态.md
|
|
8
|
+
---
|
|
9
|
+
# Loading 策略模型
|
|
10
|
+
|
|
11
|
+
Loading 策略定义在 `manifest.engine.render.loading`,用于声明宿主如何控制组件加载态。
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 字段定义
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
engine: {
|
|
19
|
+
render: {
|
|
20
|
+
loading: {
|
|
21
|
+
strategy: 'native' | 'wrapper' | 'none',
|
|
22
|
+
propName?: string,
|
|
23
|
+
wrapperType?: 'spin' | 'skeleton' | 'wave' | string,
|
|
24
|
+
wrapperProps?: Record<string, any>,
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 策略能力表
|
|
33
|
+
|
|
34
|
+
| strategy | 注入 props | 自动 actions | Overlay | `setLoading.text` |
|
|
35
|
+
|----------|------------|--------------|---------|-------------------|
|
|
36
|
+
| `native` | 是,默认 `loading` | `getLoading` / `setLoading` | 否 | 否 |
|
|
37
|
+
| `wrapper + spin` | 否 | `getLoading` / `setLoading` | 是 | 是 |
|
|
38
|
+
| `wrapper + wave` | 否 | `getLoading` / `setLoading` | 是 | 是 |
|
|
39
|
+
| `wrapper + skeleton` | 否 | `getLoading` / `setLoading` | 是 | 否 |
|
|
40
|
+
| `none` | 否 | 否 | 否 | 否 |
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## native
|
|
45
|
+
|
|
46
|
+
`native` 表示组件自己支持 loading prop。
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
engine: {
|
|
50
|
+
render: {
|
|
51
|
+
loading: {
|
|
52
|
+
strategy: 'native',
|
|
53
|
+
propName: 'spinning',
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
规则:
|
|
60
|
+
|
|
61
|
+
- `propName` 不填时,宿主注入 `loading`。
|
|
62
|
+
- `propName` 填写后,宿主会将 `loading` 映射到该 prop。
|
|
63
|
+
- 组件必须在 loading 为 true 时阻断交互。
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## wrapper
|
|
68
|
+
|
|
69
|
+
`wrapper` 表示宿主在组件外部提供遮罩或占位。
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
engine: {
|
|
73
|
+
render: {
|
|
74
|
+
loading: {
|
|
75
|
+
strategy: 'wrapper',
|
|
76
|
+
wrapperType: 'wave',
|
|
77
|
+
wrapperProps: {},
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
内置 wrapper:
|
|
84
|
+
|
|
85
|
+
| wrapperType | 说明 |
|
|
86
|
+
|-------------|------|
|
|
87
|
+
| `wave` | 默认遮罩 |
|
|
88
|
+
| `spin` | 旋转加载 |
|
|
89
|
+
| `skeleton` | 骨架屏 |
|
|
90
|
+
|
|
91
|
+
自定义 `wrapperType` 会按组件 type 查找宿主已注册组件。未找到时,开发环境会提示并回退到 `wave`。
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## none
|
|
96
|
+
|
|
97
|
+
`none` 表示宿主不接管 loading。
|
|
98
|
+
|
|
99
|
+
适合:
|
|
100
|
+
|
|
101
|
+
- Table。
|
|
102
|
+
- TreeTable。
|
|
103
|
+
- AsyncSelect。
|
|
104
|
+
- 内部有复杂请求状态的业务组件。
|
|
105
|
+
|
|
106
|
+
如需外部控制,请自行声明并实现 `setLoading` / `getLoading` actions。
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 与 actions 的关系
|
|
111
|
+
|
|
112
|
+
当 strategy 为 `native` 或 `wrapper` 时,宿主会自动提供:
|
|
113
|
+
|
|
114
|
+
- `getLoading`
|
|
115
|
+
- `setLoading`
|
|
116
|
+
|
|
117
|
+
当 strategy 为 `none` 或不声明 loading 时,宿主不会自动提供这些 actions。
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 模型边界
|
|
122
|
+
|
|
123
|
+
| 边界 | 说明 |
|
|
124
|
+
|------|------|
|
|
125
|
+
| 字段路径 | Loading 策略位于 `engine.render.loading`,不是 `engine.loading` |
|
|
126
|
+
| `native` | 宿主注入 loading prop,组件自身必须阻断交互 |
|
|
127
|
+
| `wrapper` | 宿主在组件外部提供遮罩或占位,不注入 loading prop |
|
|
128
|
+
| `none` | 宿主不接管 loading,也不自动提供 loading actions |
|
|
129
|
+
|
|
130
|
+
任务选型和自检步骤见 [配置 Loading 策略](../recipes/配置Loading策略.md)。
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 任务路径
|
|
135
|
+
|
|
136
|
+
本文档只保留本层级职责内容:Recipe 提供任务步骤,Reference 提供稳定模型和规则,validateManifest 文档提供校验级别事实源。
|
|
137
|
+
|
|
138
|
+
- 任务 Recipe:[配置Loading策略](../recipes/配置Loading策略.md)
|
|
139
|
+
- 字段参考:[Manifest字段参考](./Manifest字段参考.md)
|
|
140
|
+
- 任务 Recipe:[声明动作与状态](../recipes/声明动作与状态.md)
|