@kne/form-creator 0.1.2

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/README.md ADDED
@@ -0,0 +1,720 @@
1
+ # form-creator
2
+
3
+ ### 描述
4
+
5
+ 配置式表单搭建组件,产出 Schema 并用 @kne/form-info 渲染
6
+
7
+ ### 安装
8
+
9
+ ```shell
10
+ npm i --save @kne/form-creator
11
+ ```
12
+
13
+ ### 概述
14
+
15
+ 配置式表单搭建组件:通过字段列表 UI 产出 Schema,并用 `@kne/form-info` 实时预览与运行时渲染。
16
+
17
+
18
+ ### 示例
19
+
20
+ #### 示例样式
21
+
22
+ ```scss
23
+ @use '~@kne/responsive-utils/scss' as resp;
24
+
25
+ @include resp.mobile-container {
26
+ .example-driver-runner {
27
+ padding: 12px 16px 24px;
28
+ box-sizing: border-box;
29
+ }
30
+ }
31
+ ```
32
+
33
+ #### 示例代码
34
+
35
+ - 配置式表单搭建(全屏)
36
+ - 通过字段列表添加/编辑/排序字段,右侧实时预览 form-info 渲染结果,并导出 Schema JSON
37
+ - _FormCreator(@kne/current-lib_form-creator)[import * as _FormCreator from "@kne/form-creator"],_JsonView(@kne/json-view)[import * as _JsonView from "@kne/json-view"],(@kne/json-view/dist/index.css)[import "@kne/json-view/dist/index.css"],antd(antd)[import antd from "antd"],_FormInfo(@kne/form-info)[import * as _FormInfo from "@kne/form-info"]
38
+
39
+ ```jsx
40
+ const {default: FormCreator, defaultSchema, createBlock, createField, createStep} = _FormCreator;
41
+ const {default: JsonView} = _JsonView;
42
+ const {useState} = React;
43
+ const {Typography} = antd;
44
+
45
+ const {Text} = Typography;
46
+
47
+ const BaseExample = () => {
48
+ const [schema, setSchema] = useState(() => ({
49
+ ...defaultSchema(),
50
+ actions: {
51
+ showSubmit: true,
52
+ showReset: true,
53
+ showCancel: false,
54
+ submitText: '',
55
+ resetText: '',
56
+ cancelText: '',
57
+ align: 'center',
58
+ gap: 16
59
+ },
60
+ blocks: [
61
+ createBlock('formInfo', {
62
+ title: '基本信息',
63
+ subtitle: '请先填写基础资料',
64
+ column: 2,
65
+ list: [
66
+ createField({
67
+ type: 'Input',
68
+ name: 'name',
69
+ label: '姓名',
70
+ rule: 'REQ',
71
+ tips: '与证件姓名一致',
72
+ props: {placeholder: '请输入姓名'}
73
+ }),
74
+ createField({
75
+ type: 'Input',
76
+ name: 'mobile',
77
+ label: '手机号',
78
+ rule: 'REQ TEL',
79
+ props: {placeholder: '请输入手机号'}
80
+ }),
81
+ createField({
82
+ type: 'Select',
83
+ name: 'gender',
84
+ label: '性别',
85
+ rule: 'REQ',
86
+ props: {
87
+ placeholder: '请选择',
88
+ options: [
89
+ {label: '男', value: 'male'},
90
+ {label: '女', value: 'female'}
91
+ ]
92
+ }
93
+ }),
94
+ createField({
95
+ type: 'DatePicker',
96
+ name: 'birthday',
97
+ label: '出生日期',
98
+ props: {placeholder: '请选择日期'}
99
+ }),
100
+ createField({
101
+ type: 'TextArea',
102
+ name: 'remark',
103
+ label: '备注',
104
+ block: true,
105
+ description: '选填',
106
+ props: {rows: 3, placeholder: '补充说明'}
107
+ })
108
+ ]
109
+ }),
110
+ createBlock('list', {
111
+ title: '工作经历',
112
+ name: 'workExperiences',
113
+ addText: '添加工作经历',
114
+ minLength: 1,
115
+ list: [
116
+ createField({
117
+ type: 'Input',
118
+ name: 'company',
119
+ label: '公司',
120
+ rule: 'REQ',
121
+ props: {placeholder: '请输入公司名称'}
122
+ }),
123
+ createField({
124
+ type: 'Input',
125
+ name: 'title',
126
+ label: '职位',
127
+ rule: 'REQ',
128
+ props: {placeholder: '请输入职位'}
129
+ }),
130
+ createField({
131
+ type: 'DatePicker',
132
+ name: 'startDate',
133
+ label: '入职时间',
134
+ props: {placeholder: '请选择日期'}
135
+ })
136
+ ]
137
+ }),
138
+ createBlock('tableList', {
139
+ title: '教育经历',
140
+ name: 'educations',
141
+ addText: '添加教育经历',
142
+ list: [
143
+ createField({
144
+ type: 'Input',
145
+ name: 'school',
146
+ label: '学校',
147
+ rule: 'REQ',
148
+ props: {placeholder: '请输入学校'}
149
+ }),
150
+ createField({
151
+ type: 'Input',
152
+ name: 'major',
153
+ label: '专业',
154
+ props: {placeholder: '请输入专业'}
155
+ }),
156
+ createField({
157
+ type: 'Select',
158
+ name: 'degree',
159
+ label: '学历',
160
+ props: {
161
+ placeholder: '请选择',
162
+ options: [
163
+ {label: '本科', value: 'bachelor'},
164
+ {label: '硕士', value: 'master'},
165
+ {label: '博士', value: 'doctor'}
166
+ ]
167
+ }
168
+ })
169
+ ]
170
+ }),
171
+ createBlock('multiField', {
172
+ title: '备用联系方式',
173
+ name: 'backupContacts',
174
+ label: '联系方式',
175
+ fieldType: 'Input',
176
+ maxLength: 3,
177
+ minLength: 1
178
+ }),
179
+ createBlock('steps', {
180
+ title: '入职补充信息',
181
+ autoStep: true,
182
+ items: [
183
+ createStep({
184
+ title: '账号信息',
185
+ column: 2,
186
+ list: [
187
+ createField({
188
+ type: 'Input',
189
+ name: 'email',
190
+ label: '邮箱',
191
+ rule: 'REQ EMAIL',
192
+ props: {placeholder: '请输入邮箱'}
193
+ }),
194
+ createField({
195
+ type: 'Input',
196
+ name: 'employeeNo',
197
+ label: '工号',
198
+ props: {placeholder: '选填'}
199
+ })
200
+ ]
201
+ }),
202
+ createStep({
203
+ title: '紧急联系人',
204
+ column: 2,
205
+ list: [
206
+ createField({
207
+ type: 'Input',
208
+ name: 'emergencyName',
209
+ label: '联系人',
210
+ rule: 'REQ',
211
+ props: {placeholder: '请输入姓名'}
212
+ }),
213
+ createField({
214
+ type: 'Input',
215
+ name: 'emergencyMobile',
216
+ label: '联系电话',
217
+ rule: 'REQ TEL',
218
+ props: {placeholder: '请输入手机号'}
219
+ }),
220
+ createField({
221
+ type: 'Select',
222
+ name: 'emergencyRelation',
223
+ label: '关系',
224
+ props: {
225
+ placeholder: '请选择',
226
+ options: [
227
+ {label: '父母', value: 'parent'},
228
+ {label: '配偶', value: 'spouse'},
229
+ {label: '子女', value: 'child'},
230
+ {label: '其他', value: 'other'}
231
+ ]
232
+ }
233
+ })
234
+ ]
235
+ }),
236
+ createStep({
237
+ title: '其他说明',
238
+ column: 1,
239
+ list: [
240
+ createField({
241
+ type: 'TextArea',
242
+ name: 'onboardNote',
243
+ label: '补充说明',
244
+ props: {rows: 3, placeholder: '如有特殊需求请填写'}
245
+ })
246
+ ]
247
+ })
248
+ ]
249
+ })
250
+ ]
251
+ }));
252
+
253
+ return <div>
254
+ <FormCreator value={schema} onChange={setSchema} />
255
+ <div style={{marginTop: 16}}>
256
+ <JsonView data={schema} theme="light" collapsedFrom={2} searchable={false} />
257
+ <Text type="secondary">初始示例已包含 FormInfo / List / TableList / MultiField / Steps 五种模块。</Text>
258
+ </div>
259
+ </div>;
260
+ };
261
+
262
+ render(<BaseExample />);
263
+
264
+ ```
265
+
266
+ - Schema 直接渲染表单
267
+ - 传入已有 Schema,用 SchemaRenderer 直接展示可提交表单(运行时,不经过编辑器)
268
+ - _FormCreator(@kne/current-lib_form-creator)[import * as _FormCreator from "@kne/form-creator"],_JsonView(@kne/json-view)[import * as _JsonView from "@kne/json-view"],(@kne/json-view/dist/index.css)[import "@kne/json-view/dist/index.css"],antd(antd)[import antd from "antd"]
269
+
270
+ ```jsx
271
+ const { SchemaRenderer, createBlock, createField } = _FormCreator;
272
+ const { default: JsonView } = _JsonView;
273
+ const { useState } = React;
274
+ const { Alert, Space, Typography } = antd;
275
+ const { Text } = Typography;
276
+
277
+ const demoSchema = {
278
+ actions: {
279
+ showSubmit: true,
280
+ showReset: true,
281
+ submitText: '提交报名',
282
+ resetText: '清空'
283
+ },
284
+ blocks: [
285
+ createBlock('formInfo', {
286
+ title: '员工信息',
287
+ subtitle: '传入 Schema,用 SchemaRenderer 直接渲染表单',
288
+ column: 2,
289
+ list: [
290
+ createField({
291
+ type: 'Input',
292
+ name: 'name',
293
+ label: '姓名',
294
+ rule: 'REQ',
295
+ props: { placeholder: '请输入姓名' }
296
+ }),
297
+ createField({
298
+ type: 'Input',
299
+ name: 'mobile',
300
+ label: '手机号',
301
+ rule: 'REQ TEL',
302
+ props: { placeholder: '请输入手机号' }
303
+ }),
304
+ createField({
305
+ type: 'Select',
306
+ name: 'gender',
307
+ label: '性别',
308
+ rule: 'REQ',
309
+ props: {
310
+ placeholder: '请选择',
311
+ options: [
312
+ { label: '男', value: 'male' },
313
+ { label: '女', value: 'female' }
314
+ ]
315
+ }
316
+ }),
317
+ createField({
318
+ type: 'DatePicker',
319
+ name: 'joinDate',
320
+ label: '入职日期',
321
+ props: { placeholder: '请选择日期' }
322
+ }),
323
+ createField({
324
+ type: 'TextArea',
325
+ name: 'remark',
326
+ label: '备注',
327
+ block: true,
328
+ description: '选填',
329
+ props: { rows: 3, placeholder: '补充说明' }
330
+ })
331
+ ]
332
+ })
333
+ ]
334
+ };
335
+
336
+ const SchemaRenderExample = () => {
337
+ const [result, setResult] = useState(null);
338
+
339
+ return (
340
+ <Space direction="vertical" size={16} style={{ width: '100%' }}>
341
+ <Alert
342
+ type="info"
343
+ showIcon
344
+ message="运行时渲染"
345
+ description={
346
+ <span>
347
+ 业务侧 Schema 可带 <Text code>actions</Text>(FormCreator 左侧可配)。SchemaRenderer 会识别并居中渲染提交
348
+ / 重置;也可用组件 props 覆盖。
349
+ </span>
350
+ }
351
+ />
352
+ <JsonView data={demoSchema} theme="light" collapsedFrom={2} searchable={false} />
353
+ <SchemaRenderer
354
+ schema={demoSchema}
355
+ formProps={{
356
+ onSubmit: data => setResult(data)
357
+ }}
358
+ />
359
+ {result ? <JsonView data={result} theme="light" collapsedFrom={2} searchable={false} /> : null}
360
+ </Space>
361
+ );
362
+ };
363
+
364
+ render(<SchemaRenderExample />);
365
+
366
+ ```
367
+
368
+ - 扩展组件与校验规则
369
+ - 通过 registerField 扩展填写项,通过 preset + registerRulePreset 扩展运行时校验与规则勾选面板
370
+ - _FormCreator(@kne/current-lib_form-creator)[import * as _FormCreator from "@kne/form-creator"],_ReactFormAntd(@kne/react-form-antd)[import * as _ReactFormAntd from "@kne/react-form-antd"],_JsonView(@kne/json-view)[import * as _JsonView from "@kne/json-view"],(@kne/json-view/dist/index.css)[import "@kne/json-view/dist/index.css"],antd(antd)[import antd from "antd"]
371
+
372
+ ```jsx
373
+ const {
374
+ default: FormCreator,
375
+ registerField,
376
+ registerRulePreset,
377
+ defaultSchema,
378
+ createBlock,
379
+ createField
380
+ } = _FormCreator;
381
+ const { Rate, Slider, preset, RULES } = _ReactFormAntd;
382
+ const { default: JsonView } = _JsonView;
383
+ const { useState } = React;
384
+ const { Alert, Typography, Space } = antd;
385
+ const { Text, Paragraph } = Typography;
386
+
387
+ // 1) 用 react-form-antd preset 注册运行时校验规则
388
+ preset({
389
+ rules: Object.assign({}, RULES, {
390
+ // 身份证号(简化示例)
391
+ ID_CARD: {
392
+ reg: /^\d{17}[\dXx]$/,
393
+ message: '%s格式不正确'
394
+ },
395
+ // 评分至少 3 星
396
+ RATE_MIN: value => {
397
+ const score = Number(value) || 0;
398
+ return {
399
+ result: score >= 3,
400
+ errMsg: score >= 3 ? '' : '评分至少 3 星'
401
+ };
402
+ }
403
+ })
404
+ });
405
+
406
+ // 2) 同步注册到 form-creator 规则勾选面板
407
+ registerRulePreset({ value: 'ID_CARD', label: '身份证格式' });
408
+ registerRulePreset({ value: 'RATE_MIN', label: '评分至少3星' });
409
+
410
+ // 3) 扩展自定义填写项:用 propsSchema 声明可编辑的额外参数
411
+ registerField('Rate', {
412
+ label: '评分',
413
+ groupName: '评价组件',
414
+ component: Rate,
415
+ defaultProps: { count: 5, allowHalf: false, allowClear: true },
416
+ propsSchema: [
417
+ {
418
+ name: 'count',
419
+ label: '星星总数',
420
+ type: 'number',
421
+ min: 1,
422
+ max: 10,
423
+ defaultValue: 5
424
+ },
425
+ {
426
+ name: 'allowHalf',
427
+ label: '允许半星',
428
+ type: 'boolean',
429
+ defaultValue: false
430
+ },
431
+ {
432
+ name: 'allowClear',
433
+ label: '允许清除',
434
+ type: 'boolean',
435
+ defaultValue: true
436
+ }
437
+ ]
438
+ });
439
+
440
+ registerField('Slider', {
441
+ label: '滑块',
442
+ component: Slider,
443
+ defaultProps: { min: 0, max: 100, step: 1 },
444
+ propsSchema: [
445
+ { name: 'min', label: '最小值', type: 'number', defaultValue: 0 },
446
+ { name: 'max', label: '最大值', type: 'number', defaultValue: 100 },
447
+ { name: 'step', label: '步长', type: 'number', min: 0, defaultValue: 1 },
448
+ {
449
+ name: 'tooltipPlacement',
450
+ label: '提示位置',
451
+ type: 'select',
452
+ defaultValue: 'top',
453
+ options: [
454
+ { label: '上', value: 'top' },
455
+ { label: '下', value: 'bottom' },
456
+ { label: '左', value: 'left' },
457
+ { label: '右', value: 'right' }
458
+ ]
459
+ },
460
+ { name: 'dots', label: '显示刻度点', type: 'boolean', defaultValue: false }
461
+ ]
462
+ });
463
+
464
+ const PresetExtendExample = () => {
465
+ const [schema, setSchema] = useState(() => ({
466
+ ...defaultSchema(),
467
+ blocks: [
468
+ createBlock('formInfo', {
469
+ title: '扩展字段与校验',
470
+ subtitle: '演示 registerField + preset rules + registerRulePreset',
471
+ column: 2,
472
+ list: [
473
+ createField({
474
+ type: 'Input',
475
+ name: 'idCard',
476
+ label: '身份证号',
477
+ rule: 'REQ ID_CARD',
478
+ tips: '已通过 preset 注册 ID_CARD 规则',
479
+ props: { placeholder: '请输入18位身份证号' }
480
+ }),
481
+ createField({
482
+ type: 'Rate',
483
+ name: 'score',
484
+ label: '满意度',
485
+ rule: 'REQ RATE_MIN',
486
+ description: '自定义 Rate 字段,规则要求至少 3 星',
487
+ props: { count: 5, allowHalf: false, allowClear: true }
488
+ }),
489
+ createField({
490
+ type: 'Slider',
491
+ name: 'progress',
492
+ label: '完成度',
493
+ block: true,
494
+ props: { min: 0, max: 100, step: 5, dots: true }
495
+ })
496
+ ]
497
+ })
498
+ ]
499
+ }));
500
+
501
+ return (
502
+ <Space direction="vertical" size={16} style={{ width: '100%' }}>
503
+ <Alert
504
+ type="info"
505
+ showIcon
506
+ message="扩展方式"
507
+ description={
508
+ <div>
509
+ <Paragraph style={{ marginBottom: 4 }}>
510
+ 1. <Text code>{'preset({ rules })'}</Text>:注册运行时校验(@kne/react-form-antd)
511
+ </Paragraph>
512
+ <Paragraph style={{ marginBottom: 4 }}>
513
+ 2. <Text code>registerRulePreset</Text>:把规则挂到「填写规则」勾选面板
514
+ </Paragraph>
515
+ <Paragraph style={{ marginBottom: 0 }}>
516
+ 3. <Text code>registerField</Text>:扩展填写项;可用 <Text code>groupName</Text> 自定义分组,并用 <Text code>propsSchema</Text> 声明额外参数
517
+ </Paragraph>
518
+ </div>
519
+ }
520
+ />
521
+ <FormCreator value={schema} onChange={setSchema} />
522
+ <JsonView data={schema} theme="light" collapsedFrom={2} searchable={false} />
523
+ </Space>
524
+ );
525
+ };
526
+
527
+ render(<PresetExtendExample />);
528
+
529
+ ```
530
+
531
+ ### API
532
+
533
+ | 属性 | 类型 | 默认值 | 说明 |
534
+ |----|----|-----|----|
535
+ | value | object | - | 受控 Schema |
536
+ | defaultValue | object | - | 非受控初始 Schema |
537
+ | onChange | function(schema) | - | Schema 变更回调 |
538
+ | showPreview | boolean | true | 是否显示右侧预览 |
539
+ | className | string | - | 根节点类名 |
540
+ | formProps | object | {} | 透传给预览区 Form / FormSteps 的属性 |
541
+ | renderModal | function(props) | - | 自定义编辑弹窗渲染,透传给内部 FormModal(同 super-select / form-info) |
542
+
543
+ #### SchemaRenderer
544
+
545
+ 传入 Schema 直接渲染可填写表单(运行时,不经过编辑器)。示例见「Schema 直接渲染表单」。
546
+
547
+ | 属性 | 类型 | 默认值 | 说明 |
548
+ |----|----|-----|----|
549
+ | schema | object | - | 表单 Schema |
550
+ | formProps | object | {} | 透传给内部 `Form`(如 `onSubmit`、`data`) |
551
+ | preview | boolean | false | 预览态(字段预览行为) |
552
+ | className | string | - | 根 Form 类名 |
553
+ | children | ReactNode | - | 追加到表单内容与操作区之间 |
554
+ | showActions | boolean | true | 是否展示提交/重置操作区(默认开启,可不传) |
555
+ | actions | ReactNode \| false | - | 自定义操作区;不传则按 Schema `actions` / 默认居中「提交/重置」;`false` 隐藏 |
556
+ | showSubmit | boolean | - | 覆盖 Schema;不传则读 `schema.actions.showSubmit`(默认 true) |
557
+ | showReset | boolean | - | 覆盖 Schema;不传则读 `schema.actions.showReset`(默认 true) |
558
+ | submitText | string | - | 覆盖 Schema;不传则读 `schema.actions.submitText` 或「提交」 |
559
+ | resetText | string | - | 覆盖 Schema;不传则读 `schema.actions.resetText` 或「重置」 |
560
+ | submitButtonProps | object | - | 与 Schema 合并后透传给 `SubmitButton` |
561
+ | resetButtonProps | object | - | 与 Schema 合并后透传给 `ResetButton` |
562
+
563
+ ```js
564
+ import { SchemaRenderer } from '@kne/form-creator';
565
+
566
+ // 默认居中提交 / 重置
567
+ <SchemaRenderer schema={schema} formProps={{ onSubmit: console.log }} />
568
+
569
+ // 定制文案与按钮属性
570
+ <SchemaRenderer
571
+ schema={schema}
572
+ submitText="保存"
573
+ resetText="清空"
574
+ submitButtonProps={{ size: 'large' }}
575
+ formProps={{ onSubmit: console.log }}
576
+ />
577
+
578
+ // 完全自定义操作区
579
+ <SchemaRenderer schema={schema} actions={<MyButtons />} />
580
+
581
+ // 不显示操作按钮
582
+ <SchemaRenderer schema={schema} showActions={false} />
583
+ // 或
584
+ <SchemaRenderer schema={schema} actions={false} />
585
+ ```
586
+
587
+ #### SchemaRendererInner
588
+
589
+ 只渲染 Schema 区块内容,**不包外层 Form**,便于放入业务已有 `Form` 内。操作区相关 props 与 `SchemaRenderer` 相同。
590
+
591
+ | 属性 | 类型 | 默认值 | 说明 |
592
+ |----|----|-----|----|
593
+ | schema | object | - | 表单 Schema |
594
+ | preview | boolean | false | 预览态 |
595
+ | className | string | - | 包在表单区块外层的 className(可选) |
596
+ | children | ReactNode | - | 追加内容 |
597
+ | showActions | boolean | true | 是否展示提交/重置操作区(默认开启,可不传) |
598
+ | actions / showSubmit / showReset / submitText / resetText / \*ButtonProps | - | - | 同 SchemaRenderer |
599
+
600
+ ```js
601
+ import { SchemaRendererInner } from '@kne/form-creator';
602
+ import { Form, SubmitButton } from '@kne/form-info';
603
+
604
+ <Form onSubmit={console.log}>
605
+ <SchemaRendererInner schema={schema} />
606
+ </Form>
607
+
608
+ // 不展示按钮区,自行放按钮
609
+ <Form onSubmit={console.log}>
610
+ <SchemaRendererInner schema={schema} showActions={false} />
611
+ <SubmitButton>提交</SubmitButton>
612
+ </Form>
613
+ ```
614
+
615
+ #### Schema 结构
616
+
617
+ ```js
618
+ {
619
+ actions?: {
620
+ showSubmit?: boolean, // 默认 true
621
+ showReset?: boolean, // 默认 true
622
+ showCancel?: boolean, // 默认 false(可选取消按钮)
623
+ submitText?: string, // 空则用「提交」
624
+ resetText?: string, // 空则用「重置」
625
+ cancelText?: string, // 空则用「取消」
626
+ align?: 'center' | 'start' | 'end', // 默认 center
627
+ gap?: number, // 按钮间距,默认 16
628
+ submitButtonProps?: object,
629
+ resetButtonProps?: object,
630
+ cancelButtonProps?: object
631
+ },
632
+ blocks: [{
633
+ id: string,
634
+ kind: 'formInfo' | 'list' | 'tableList' | 'multiField' | 'steps',
635
+ title?, subtitle?, column?, gap?, bordered?, important?,
636
+ name?, label?, addText?, maxLength?, minLength?, fieldType?, autoStep?,
637
+ list?: [{ id, type, name, label, tips?, description?, rule?, block?, hidden?, props? }],
638
+ items?: [{ id, title, column, list: [...] }] // steps 专用
639
+ }]
640
+ }
641
+ ```
642
+
643
+ `actions` 由 FormCreator 顶部「添加模块」旁的设置按钮弹窗配置,写入 Schema;`SchemaRenderer` 会读取并渲染居中操作按钮(组件 props 可覆盖 Schema)。
644
+ #### 区块类型
645
+
646
+ | kind | 说明 | 主要参数 |
647
+ |------|------|----------|
648
+ | formInfo | 表单信息区块 | title, subtitle, column, gap, bordered, list |
649
+ | list | 动态列表 | name, title, important, bordered, maxLength, list |
650
+ | tableList | 表格列表 | name, title, bordered, maxLength, list |
651
+ | multiField | 同类型多值 | name, label, fieldType, addText |
652
+ | steps | 步骤表单 | title, subtitle, bordered, autoStep, items[{ title, column, list }] |
653
+
654
+ 兼容旧版:若仅有顶层 `list` 且无 `blocks`,会自动迁移为一个 `formInfo` 区块。
655
+
656
+ #### 字段类型
657
+
658
+ 基础:Input、TextArea、InputNumber、Switch、Checkbox、DatePicker
659
+ 选择:Select、RadioGroup、CheckboxGroup、SuperSelect、SuperSelectPlus
660
+
661
+ #### 工具方法
662
+
663
+ - `createBlock(kind)` / `createStep()` / `normalizeSchema(schema)`
664
+ - `registerField(type, definition)` 扩展字段类型;可用 `groupName` 指定类型下拉分组,不传则归入「扩展字段」;用 `propsSchema` 声明额外参数(`string` / `number` / `boolean` / `select`)
665
+ - `registerRulePreset({ value, label })` 扩展「填写规则」勾选面板中的规则项
666
+ - `parseRuleString(rule)` / `buildRuleString(config)` 校验规则字符串解析/组装
667
+
668
+ #### 扩展组件与校验(示例见「扩展组件与校验规则」)
669
+
670
+ 运行时校验由 `@kne/react-form-antd` 的 `preset({ rules })` 注册;勾选面板需同步调用 `registerRulePreset`,否则 Schema 里写了规则名但编辑器勾选不到。
671
+
672
+ 扩展填写项时,用 `propsSchema` 声明可编辑的额外参数(写入字段 `props`),编辑器会按声明自动生成「填写项设置」表单:
673
+
674
+ ```js
675
+ registerField('Rate', {
676
+ label: '评分',
677
+ groupName: '评价组件', // 自定义分组;不传则归入「扩展字段」
678
+ component: Rate,
679
+ defaultProps: { count: 5 },
680
+ propsSchema: [
681
+ { name: 'count', label: '星星总数', type: 'number', min: 1, max: 10, defaultValue: 5 }
682
+ ]
683
+ });
684
+
685
+ registerField('Slider', {
686
+ label: '滑块',
687
+ component: Slider,
688
+ defaultProps: { min: 0, max: 100, step: 1 },
689
+ propsSchema: [
690
+ { name: 'min', label: '最小值', type: 'number', defaultValue: 0 },
691
+ { name: 'max', label: '最大值', type: 'number', defaultValue: 100 },
692
+ { name: 'step', label: '步长', type: 'number', min: 0, defaultValue: 1 },
693
+ {
694
+ name: 'tooltipPlacement',
695
+ label: '提示位置',
696
+ type: 'select',
697
+ defaultValue: 'top',
698
+ options: [
699
+ { label: '上', value: 'top' },
700
+ { label: '下', value: 'bottom' }
701
+ ]
702
+ },
703
+ { name: 'dots', label: '显示刻度点', type: 'boolean' }
704
+ ]
705
+ });
706
+ ```
707
+
708
+ `propsSchema` 项约定:
709
+
710
+ | 字段 | 说明 |
711
+ |------|------|
712
+ | name | 写入 `field.props` 的键名 |
713
+ | label | 编辑器展示名 |
714
+ | type | `string` \| `number` \| `boolean` \| `select` |
715
+ | placeholder | 输入提示(string/number/select) |
716
+ | defaultValue | 缺省值 |
717
+ | min / max | `type=number` 时的范围 |
718
+ | options | `type=select` 的选项 `{ label, value }[]` |
719
+
720
+ 有 `propsSchema` 时会自动开启 `hasFieldProps`,无需再手写开关。