lcap-frontend-library 0.0.1

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.
Files changed (84) hide show
  1. package/README.md +271 -0
  2. package/bin/lcap-frontend-library.mjs +3 -0
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.js +27 -0
  5. package/dist/init.d.ts +6 -0
  6. package/dist/init.js +79 -0
  7. package/dist/sync.d.ts +4 -0
  8. package/dist/sync.js +70 -0
  9. package/dist/utils.d.ts +19 -0
  10. package/dist/utils.js +101 -0
  11. package/package.json +34 -0
  12. package/packages/lcap-frontend-library/LEARNINGS.md +11 -0
  13. package/packages/lcap-frontend-library/SKILL.md +86 -0
  14. package/packages/lcap-frontend-library/commands/migrate.check.md +287 -0
  15. package/packages/lcap-frontend-library/commands/migrate.green.md +190 -0
  16. package/packages/lcap-frontend-library/commands/migrate.plan.md +169 -0
  17. package/packages/lcap-frontend-library/commands/migrate.red.md +160 -0
  18. package/packages/lcap-frontend-library/commands/migrate.scan.md +151 -0
  19. package/packages/lcap-frontend-library/commands/migrate.spec.md +144 -0
  20. package/packages/lcap-frontend-library/commands/migrate.tasks.md +179 -0
  21. package/packages/lcap-frontend-library/commands/speckit.create.md +201 -0
  22. package/packages/lcap-frontend-library/commands/speckit.implement.md +88 -0
  23. package/packages/lcap-frontend-library/commands/speckit.plan.md +79 -0
  24. package/packages/lcap-frontend-library/commands/speckit.self-check.md +177 -0
  25. package/packages/lcap-frontend-library/commands/speckit.specify.md +91 -0
  26. package/packages/lcap-frontend-library/commands/speckit.tasks.md +61 -0
  27. package/packages/lcap-frontend-library/references/frontend-design/LICENSE.txt +177 -0
  28. package/packages/lcap-frontend-library/references/frontend-design/SKILL.md +42 -0
  29. package/packages/lcap-frontend-library/references/lcap-extension-component/SKILL.md +360 -0
  30. package/packages/lcap-frontend-library/references/lcap-extension-component/api.md +331 -0
  31. package/packages/lcap-frontend-library/references/lcap-extension-component/block.md +160 -0
  32. package/packages/lcap-frontend-library/references/lcap-extension-component/i18n.md +95 -0
  33. package/packages/lcap-frontend-library/references/lcap-extension-component/icon.md +27 -0
  34. package/packages/lcap-frontend-library/references/lcap-extension-component/ide/container.md +728 -0
  35. package/packages/lcap-frontend-library/references/lcap-extension-component/ide/element.md +312 -0
  36. package/packages/lcap-frontend-library/references/lcap-extension-component/ide/expression.md +154 -0
  37. package/packages/lcap-frontend-library/references/lcap-extension-component/ide/index.md +113 -0
  38. package/packages/lcap-frontend-library/references/lcap-extension-component/ide/modal.md +189 -0
  39. package/packages/lcap-frontend-library/references/lcap-extension-component/ide/popover.md +171 -0
  40. package/packages/lcap-frontend-library/references/lcap-extension-component/ide.md +799 -0
  41. package/packages/lcap-frontend-library/references/lcap-extension-component/implementation-rules.md +242 -0
  42. package/packages/lcap-frontend-library/references/lcap-extension-component/index.md +27 -0
  43. package/packages/lcap-frontend-library/references/lcap-extension-component/nasl-view-component.md +895 -0
  44. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/accessibility.md +185 -0
  45. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/child.md +82 -0
  46. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/data-source.md +261 -0
  47. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/event.md +171 -0
  48. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/form.md +266 -0
  49. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/function.md +80 -0
  50. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/link.md +137 -0
  51. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/slot.md +128 -0
  52. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/theme-variables-ant-design.md +1470 -0
  53. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/theme-variables-cloud-ui.md +259 -0
  54. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/theme-variables-element-plus.md +580 -0
  55. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/theme-variables-element-ui.md +1007 -0
  56. package/packages/lcap-frontend-library/references/lcap-extension-component/platform/theme-variables-mobile-ui.md +85 -0
  57. package/packages/lcap-frontend-library/references/lcap-extension-component/theme.md +234 -0
  58. package/packages/lcap-frontend-library/references/lcap-extension-component/workflow-guardrails.md +328 -0
  59. package/packages/lcap-frontend-library/references/nasl-logic-authoring/SKILL.md +201 -0
  60. package/packages/lcap-frontend-library/scripts/bash/create-component-files.sh +95 -0
  61. package/packages/lcap-frontend-library/scripts/bash/create-extension-project.sh +109 -0
  62. package/packages/lcap-frontend-library/scripts/bash/create-logic-files.sh +149 -0
  63. package/packages/lcap-frontend-library/scripts/bash/create-spec.sh +109 -0
  64. package/packages/lcap-frontend-library/scripts/bash/get-available-port.sh +35 -0
  65. package/packages/lcap-frontend-library/scripts/bash/list-specs.sh +19 -0
  66. package/packages/lcap-frontend-library/scripts/node/setup-extension-project.mjs +166 -0
  67. package/packages/lcap-frontend-library/templates/component-self-check.md +31 -0
  68. package/packages/lcap-frontend-library/templates/component-template.md +96 -0
  69. package/packages/lcap-frontend-library/templates/library-report-template.md +52 -0
  70. package/packages/lcap-frontend-library/templates/logic-template.md +44 -0
  71. package/packages/lcap-frontend-library/templates/migration-manifest-template.md +84 -0
  72. package/packages/lcap-frontend-library/templates/migration-plan-template.md +138 -0
  73. package/packages/lcap-frontend-library/templates/migration-report-template.md +227 -0
  74. package/packages/lcap-frontend-library/templates/migration-spec-template.md +135 -0
  75. package/packages/lcap-frontend-library/templates/migration-tasks-template.md +129 -0
  76. package/packages/lcap-frontend-library/templates/plan-template.md +299 -0
  77. package/packages/lcap-frontend-library/templates/self-check-report-template.md +148 -0
  78. package/packages/lcap-frontend-library/templates/tasks-template.md +81 -0
  79. package/packages/lcap-frontend-library/workflows/create/flow.md +199 -0
  80. package/packages/lcap-frontend-library/workflows/evolve/flow.md +249 -0
  81. package/packages/lcap-frontend-library/workflows/generate/flow.md +10 -0
  82. package/packages/lcap-frontend-library/workflows/harness/flow.md +82 -0
  83. package/packages/lcap-frontend-library/workflows/migrate/flow.md +302 -0
  84. package/packages/lcap-frontend-library/workflows/migrate/knowledge-base.md +564 -0
