@dckj-npm/dc-material 0.1.379 → 0.1.381
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/build/docs/colorful-button.html +3 -3
- package/build/docs/colorful-input.html +3 -3
- package/build/docs/custom-form/requirements.html +3 -3
- package/build/docs/custom-form.html +3 -3
- package/build/docs/index.html +3 -3
- package/build/docs/teletext-list.html +3 -3
- package/build/docs/{umi.80bcbda5.js → umi.b55ee37b.js} +1 -1
- package/build/docs/~demos/colorful-button-demo.html +3 -3
- package/build/docs/~demos/colorful-input-demo.html +3 -3
- package/build/docs/~demos/teletext-list-demo-1.html +3 -3
- package/build/docs/~demos/teletext-list-demo.html +3 -3
- package/build/lowcode/assets-daily.json +13 -13
- package/build/lowcode/assets-dev.json +2 -2
- package/build/lowcode/assets-prod.json +13 -13
- package/build/lowcode/meta.design.js +1 -1
- package/build/lowcode/meta.js +1 -1
- package/build/lowcode/render/default/view.js +1 -1
- package/build/lowcode/view.js +1 -1
- package/dist/BizComps.js +2 -2
- package/dist/BizComps.js.map +1 -1
- package/es/components/custom-form/custom-form.d.ts +13 -0
- package/es/components/custom-form/custom-form.js +158 -44
- package/es/components/custom-form/schema.json +1373 -1373
- package/lib/components/custom-form/custom-form.d.ts +13 -0
- package/lib/components/custom-form/custom-form.js +157 -43
- package/lib/components/custom-form/schema.json +1373 -1373
- package/lowcode/custom-form/meta.ts +55 -26
- package/lowcode_es/custom-form/meta.js +279 -241
- package/lowcode_es/meta.js +1 -1
- package/lowcode_lib/custom-form/meta.js +279 -241
- package/lowcode_lib/meta.js +1 -1
- package/package.json +3 -3
- package/es/components/custom-form/CUSTOM_FORM_OPERATION_MANUAL.md +0 -284
- package/lib/components/custom-form/CUSTOM_FORM_OPERATION_MANUAL.md +0 -284
|
@@ -42,6 +42,19 @@ export interface CustomFormItemSchema {
|
|
|
42
42
|
}>;
|
|
43
43
|
/** 动态选项(绑定变量/数据源后优先使用),仅 Select/RadioGroup/CheckboxGroup 生效 */
|
|
44
44
|
optionsBind?: any[];
|
|
45
|
+
/**
|
|
46
|
+
* optionsBind 数据源中用作选项显示文字的字段名(当数据源字段名不是 'label' 时填写)。
|
|
47
|
+
* 例如数据源字段为 package_name,则填 "package_name"。
|
|
48
|
+
* 不填则默认使用 'label' 字段。
|
|
49
|
+
*/
|
|
50
|
+
optionsLabelKey?: string;
|
|
51
|
+
/**
|
|
52
|
+
* optionsBind 数据源中用作选项存储值的字段名(当数据源字段名不是 'value' 时填写)。
|
|
53
|
+
* 例如数据源字段为 id,则填 "id";字段为 package_name,则填 "package_name"。
|
|
54
|
+
* 不填则默认使用 'value' 字段。
|
|
55
|
+
* 配置后,字段联动的 matchKey 会自动默认使用此字段名,无需在联动规则中重复配置。
|
|
56
|
+
*/
|
|
57
|
+
optionsValueKey?: string;
|
|
45
58
|
/** 该表单项占几列(不超过父级 columns),默认 1 */
|
|
46
59
|
columnSpan?: number;
|
|
47
60
|
/** 组件尺寸:small / medium / large,默认继承表单全局 size */
|
|
@@ -209,22 +209,36 @@ var renderFormItemComponent = function renderFormItemComponent(item) {
|
|
|
209
209
|
var _item$optionsBind;
|
|
210
210
|
var componentProps = item.componentProps || {};
|
|
211
211
|
// optionsBind(动态绑定)优先级 > componentProps.dataSource > options(静态)
|
|
212
|
-
var
|
|
212
|
+
var rawDataSource = (_item$optionsBind = item.optionsBind) !== null && _item$optionsBind !== void 0 && _item$optionsBind.length ? item.optionsBind : componentProps.dataSource || item.options || [];
|
|
213
|
+
|
|
214
|
+
// 若配置了 optionsLabelKey / optionsValueKey,将原始数据字段映射到 label / value 字段
|
|
215
|
+
// 这使得 API 返回的任意格式(如 {package_name, id, package_price})均可直接用作选项数据源
|
|
216
|
+
var labelKey = item.optionsLabelKey;
|
|
217
|
+
var valueKey = item.optionsValueKey;
|
|
218
|
+
var dataSource = (labelKey || valueKey) && Array.isArray(rawDataSource) ? rawDataSource.map(function (opt) {
|
|
219
|
+
var _opt$labelKey, _opt$valueKey;
|
|
220
|
+
return (0, _extends4["default"])({}, opt, labelKey ? {
|
|
221
|
+
label: (_opt$labelKey = opt[labelKey]) !== null && _opt$labelKey !== void 0 ? _opt$labelKey : opt.label
|
|
222
|
+
} : {}, valueKey ? {
|
|
223
|
+
value: (_opt$valueKey = opt[valueKey]) !== null && _opt$valueKey !== void 0 ? _opt$valueKey : opt.value
|
|
224
|
+
} : {});
|
|
225
|
+
}) : rawDataSource;
|
|
213
226
|
switch (item.componentType) {
|
|
214
227
|
case 'TextArea':
|
|
215
228
|
return /*#__PURE__*/_react["default"].createElement(TextAreaAny, componentProps);
|
|
216
229
|
case 'Select':
|
|
217
|
-
|
|
230
|
+
// dataSource 放在末尾以确保 optionsBind 优先级高于 componentProps.dataSource
|
|
231
|
+
return /*#__PURE__*/_react["default"].createElement(SelectAny, (0, _extends4["default"])({}, componentProps, {
|
|
218
232
|
dataSource: dataSource
|
|
219
|
-
}
|
|
233
|
+
}));
|
|
220
234
|
case 'RadioGroup':
|
|
221
|
-
return /*#__PURE__*/_react["default"].createElement(RadioGroupAny, (0, _extends4["default"])({
|
|
235
|
+
return /*#__PURE__*/_react["default"].createElement(RadioGroupAny, (0, _extends4["default"])({}, componentProps, {
|
|
222
236
|
dataSource: dataSource
|
|
223
|
-
}
|
|
237
|
+
}));
|
|
224
238
|
case 'CheckboxGroup':
|
|
225
|
-
return /*#__PURE__*/_react["default"].createElement(CheckboxGroupAny, (0, _extends4["default"])({
|
|
239
|
+
return /*#__PURE__*/_react["default"].createElement(CheckboxGroupAny, (0, _extends4["default"])({}, componentProps, {
|
|
226
240
|
dataSource: dataSource
|
|
227
|
-
}
|
|
241
|
+
}));
|
|
228
242
|
case 'NumberPicker':
|
|
229
243
|
return /*#__PURE__*/_react["default"].createElement(NumberPickerAny, componentProps);
|
|
230
244
|
case 'DatePicker':
|
|
@@ -321,6 +335,12 @@ var CustomForm = function CustomForm(_ref) {
|
|
|
321
335
|
// 初始化时直接合并 resolvedInitialValues,避免 useEffect 延迟问题
|
|
322
336
|
var valuesRef = (0, _react.useRef)(resolvedInitialValues ? (0, _extends4["default"])({}, resolvedInitialValues) : {});
|
|
323
337
|
|
|
338
|
+
// ─── 缓存最新的 formItems,避免 handleFieldChange 闭包访问过期值 ─────────
|
|
339
|
+
var formItemsRef = (0, _react.useRef)(formItems);
|
|
340
|
+
(0, _react.useEffect)(function () {
|
|
341
|
+
formItemsRef.current = formItems;
|
|
342
|
+
}, [formItems]);
|
|
343
|
+
|
|
324
344
|
// ─── 联动回填触发器:用 state 驱动组件重渲染以更新受控字段 ───────────────
|
|
325
345
|
// 注意:不预填 resolvedInitialValues,初始值通过 defaultValue(非受控)处理
|
|
326
346
|
// 预填会导致所有有初始值的字段变为受控组件,用户改值后因 linkageValues 未更新而回显旧值
|
|
@@ -328,6 +348,19 @@ var CustomForm = function CustomForm(_ref) {
|
|
|
328
348
|
linkageValues = _useState[0],
|
|
329
349
|
setLinkageValues = _useState[1];
|
|
330
350
|
|
|
351
|
+
// ─── Bug Fix: initialValues 变化时同步 valuesRef(编辑模式异步加载场景)──────
|
|
352
|
+
// 用 JSON.stringify 做深比较,避免父组件每次重渲染都因内联对象引用变化触发重置
|
|
353
|
+
var lastInitSerialRef = (0, _react.useRef)('');
|
|
354
|
+
(0, _react.useEffect)(function () {
|
|
355
|
+
var serial = JSON.stringify(resolvedInitialValues);
|
|
356
|
+
if (serial !== lastInitSerialRef.current) {
|
|
357
|
+
lastInitSerialRef.current = serial;
|
|
358
|
+
valuesRef.current = resolvedInitialValues ? (0, _extends4["default"])({}, resolvedInitialValues) : {};
|
|
359
|
+
setLinkageValues({});
|
|
360
|
+
cfLog('initialValues', 'initialValues 已变更,重新初始化 valuesRef', resolvedInitialValues);
|
|
361
|
+
}
|
|
362
|
+
}, [resolvedInitialValues]);
|
|
363
|
+
|
|
331
364
|
// ─── 统一 onChange 处理器(阶段一 + 阶段二核心)─────────────────────────────
|
|
332
365
|
var handleFieldChange = (0, _react.useCallback)(function (field, value) {
|
|
333
366
|
var _extends2;
|
|
@@ -338,9 +371,29 @@ var CustomForm = function CustomForm(_ref) {
|
|
|
338
371
|
allValues: valuesRef.current
|
|
339
372
|
});
|
|
340
373
|
|
|
341
|
-
// 2.
|
|
342
|
-
var linkagePatched = null;
|
|
374
|
+
// 2. 字段联动(阶段二)
|
|
343
375
|
if (fieldLinkage && fieldLinkage.length > 0) {
|
|
376
|
+
// ── 第一步:收集当前 watchField 所有规则"可能影响"到的字段(预清除范围)──────
|
|
377
|
+
// 目的:当用户把 watchField 改为不匹配任何规则的值时,
|
|
378
|
+
// 把上一次联动写入的字段清回初始值,而不是永久保留旧的联动值。
|
|
379
|
+
var clearableFields = new Set();
|
|
380
|
+
fieldLinkage.forEach(function (rule) {
|
|
381
|
+
if (rule.watchField !== field) return;
|
|
382
|
+
if (rule.fillField) clearableFields.add(rule.fillField);
|
|
383
|
+
if (rule.fillFields) Object.keys(rule.fillFields).forEach(function (f) {
|
|
384
|
+
return clearableFields.add(f);
|
|
385
|
+
});
|
|
386
|
+
if (rule.staticRules) {
|
|
387
|
+
Object.values(rule.staticRules).forEach(function (ruleMap) {
|
|
388
|
+
return Object.keys(ruleMap).forEach(function (f) {
|
|
389
|
+
return clearableFields.add(f);
|
|
390
|
+
});
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
// ── 第二步:按规则计算本次实际要写入的值 ────────────────────────────────────
|
|
396
|
+
var fills = {};
|
|
344
397
|
fieldLinkage.forEach(function (rule) {
|
|
345
398
|
if (rule.watchField !== field) return;
|
|
346
399
|
|
|
@@ -348,28 +401,54 @@ var CustomForm = function CustomForm(_ref) {
|
|
|
348
401
|
if (rule.staticRules) {
|
|
349
402
|
var staticFill = rule.staticRules[String(value)];
|
|
350
403
|
if (staticFill) {
|
|
351
|
-
|
|
352
|
-
Object.assign(valuesRef.current, staticFill);
|
|
404
|
+
Object.assign(fills, staticFill);
|
|
353
405
|
cfLog('linkage', "\u9759\u6001\u8054\u52A8 \"" + field + "\" = " + value + "\uFF0C\u56DE\u586B", staticFill);
|
|
354
406
|
}
|
|
355
407
|
}
|
|
356
408
|
|
|
357
409
|
// 2b. 数据源动态联动(高级格式)
|
|
358
410
|
if (rule.dataSource && rule.fillFields) {
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
411
|
+
// ─── 防御:dataSource 必须是数组 ───────────────────────────────────────
|
|
412
|
+
// 若属性面板 dataSource 字段未通过「变量绑定」控件正确绑定,
|
|
413
|
+
// 而是直接输入了文本(如 "this.state.xxx"),则 rule.dataSource 为字符串而非数组。
|
|
414
|
+
// 在非数组上调用 .find() 会抛 TypeError,该错误会在 Fusion Field 的 onChange 包装
|
|
415
|
+
// 器中向上传播,阻断 _reRender(即 instance.forceUpdate())的调用,导致:
|
|
416
|
+
// 1. Form 不重新渲染 → 下拉选中值消失(Select 回显空白)
|
|
417
|
+
// 2. setLinkageValues 未执行 → 联动回填字段不更新
|
|
418
|
+
// 因此必须先做类型守卫,跳过非数组情况并给出明确提示。
|
|
419
|
+
if (!Array.isArray(rule.dataSource)) {
|
|
420
|
+
cfWarn('linkage', "\u52A8\u6001\u8054\u52A8\uFF08watchField=\"" + rule.watchField + "\"\uFF09\u7684 dataSource \u4E0D\u662F\u6570\u7EC4" + ("\uFF08\u5B9E\u9645\u7C7B\u578B\uFF1A" + typeof rule.dataSource + "\uFF0C\u503C\uFF1A" + JSON.stringify(rule.dataSource) + "\uFF09\u3002") + "\u8BF7\u5728\u5C5E\u6027\u9762\u677F\u4E2D\u901A\u8FC7\u300C\u53D8\u91CF\u7ED1\u5B9A\u300D\u63A7\u4EF6\u9009\u62E9\u6570\u636E\u6E90\u53D8\u91CF\uFF0C\u4E0D\u8981\u76F4\u63A5\u8F93\u5165\u6587\u5B57\u8DEF\u5F84\u3002");
|
|
421
|
+
} else {
|
|
422
|
+
var _formItemsRef$current;
|
|
423
|
+
var matchKey = rule.matchKey || ((_formItemsRef$current = formItemsRef.current.find(function (i) {
|
|
424
|
+
return i.field === rule.watchField;
|
|
425
|
+
})) === null || _formItemsRef$current === void 0 ? void 0 : _formItemsRef$current.optionsValueKey) || 'value';
|
|
426
|
+
// 同时支持严格相等和字符串化比较,兼容 id 字段类型不一致(数字 vs 字符串)的场景
|
|
427
|
+
var matched = rule.dataSource.find(function (item) {
|
|
428
|
+
return item[matchKey] === value || item[matchKey] !== undefined && value !== undefined && String(item[matchKey]) === String(value);
|
|
369
429
|
});
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
430
|
+
if (matched) {
|
|
431
|
+
var fill = {};
|
|
432
|
+
Object.entries(rule.fillFields).forEach(function (_ref2) {
|
|
433
|
+
var formField = _ref2[0],
|
|
434
|
+
dsKey = _ref2[1];
|
|
435
|
+
// 防止把 watchField 误填进 fillFields,否则会用 undefined 覆盖用户的选择值
|
|
436
|
+
if (formField === field) {
|
|
437
|
+
cfWarn('linkage', "fillFields \u4E2D\u7684 key \"" + formField + "\" \u4E0E\u76D1\u542C\u5B57\u6BB5 watchField \u76F8\u540C\uFF0C\u5DF2\u8DF3\u8FC7\u3002" + "fillFields \u683C\u5F0F\u4E3A {\"\u76EE\u6807\u8868\u5355\u5B57\u6BB5\":\"\u6570\u636E\u6E90\u5B57\u6BB5\u540D\"}\uFF0C\u8BF7\u68C0\u67E5 key/value \u662F\u5426\u5199\u53CD\u3002");
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
// 数据源字段名不存在时提示可用字段,避免静默填入 undefined
|
|
441
|
+
if (!(dsKey in matched)) {
|
|
442
|
+
cfWarn('linkage', "fillFields \u4E2D\u6570\u636E\u6E90\u5B57\u6BB5\u540D \"" + dsKey + "\" \u5728\u5339\u914D\u9879\u4E2D\u4E0D\u5B58\u5728\uFF0C\u5DF2\u8DF3\u8FC7\u3002" + ("\u5339\u914D\u9879\u53EF\u7528\u5B57\u6BB5\uFF1A" + Object.keys(matched).join(', ')));
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
fill[formField] = matched[dsKey];
|
|
446
|
+
});
|
|
447
|
+
Object.assign(fills, fill);
|
|
448
|
+
cfLog('linkage', "\u52A8\u6001\u8054\u52A8 \"" + field + "\" = " + value + "\uFF0C\u56DE\u586B", fill);
|
|
449
|
+
} else {
|
|
450
|
+
cfWarn('linkage', "\u52A8\u6001\u8054\u52A8\uFF1A\u5728 dataSource \u4E2D\u672A\u627E\u5230 matchKey=\"" + matchKey + "\" \u7B49\u4E8E \"" + value + "\" \u7684\u8BB0\u5F55\u3002" + "\u8BF7\u786E\u8BA4 matchKey \u4E0E optionsBind \u5B58\u50A8\u503C\u5B57\u6BB5\u540D\u4E00\u81F4\uFF08\u914D\u7F6E\u4E86 optionsValueKey \u65F6\u4F1A\u81EA\u52A8\u4F7F\u7528\u8BE5\u5B57\u6BB5\u540D\uFF09\uFF0C\u4E14 dataSource \u4E0E optionsBind \u540C\u6E90\u3002");
|
|
451
|
+
}
|
|
373
452
|
}
|
|
374
453
|
}
|
|
375
454
|
|
|
@@ -378,20 +457,42 @@ var CustomForm = function CustomForm(_ref) {
|
|
|
378
457
|
var noConstraint = rule.matchValue === undefined || rule.matchValue === '';
|
|
379
458
|
var _matched = noConstraint || String(value) === String(rule.matchValue);
|
|
380
459
|
if (_matched) {
|
|
381
|
-
var
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
Object.assign(valuesRef.current, _fill);
|
|
385
|
-
cfLog('linkage', "\u7B80\u5355\u8054\u52A8 \"" + field + "\" = " + value + "\uFF0C\u56DE\u586B", _fill);
|
|
460
|
+
var _cfLog;
|
|
461
|
+
fills[rule.fillField] = rule.fillValue;
|
|
462
|
+
cfLog('linkage', "\u7B80\u5355\u8054\u52A8 \"" + field + "\" = " + value + "\uFF0C\u56DE\u586B", (_cfLog = {}, _cfLog[rule.fillField] = rule.fillValue, _cfLog));
|
|
386
463
|
}
|
|
387
464
|
}
|
|
388
465
|
});
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
466
|
+
|
|
467
|
+
// ── 第三步:同步更新 valuesRef 和 linkageValues ──────────────────────────────
|
|
468
|
+
// ① 先把 clearableFields 回退为初始值(无论本次有无匹配)
|
|
469
|
+
// ② 再把 fills 叠加进来(覆盖刚刚的回退值)
|
|
470
|
+
// 结果:本次有匹配 → 字段显示新的联动值;本次无匹配 → 字段回退为初始值或空
|
|
471
|
+
if (clearableFields.size > 0) {
|
|
472
|
+
clearableFields.forEach(function (f) {
|
|
473
|
+
var initVal = resolvedInitialValues === null || resolvedInitialValues === void 0 ? void 0 : resolvedInitialValues[f];
|
|
474
|
+
if (initVal !== undefined) {
|
|
475
|
+
valuesRef.current[f] = initVal;
|
|
476
|
+
} else {
|
|
477
|
+
delete valuesRef.current[f];
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
Object.assign(valuesRef.current, fills);
|
|
481
|
+
setLinkageValues(function (prev) {
|
|
482
|
+
var next = (0, _extends4["default"])({}, prev);
|
|
483
|
+
// 删除"可被清除"但本次未填入的字段,使其退出受控状态
|
|
484
|
+
clearableFields.forEach(function (f) {
|
|
485
|
+
if (!(f in fills)) delete next[f];
|
|
486
|
+
});
|
|
487
|
+
return (0, _extends4["default"])({}, next, fills);
|
|
488
|
+
});
|
|
489
|
+
} else if (Object.keys(fills).length > 0) {
|
|
490
|
+
// 保底路径:clearableFields 为空但仍有 fills(理论上不会出现)
|
|
491
|
+
Object.assign(valuesRef.current, fills);
|
|
492
|
+
setLinkageValues(function (prev) {
|
|
493
|
+
return (0, _extends4["default"])({}, prev, fills);
|
|
494
|
+
});
|
|
495
|
+
}
|
|
395
496
|
}
|
|
396
497
|
|
|
397
498
|
// 3. 计算 computedFields,得到包含衍生字段的完整值
|
|
@@ -401,7 +502,7 @@ var CustomForm = function CustomForm(_ref) {
|
|
|
401
502
|
if (onChange) {
|
|
402
503
|
onChange(field, value, allValues);
|
|
403
504
|
}
|
|
404
|
-
}, [resolvedComputedFields, fieldLinkage, onChange]);
|
|
505
|
+
}, [resolvedComputedFields, resolvedInitialValues, fieldLinkage, onChange]);
|
|
405
506
|
|
|
406
507
|
// ─── 提交处理 ───────────────────────────────────────────────────────────────
|
|
407
508
|
// ─── 对齐方式映射 ───────────────────────────────────────────────────────────
|
|
@@ -431,8 +532,11 @@ var CustomForm = function CustomForm(_ref) {
|
|
|
431
532
|
return ops;
|
|
432
533
|
}, [operations, showSubmit, submitText, submitValidate, showReset, resetText]);
|
|
433
534
|
var handleSubmit = (0, _react.useCallback)(function (values, errors, field, buttonDataSource) {
|
|
434
|
-
//
|
|
435
|
-
|
|
535
|
+
// 合并原则:valuesRef.current 优先级最高,因为它是所有变化(用户输入 + 联动回填)的唯一可信来源。
|
|
536
|
+
// Form.Submit 返回的 values 中,联动回填字段没有经过 onChange,Form 内部 store
|
|
537
|
+
// 可能保留初始 undefined/"",若让 values 覆盖 valuesRef 会丢失联动写入的正确值。
|
|
538
|
+
// { ...values, ...valuesRef.current }:valuesRef 覆盖 Form stale 值,确保联动回填生效。
|
|
539
|
+
var mergedValues = (0, _extends4["default"])({}, values, valuesRef.current);
|
|
436
540
|
// 追加 computedFields 衍生字段
|
|
437
541
|
var finalValues = applyComputedFields(mergedValues, resolvedComputedFields);
|
|
438
542
|
|
|
@@ -497,7 +601,15 @@ var CustomForm = function CustomForm(_ref) {
|
|
|
497
601
|
// buttonDataSource:单个按钮绑定的数据源(优先);未绑定时回退到组件级 submitDataSource
|
|
498
602
|
var effectiveDS = buttonDataSource !== null && buttonDataSource !== void 0 ? buttonDataSource : submitDataSource;
|
|
499
603
|
runSubmitDataSource(effectiveDS, finalValues, errors, field);
|
|
500
|
-
}, [
|
|
604
|
+
}, [resolvedComputedFields, submitMapping, onSubmit, onSubmitFailed, submitDataSource]);
|
|
605
|
+
|
|
606
|
+
// ─── 重置处理:同时清除 linkageValues 和 valuesRef ────────────────────────────
|
|
607
|
+
var handleReset = (0, _react.useCallback)(function () {
|
|
608
|
+
setLinkageValues({});
|
|
609
|
+
valuesRef.current = resolvedInitialValues ? (0, _extends4["default"])({}, resolvedInitialValues) : {};
|
|
610
|
+
cfLog('reset', '表单已重置,linkageValues 和 valuesRef 已恢复初始状态');
|
|
611
|
+
onReset === null || onReset === void 0 ? void 0 : onReset();
|
|
612
|
+
}, [resolvedInitialValues, onReset]);
|
|
501
613
|
|
|
502
614
|
// ─── 渲染表单项,绑定统一 onChange ──────────────────────────────────────────
|
|
503
615
|
var formItemNodes = formItems.map(function (item, index) {
|
|
@@ -585,10 +697,12 @@ var CustomForm = function CustomForm(_ref) {
|
|
|
585
697
|
var hasContent = formItemNodes.length > 0 || childrenNodes.length > 0;
|
|
586
698
|
|
|
587
699
|
// initialValues 通过 defaultValue 传入 Form(非受控初始化),避免覆盖联动回填的受控值
|
|
700
|
+
// 注意:必须使用 resolvedInitialValues(已标准化为对象格式),而非原始 initialValues
|
|
701
|
+
// 原始值在设计器中为数组格式 [{field, valueType, value}],直接传给 NextForm.defaultValue 无效
|
|
588
702
|
var formInitialProps = {};
|
|
589
|
-
if (
|
|
590
|
-
formInitialProps.defaultValue =
|
|
591
|
-
cfLog('render', '表单携带 initialValues 渲染',
|
|
703
|
+
if (resolvedInitialValues && Object.keys(resolvedInitialValues).length > 0) {
|
|
704
|
+
formInitialProps.defaultValue = resolvedInitialValues;
|
|
705
|
+
cfLog('render', '表单携带 initialValues 渲染', resolvedInitialValues);
|
|
592
706
|
}
|
|
593
707
|
return /*#__PURE__*/_react["default"].createElement(NextFormAny, (0, _extends4["default"])({
|
|
594
708
|
className: "custom-form"
|
|
@@ -616,7 +730,7 @@ var CustomForm = function CustomForm(_ref) {
|
|
|
616
730
|
return /*#__PURE__*/_react["default"].createElement(NextFormAny.Reset, (0, _extends4["default"])({
|
|
617
731
|
key: opIndex,
|
|
618
732
|
type: op.type || 'normal',
|
|
619
|
-
onClick:
|
|
733
|
+
onClick: handleReset
|
|
620
734
|
}, op.buttonProps || {}), op.text);
|
|
621
735
|
}
|
|
622
736
|
// ── 提交按钮 ─────────────────────────────────────────────────────
|