@@ -0,0 +1,266 @@
1
+ ---
2
+ outline: deep
3
+ ---
4
+
5
+ <script setup>
6
+ import { VTCodeGroup, VTCodeGroupTab } from '../../../.vitepress/components'
7
+ </script>
8
+
9
+
10
+ # 表单组件的能力适配
11
+
12
+ 在设计表单类组件时,需确保组件具备作为表单项的能力,主要包括以下两个方面:
13
+
14
+ - [组件的值能够实现双向绑定](#值双向绑定处理​);
15
+ - [组件的值可以进行校验](#组件支持表单校验
16
+
17
+ ## 值双向绑定处理
18
+ ### 1. 功能说明
19
+
20
+ 平台需要组件支持值同步到绑定变量的能力,用于传递表单项中输入、选择的值。
21
+
22
+
23
+
24
+ 以单行输入组件为例,功能效果参考如下:
25
+
26
+ 1. 在IDE中,单行输入的“值”属性对应输入框中的内容,该数据支持编辑表达式。
27
+
28
+ 1. 编辑表达式时,若绑定变量,支持开启“将组件输入赋值给变量”。开启“将组件输入赋值给变量”后即表示支持值同步到绑定变量。
29
+
30
+ 1. 发布应用后,在制品中向输入框中输入内容,该输入内容即同步存储到绑定变量中。
31
+
32
+ ### 2. 功能实现
33
+
34
+ 1. 目前 Vue2 通过.sync修饰符来支持绑定同步,社区组件很多只适配了 v-model,需要组件内部对外抛出 \$emit('update\:value')事件。
35
+
36
+ ```typescript
37
+ <template>
38
+ <el-input v-bind="$attrs" :value="value" @input="handleInput" />
39
+ </template>
40
+ <script>
41
+ export default {
42
+ props: {
43
+ value: String,
44
+ },
45
+ methods: {
46
+ handleInput(val) {
47
+ this.$emit('update:value', val);
48
+ this.$emit('input', val);
49
+ },
50
+ }
51
+ }
52
+ </script>
53
+ ```
54
+
55
+ <div class="highlight">
56
+
57
+ React 会自动监听onChange事件来更新绑定变量。
58
+
59
+ </div>
60
+
61
+
62
+ 1. 在 api.ts 文件中为相关属性设置sync: true即为允许同步。
63
+
64
+ ```typescript
65
+ @Prop({
66
+ group: '数据属性',
67
+ title: '值',
68
+ sync: true, // 开启值同步
69
+ })
70
+ value: V;
71
+ ```
72
+
73
+ ## 组件支持表单校验
74
+
75
+ ### Vue2 框架下表单验证支持
76
+
77
+ 默认 `Vue2` 组件 `option` 中设置了 `model` 既可以支持表单验证, 例如:
78
+
79
+ ```vue
80
+ <template>
81
+ <input :value="value" @input="handleInput" />
82
+ </template>
83
+ <script>
84
+ export default {
85
+ model: {
86
+ prop: 'value',
87
+ event: 'update:value',
88
+ },
89
+ props: {
90
+ value: String,
91
+ },
92
+ methods: {
93
+ handleInput(val) {
94
+ this.$emit('update:value', val);
95
+ this.$emit('input', val);
96
+ },
97
+ }
98
+ }
99
+ </script>
100
+ ```
101
+
102
+ ### Vue3 / React 框架下表单验证支持
103
+
104
+ Vue3 / React 框架下组件能默认支持表单验证,无需修改代码;
105
+
106
+
107
+
108
+ ### Vue2 CloudUI 下的表单验证支持
109
+
110
+ (CloudUI)表单类组件支持验证
111
+
112
+ 需要同步值给负责验证的组件,步骤如下
113
+
114
+
115
+ #### 创建mixins 相关文件
116
+
117
+
118
+ ```js
119
+ // mixins/field.js
120
+ const broadcast = function (condition, eventName, ...args) {
121
+ this.$children.forEach(($child) => {
122
+ if (condition($child)) $child.$emit(eventName, ...args);
123
+ else broadcast.apply($child, [condition, eventName].concat(args));
124
+ });
125
+ };
126
+
127
+
128
+ export default {
129
+ name: 'm-emitter',
130
+ methods: {
131
+ $dispatch(condition, eventName, ...args) {
132
+ if (typeof condition === 'string') {
133
+ const name = condition;
134
+ condition = ($parent) => $parent.$options.name === name;
135
+ }
136
+ let $parent = this.$parent || this.$root;
137
+ while ($parent && !condition($parent)) $parent = $parent.$parent;
138
+ $parent && $parent.$emit(eventName, ...args);
139
+ },
140
+ $broadcast(condition, eventName, ...args) {
141
+ if (typeof condition === 'string') {
142
+ const name = condition;
143
+ condition = ($child) => $child.$options.name === name;
144
+ }
145
+ broadcast.apply(this, [condition, eventName].concat(args));
146
+ },
147
+ $contact(condition, callback) {
148
+ if (typeof condition === 'string') {
149
+ const name = condition;
150
+ condition = ($parent) => $parent.$options.name === name;
151
+ }
152
+ let $parent = this.$parent || this.$root;
153
+ while ($parent && !condition($parent)) $parent = $parent.$parent;
154
+ return $parent && callback($parent);
155
+ },
156
+ $emitPrevent(name, $event, senderVM, ...args) {
157
+ let cancel = false;
158
+ this.$emit(
159
+ name,
160
+ Object.assign($event || {}, {
161
+ preventDefault: () => (cancel = true),
162
+ }),
163
+ senderVM,
164
+ ...args,
165
+ );
166
+ return cancel;
167
+ },
168
+ },
169
+ };
170
+ ```
171
+
172
+
173
+ ```js
174
+ // mixins/field.js
175
+ /* eslint-disable no-unused-expressions */
176
+ import MEmitter from './emitter';
177
+
178
+
179
+ export default {
180
+ name: 'm-field',
181
+ isField: true,
182
+ mixins: [MEmitter],
183
+ data() {
184
+ return {
185
+ validatorVM: undefined,
186
+ formItemVM: undefined, // @compat
187
+ };
188
+ },
189
+ created() {
190
+ this.$dispatch(
191
+ ($parent) => ($parent.$options.name && $parent.$options.name.endsWith('u-form-item'))
192
+ || $parent.$options.isField || $parent.$options.isValidator,
193
+ 'add-field-vm',
194
+ this,
195
+ );
196
+ this.$on('update', (value) => {
197
+ const validatorVM = this.validatorVM || this.formItemVM; // @compat
198
+ validatorVM && validatorVM.$emit('update', value);
199
+ });
200
+ this.$on('input', (value) => {
201
+ const validatorVM = this.validatorVM || this.formItemVM; // @compat
202
+ validatorVM && validatorVM.$emit('input', value);
203
+ });
204
+ this.$on('change', ($event) => {
205
+ const validatorVM = this.validatorVM || this.formItemVM; // @compat
206
+ validatorVM && validatorVM.$emit('change', $event);
207
+ });
208
+ this.$on('focus', () => {
209
+ const validatorVM = this.validatorVM || this.formItemVM; // @compat
210
+ validatorVM && validatorVM.$emit('focus');
211
+ });
212
+ this.$on('blur', () => {
213
+ const validatorVM = this.validatorVM || this.formItemVM; // @compat
214
+ validatorVM && validatorVM.$emit('blur');
215
+ });
216
+ },
217
+ destroyed() {
218
+ const validatorVM = this.validatorVM || this.formItemVM; // @compat
219
+ validatorVM && validatorVM.$emit('remove-field-vm', this);
220
+ },
221
+ };
222
+ ```
223
+
224
+
225
+ #### 引入mixins
226
+
227
+
228
+ ```vue
229
+ // index.vue
230
+ <template>
231
+ <div>
232
+ <input :value="value" @change="handleChange" @input="handleInput" @focus="handleFocus" @blur="handleBlur"` />
233
+ </div>
234
+ </template>
235
+ <script>
236
+ import MField from './mixins/field';
237
+
238
+
239
+ export default {
240
+ name: 'index',
241
+ mixins: [MField],
242
+ data() {
243
+ return {
244
+ value: '',
245
+ };
246
+ },
247
+ methods: {
248
+ handleChange(value) {
249
+ this.value = value;
250
+ this.$emit('change', { value });
251
+ },
252
+ handleInput(value) {
253
+ this.value = value;
254
+ this.$emit('update:value', value);
255
+ this.$emit('input', value);
256
+ },
257
+ handleFocus() {
258
+ this.$emit('focus');
259
+ },
260
+ handleBlur() {
261
+ this.$emit('blur');
262
+ },
263
+ },
264
+ };
265
+ </script>
266
+ ```
@@ -0,0 +1,80 @@
1
+ ---
2
+ outline: deep
3
+ ---
4
+
5
+ # 函数设置器 <Badge type="tip" text="^3.10.0" />
6
+
7
+ ## 1. 功能说明
8
+
9
+ 用于Function类型的函数设置 (AnonymousFunctionSetter),例如: 表格行样式、文本格式化、日期格式化函数等等...
10
+
11
+ 以下以数据表格组件的“表格行动态样式”属性为例:
12
+
13
+
14
+
15
+ ## 2. 功能实现
16
+
17
+ 向 api.ts 文件中写入“表格行动态样式样式”属性:
18
+
19
+ - `bindOpen: true` :表明属性的编辑表达式模式处于开启状态;
20
+ - `concept: 'AnonymousFunctionSetter'` :表明设置器的概念是匿名函数设置器;
21
+ - `rowStyle` 是一个函数类型的属性,接收一个 Current 类型参数 current ,这个函数返回一个对象,包含两个可选的属性:
22
+
23
+
24
+
25
+ - backgroundColor:用于设置列表行的背景颜色,类型为String。
26
+ - color:用于设置列表行的字体颜色,类型为String。
27
+
28
+ ```typescript
29
+ // api.ts
30
+ @Prop({
31
+ group: '样式属性',
32
+ title: '列表行动态样式',
33
+ description: '动态设置列表项背景色、字体颜色等样式',
34
+ docDescription: '动态设置列表项背景色、字体颜色等样式',
35
+ bindOpen: true,
36
+ setter: {
37
+ concept: 'AnonymousFunctionSetter',
38
+ }
39
+ })
40
+ rowStyle: (current: Current<T>) => {
41
+ /**
42
+ - @title 列表行背景颜色
43
+ */
44
+ backgroundColor?: nasl.core.String,
45
+ /**
46
+ - @title 列表行字体颜色
47
+ */
48
+ color?: nasl.core.String
49
+ };
50
+ ```
51
+
52
+ <div class="highlight">
53
+
54
+ 目前仅支持同步函数,返回值不允许是Promise
55
+
56
+ </div>
57
+
58
+
59
+ ## 3. 使用效果演示
60
+
61
+ - 进入编辑表达式界面时,表达式中已有包含 backgroundColor 和 color 属性的匿名数据结构,变量可选参数 current。
62
+
63
+
64
+
65
+ - 支持初始化表格的列表行背景颜色、列表行字体颜色,甚至新增表格已定义的其他属性。
66
+
67
+
68
+
69
+ 制品效果如下:
70
+
71
+
72
+
73
+ <div class="highlight">
74
+
75
+ 使用“表格行动态样式”属性的常见场景具体请参考[如何实现动态展示表格行样式](https://community.codewave.163.com/CommunityParent/fileIndex?filePath=80.%E5%B8%B8%E8%A7%81%E5%9C%BA%E6%99%AF%E6%A1%88%E4%BE%8B%2F80.%E4%B8%9A%E5%8A%A1%E5%9C%BA%E6%99%AF%2F145.%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%8A%A8%E6%80%81%E5%B1%95%E7%A4%BA%E8%A1%A8%E6%A0%BC%E8%A1%8C%E6%A0%B7%E5%BC%8F.md&version=3.13)。
76
+
77
+ </div>
78
+
79
+
80
+
@@ -0,0 +1,137 @@
1
+ ---
2
+ outline: deep
3
+ ---
4
+
5
+ <script setup>
6
+ import { VTCodeGroup, VTCodeGroupTab } from '../../../.vitepress/components'
7
+ </script>
8
+
9
+ # 链接跳转
10
+
11
+ ## 1. 功能说明
12
+
13
+ 为了便于CodeWave开发者配置,平台对链接跳转功能做了优化。
14
+
15
+
16
+
17
+ 配置页面跳转的“链接地址”属性时,支持通过“链接设置器”设置需要跳转的页面。跳转的页面支持直接选择应用内页面,也支持将链接地址作为“页面跳转到”编辑表达式的输出结果。
18
+
19
+
20
+
21
+ ## 2. 功能实现
22
+
23
+ ### 2.1 增加链接跳转相关属性
24
+
25
+ 向 api.ts 文件中写入链接跳转相关属性。设置“链接地址”的属性无需设置setter,而使用hrefAndTo属性设置,IDE会识别该属性启用如上“链接设置器”。
26
+
27
+ ```typescript
28
+ @Prop({
29
+ group: '交互属性',
30
+ title: '链接地址'
31
+ })
32
+ hrefAndTo: nasl.core.String;
33
+ ```
34
+
35
+ ### 2.2 组件内部实现跳转
36
+
37
+ 平台在组件上会设置link和destination两个属性:
38
+
39
+ - link:外部链接,例如<https://codewave.163.com>
40
+ - destination:内部链接,例如 /dashboard
41
+
42
+ 组件内部需要对这两个属性增加对应的代码,使组件被点击时发生页面跳转。
43
+
44
+ <VTCodeGroup>
45
+ <VTCodeGroupTab label="Vue2">
46
+
47
+ ```vue
48
+ <template>
49
+ <a :href="linkURL" :target="target" @click="handleClick">链接</a>
50
+ </template>
51
+ <script>
52
+ export default {
53
+ props: {
54
+ link: String,
55
+ destination: String,
56
+ target: String,
57
+ replace: Boolean,
58
+ },
59
+ computed: {
60
+ linkURL() {
61
+ return destination || link;
62
+ },
63
+ },
64
+ methods: {
65
+ handleClick(e) {
66
+ this.$emit('click', e);
67
+
68
+ if (!this.destination || this.target === '_blank' || !this.$router) {
69
+ return;
70
+ }
71
+
72
+ // 阻止默认行为
73
+ e.preventDefault();
74
+ e.returnValue = false;
75
+
76
+ // vue router 跳转
77
+ this.routerNavigate(this.destination);
78
+ },
79
+ routerNavigate(url) {
80
+ if (this.replace) {
81
+ this.$router.replace(url);
82
+ return;
83
+ }
84
+
85
+ this.$router.push(url);
86
+ },
87
+ },
88
+ };
89
+ </script>
90
+ ```
91
+
92
+ </VTCodeGroupTab>
93
+ <VTCodeGroupTab label="React">
94
+
95
+ ```tsx
96
+ import React, { FC, HTMLAttributes } from 'react';
97
+ import { useNavigate } from 'react-router-dom';
98
+
99
+ export interface CwLinkProps extends HTMLAttributes<HTMLLinkElement> {
100
+ link: string;
101
+ destination: string;
102
+ target: string;
103
+ replace: boolean;
104
+ }
105
+
106
+ const CwLink: FC<CwLinkProps> = (props) => {
107
+ const {
108
+ link,
109
+ destination,
110
+ target,
111
+ replace,
112
+ ...rest
113
+ } = props;
114
+
115
+ const navigate = useNavigate();
116
+
117
+ const handleClick = (e: Event) => {
118
+ if (!destination || target === '_blank') {
119
+ return;
120
+ }
121
+
122
+ // 阻止默认行为
123
+ e.preventDefault();
124
+ e.returnValue = false;
125
+
126
+ // 此处走 react router 跳转
127
+ navigate(destination, { replace });
128
+ }
129
+
130
+ return (
131
+ <a {...rest} href={destination || link} onClick={handleClick}>链接</a>
132
+ );
133
+ };
134
+ ```
135
+
136
+ </VTCodeGroupTab>
137
+ </VTCodeGroup>
@@ -0,0 +1,128 @@
1
+ ---
2
+ outline: deep
3
+ ---
4
+
5
+ # 插槽处理
6
+
7
+ ## 1. 功能说明
8
+
9
+ 组件的插槽是一种用于在组件中传递内容的机制,它允许父组件向子组件传递内容,使得子组件可以更加灵活地展示不同的内容。
10
+
11
+ ## 2. 功能实现
12
+
13
+ ### 2.1 插槽配置
14
+
15
+ 在 api.ts 文件中使用@Slot来描述组件插槽。插槽属性名以slot开头的小驼峰命名,例如:默认插槽slotDefault;具名插槽例如写为slotHeader。
16
+
17
+ 以下简单描述插槽常见的处理方式:
18
+
19
+ #### 默认插槽
20
+
21
+ 没有特定的名称标识,它提供了一种简单的方式让父组件向子组件传递内容,并在子组件的特定位置进行渲染。
22
+
23
+ 以 Dropdown 下拉菜单组件为例:
24
+
25
+
26
+
27
+ ```typescript
28
+ // 在 @Component 上增加ide 配置
29
+ @ExtensionComponent({
30
+ // ...
31
+ ideusage: {
32
+ idetype: 'container',
33
+ structured: true, // 设置为 true 才会出现 ”+“ 按钮
34
+ }
35
+ })
36
+ export class ElMenuOptions extends ViewComponentOptions {
37
+ // 以Menu 为例
38
+ // ...
39
+ @Slot({
40
+ title: 'Default', // 名称
41
+ description: '内容', // 描述
42
+ snippets: [ // ide 编辑 “+” 点击后的提示, title提示描述, code 点击后默认添加代码
43
+ {
44
+ title: '添加下拉菜单分组',
45
+ code: '<el-menu-item-group></el-menu-item-group>',
46
+ },
47
+ { title: '菜单项', code: '<el-menu-item></el-menu-item>' },
48
+ ],
49
+ })
50
+ slotDefault: () => Array<nasl.ui.ViewComponent>;
51
+ }
52
+ ```
53
+
54
+ #### 具名插槽
55
+
56
+ 允许父组件在使用子组件时,可以将不同的内容插入到子组件的特定插槽位置,并且通过名称来区分不同的插槽。
57
+
58
+ ```typescript
59
+ export class XxxOptions extends ViewComponentOptions {
60
+ // ...
61
+ @Slot({
62
+ title: '头部内容',
63
+ description: '头部内容',
64
+ })
65
+ slotHeader: () => Array<nasl.ui.ViewComponent>;
66
+ }
67
+ ```
68
+
69
+ #### 作用域插槽
70
+
71
+ 允许子组件向父组件传递数据,以便父组件可以根据这些数据来渲染插槽内容。
72
+
73
+ ```typescript
74
+ export class XxxOptions extends ViewComponentOptions {
75
+ // ...
76
+ @Slot({
77
+ title: '循环项的插槽',
78
+ description: '自定义选项的结构和样式',
79
+ })
80
+ slotItem: (current: Current<T>) => Array<nasl.ui.ViewComponent>;
81
+ }
82
+
83
+ // current 参数类型
84
+ declare namespace nasl.ui {
85
+ export class Current<T> {
86
+ item: T;
87
+ index: nasl.core.Integer;
88
+ rowIndex: nasl.core.Integer;
89
+ columnIndex: nasl.core.Integer;
90
+ value: nasl.core.String;
91
+ }
92
+ }
93
+ ```
94
+
95
+ - Current 为平台默认插槽参数类型,也支持自定义类型。
96
+
97
+ ```typescript
98
+ slotItem: (current: {
99
+ row: T,
100
+ disabled: nasl.core.Boolean,
101
+ // ....
102
+ })
103
+ ```
104
+
105
+ ### 2.2 页面编辑器适配
106
+
107
+ 在 api.ts 文件中配置 ideusage 将组件接入设计器。
108
+
109
+ ```typescript
110
+ // 在 @Component 上增加ide 配置
111
+ @ExtensionComponent({
112
+ // ...
113
+ ideusage: {
114
+ idetype: 'container',
115
+ }
116
+ })
117
+ ```
118
+
119
+ - idetype为 container的组件可以插入子节点。
120
+
121
+ <div class="highlight">
122
+
123
+ 更多配置项可查看文档[页面编辑器适配说明-container配置](../ide/container.md)。
124
+
125
+ </div>
126
+
127
+
128
+