@zat-design/sisyphus-react 4.1.2-beta.8 → 4.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/.claudeignore
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# 依赖
|
|
2
|
+
node_modules/
|
|
3
|
+
.umi/
|
|
4
|
+
.dumi/
|
|
5
|
+
|
|
6
|
+
# 构建产物
|
|
7
|
+
dist/
|
|
8
|
+
es/
|
|
9
|
+
lib/
|
|
10
|
+
docs-dist/
|
|
11
|
+
|
|
12
|
+
# 测试
|
|
13
|
+
coverage/
|
|
14
|
+
**/*.test.tsx
|
|
15
|
+
**/*.test.ts
|
|
16
|
+
**/__tests__/
|
|
17
|
+
**/*.spec.tsx
|
|
18
|
+
**/*.spec.ts
|
|
19
|
+
|
|
20
|
+
# 配置文件
|
|
21
|
+
.eslintrc.js
|
|
22
|
+
.prettierrc
|
|
23
|
+
.stylelintrc
|
|
24
|
+
tsconfig.json
|
|
25
|
+
babel.config.js
|
|
26
|
+
jest.config.js
|
|
27
|
+
|
|
28
|
+
# 版本控制
|
|
29
|
+
.git/
|
|
30
|
+
.gitignore
|
|
31
|
+
|
|
32
|
+
# IDE
|
|
33
|
+
.vscode/
|
|
34
|
+
.idea/
|
|
35
|
+
|
|
36
|
+
# 临时文件
|
|
37
|
+
*.log
|
|
38
|
+
.DS_Store
|
|
39
|
+
*.swp
|
|
40
|
+
*.swo
|
|
@@ -37,7 +37,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
37
37
|
var OMIT_FORM_ITEM_AND_DOM_KEYS = ['format', 'toISOString', 'toCSTString', 'switchValue', 'precision', 'clearNotShow', 'dependNames', 'shouldCellUpdate' // 表格内部性能优化属性,不应传递给 Form.Item
|
|
38
38
|
];
|
|
39
39
|
var RenderField = _ref => {
|
|
40
|
-
var _type, _type$replace, _fieldProps2, _fieldProps4, _names, _TargetComponent5,
|
|
40
|
+
var _type, _type$replace, _fieldProps2, _fieldProps4, _names, _TargetComponent5, _componentProps2;
|
|
41
41
|
var value = _ref.text,
|
|
42
42
|
record = _ref.record,
|
|
43
43
|
index = _ref.index,
|
|
@@ -237,6 +237,7 @@ var RenderField = _ref => {
|
|
|
237
237
|
// 允许formItem的属性放在column最外层 - 使用useMemo优化(剔除会透传到 DOM 的字段)
|
|
238
238
|
var _formItemProps = useMemo(() => _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, defaultProps), omit(resetProps, OMIT_FORM_ITEM_AND_DOM_KEYS)), internalRule), {}, {
|
|
239
239
|
validateTrigger
|
|
240
|
+
// 注意:当 hasFunctionDependency 时会设置 shouldUpdate,shouldUpdate 与 dependencies 互斥,不透传 dependencies
|
|
240
241
|
}), [defaultProps, resetProps, internalRule, validateTrigger]);
|
|
241
242
|
|
|
242
243
|
// 当这些函数类型存在时,自动添加 shouldUpdate
|
|
@@ -261,8 +262,8 @@ var RenderField = _ref => {
|
|
|
261
262
|
|
|
262
263
|
// 移除 isSingleMode 限制,让所有模式都支持响应式更新
|
|
263
264
|
// 性能优化已通过 useShouldUpdateForTable hook 的缓存和防抖机制实现
|
|
264
|
-
if (hasFunctionDependency
|
|
265
|
-
// 使用 shouldUpdate
|
|
265
|
+
if (hasFunctionDependency) {
|
|
266
|
+
// 使用 shouldUpdate 监听同一行的数据变化;shouldUpdate 与 dependencies 互斥,始终优先 shouldUpdate
|
|
266
267
|
_formItemProps.shouldUpdate = (prevValues, currentValues) => {
|
|
267
268
|
var prevRow = get(prevValues, [...namePath, index]);
|
|
268
269
|
var currentRow = get(currentValues, [...namePath, index]);
|
|
@@ -435,10 +436,11 @@ var RenderField = _ref => {
|
|
|
435
436
|
orgRow,
|
|
436
437
|
_TargetComponent,
|
|
437
438
|
_TargetComponent2,
|
|
438
|
-
|
|
439
|
-
_Object$
|
|
439
|
+
rowAfter,
|
|
440
|
+
_Object$keys2,
|
|
441
|
+
_Object$keys2$map,
|
|
440
442
|
diff,
|
|
441
|
-
|
|
443
|
+
_validateFieldKeys2,
|
|
442
444
|
_args2 = arguments;
|
|
443
445
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
444
446
|
while (1) switch (_context.prev = _context.next) {
|
|
@@ -463,7 +465,7 @@ var RenderField = _ref => {
|
|
|
463
465
|
row = form.getFieldValue(rowPath, true);
|
|
464
466
|
orgRow = cloneDeep(row);
|
|
465
467
|
if (!onFieldChange) {
|
|
466
|
-
_context.next =
|
|
468
|
+
_context.next = 22;
|
|
467
469
|
break;
|
|
468
470
|
}
|
|
469
471
|
_args = formatArgs(innerArgs);
|
|
@@ -484,48 +486,62 @@ var RenderField = _ref => {
|
|
|
484
486
|
_context.next = 19;
|
|
485
487
|
return onFieldChange(..._args);
|
|
486
488
|
case 19:
|
|
487
|
-
|
|
489
|
+
// onFieldChange 内已通过 form.setFieldValue(子路径) 或原地改 record 更新 store;此处再整行 setFieldValue(rowPath, rowAfter) 易用滞后快照覆盖 Field 刚写入的新值(如 formType)。仅延后读表做校验与 forceUpdate,不再整行回写。
|
|
490
|
+
setTimeout(() => {
|
|
491
|
+
var _form$getFieldValue;
|
|
492
|
+
var rowAfter = (_form$getFieldValue = form.getFieldValue(rowPath, true)) !== null && _form$getFieldValue !== void 0 ? _form$getFieldValue : row;
|
|
493
|
+
if (validateTrigger && validateTrigger.includes('onChange')) {
|
|
494
|
+
if (!isEqual(orgRow, rowAfter)) {
|
|
495
|
+
var _Object$keys, _Object$keys$map;
|
|
496
|
+
var diff = difference(rowAfter, orgRow) || {};
|
|
497
|
+
var _validateFieldKeys = (_Object$keys = Object.keys(diff)) === null || _Object$keys === void 0 || (_Object$keys$map = _Object$keys.map) === null || _Object$keys$map === void 0 ? void 0 : _Object$keys$map.call(_Object$keys, key => [...rowPath, key]).concat(dependencies || []);
|
|
498
|
+
if (_validateFieldKeys !== null && _validateFieldKeys !== void 0 && _validateFieldKeys.length) {
|
|
499
|
+
debounceValidate(_validateFieldKeys);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
if (!isEqual(orgRow, rowAfter)) {
|
|
504
|
+
compatStartTransition(() => {
|
|
505
|
+
setState({
|
|
506
|
+
forceUpdate: {
|
|
507
|
+
rowKey: record === null || record === void 0 ? void 0 : record.rowKey
|
|
508
|
+
}
|
|
509
|
+
});
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
}, 0);
|
|
513
|
+
_context.next = 34;
|
|
488
514
|
break;
|
|
489
|
-
case
|
|
515
|
+
case 22:
|
|
490
516
|
_args = _args.concat([row, index, form]);
|
|
491
517
|
_context.t2 = (_TargetComponent2 = TargetComponent) === null || _TargetComponent2 === void 0 || (_TargetComponent2 = _TargetComponent2.props) === null || _TargetComponent2 === void 0 ? void 0 : _TargetComponent2.onChange;
|
|
492
518
|
if (!_context.t2) {
|
|
493
|
-
_context.next =
|
|
519
|
+
_context.next = 27;
|
|
494
520
|
break;
|
|
495
521
|
}
|
|
496
|
-
_context.next =
|
|
522
|
+
_context.next = 27;
|
|
497
523
|
return TargetComponent.props.onChange(..._args);
|
|
498
|
-
case
|
|
524
|
+
case 27:
|
|
499
525
|
_context.t3 = onChange;
|
|
500
526
|
if (!_context.t3) {
|
|
501
|
-
_context.next =
|
|
527
|
+
_context.next = 31;
|
|
502
528
|
break;
|
|
503
529
|
}
|
|
504
|
-
_context.next =
|
|
530
|
+
_context.next = 31;
|
|
505
531
|
return onChange(..._args);
|
|
506
|
-
case
|
|
507
|
-
|
|
508
|
-
form.setFieldValue(rowPath,
|
|
532
|
+
case 31:
|
|
533
|
+
rowAfter = row;
|
|
534
|
+
form.setFieldValue(rowPath, rowAfter);
|
|
509
535
|
if (validateTrigger && validateTrigger.includes('onChange')) {
|
|
510
|
-
if (!isEqual(orgRow,
|
|
511
|
-
diff = difference(
|
|
512
|
-
|
|
513
|
-
if (
|
|
514
|
-
debounceValidate(
|
|
536
|
+
if (!isEqual(orgRow, rowAfter)) {
|
|
537
|
+
diff = difference(rowAfter, orgRow) || {};
|
|
538
|
+
_validateFieldKeys2 = (_Object$keys2 = Object.keys(diff)) === null || _Object$keys2 === void 0 || (_Object$keys2$map = _Object$keys2.map) === null || _Object$keys2$map === void 0 ? void 0 : _Object$keys2$map.call(_Object$keys2, key => [...rowPath, key]).concat(dependencies || []);
|
|
539
|
+
if (_validateFieldKeys2 !== null && _validateFieldKeys2 !== void 0 && _validateFieldKeys2.length) {
|
|
540
|
+
debounceValidate(_validateFieldKeys2);
|
|
515
541
|
}
|
|
516
542
|
}
|
|
517
543
|
}
|
|
518
|
-
|
|
519
|
-
if (onFieldChange && !isEqual(orgRow, row)) {
|
|
520
|
-
compatStartTransition(() => {
|
|
521
|
-
setState({
|
|
522
|
-
forceUpdate: {
|
|
523
|
-
rowKey: record === null || record === void 0 ? void 0 : record.rowKey
|
|
524
|
-
}
|
|
525
|
-
});
|
|
526
|
-
});
|
|
527
|
-
}
|
|
528
|
-
case 33:
|
|
544
|
+
case 34:
|
|
529
545
|
case "end":
|
|
530
546
|
return _context.stop();
|
|
531
547
|
}
|
|
@@ -574,8 +590,8 @@ var RenderField = _ref => {
|
|
|
574
590
|
rowPath,
|
|
575
591
|
row,
|
|
576
592
|
orgRow,
|
|
577
|
-
_Object$
|
|
578
|
-
_Object$
|
|
593
|
+
_Object$keys3,
|
|
594
|
+
_Object$keys3$map,
|
|
579
595
|
diff,
|
|
580
596
|
validateFieldKeys,
|
|
581
597
|
_args4 = arguments;
|
|
@@ -614,7 +630,7 @@ var RenderField = _ref => {
|
|
|
614
630
|
if (validateTrigger && validateTrigger.includes('onBlur')) {
|
|
615
631
|
if (!isEqual(orgRow, row)) {
|
|
616
632
|
diff = difference(row, orgRow) || {};
|
|
617
|
-
validateFieldKeys = (_Object$
|
|
633
|
+
validateFieldKeys = (_Object$keys3 = Object.keys(diff)) === null || _Object$keys3 === void 0 || (_Object$keys3$map = _Object$keys3.map) === null || _Object$keys3$map === void 0 ? void 0 : _Object$keys3$map.call(_Object$keys3, key => [...rowPath, key]).concat(dependencies || []);
|
|
618
634
|
if (validateFieldKeys !== null && validateFieldKeys !== void 0 && validateFieldKeys.length) {
|
|
619
635
|
debounceValidate(validateFieldKeys);
|
|
620
636
|
}
|
|
@@ -749,7 +765,7 @@ var RenderField = _ref => {
|
|
|
749
765
|
var finalComponentProps = componentProps;
|
|
750
766
|
if (shouldUpdateMode) {
|
|
751
767
|
var _column$isEditable2;
|
|
752
|
-
//
|
|
768
|
+
// 重新获取最新的行数据(shouldUpdate 触发时,通过 getFieldValue 拿到最新值)
|
|
753
769
|
var latestRowData = form.getFieldValue([...namePath, index]) || record || {};
|
|
754
770
|
var latestReactiveParams = {
|
|
755
771
|
form,
|
|
@@ -805,6 +821,7 @@ var RenderField = _ref => {
|
|
|
805
821
|
});
|
|
806
822
|
|
|
807
823
|
// 更新 componentProps 中的所有响应式属性
|
|
824
|
+
// latestTargetComponent 稍后计算,此处先占位;最终 finalComponentProps 会在下方合并 latestTargetComponent?.props
|
|
808
825
|
finalComponentProps = _objectSpread(_objectSpread(_objectSpread({}, componentProps), latestFieldProps), {}, {
|
|
809
826
|
disabled: latestDisabled,
|
|
810
827
|
desensitization: latestDesensitization,
|
|
@@ -858,6 +875,20 @@ var RenderField = _ref => {
|
|
|
858
875
|
|
|
859
876
|
// 使用重新计算的 TargetComponent
|
|
860
877
|
TargetComponent = latestTargetComponent;
|
|
878
|
+
|
|
879
|
+
// componentProps 里展开了外层旧 TargetComponent?.props(如 { formType: "Input" }),
|
|
880
|
+
// 用 latestTargetComponent?.props 覆盖,确保不会被旧 cloneElement props 污染
|
|
881
|
+
if ( /*#__PURE__*/React.isValidElement(latestTargetComponent)) {
|
|
882
|
+
var _componentProps = latestTargetComponent.props;
|
|
883
|
+
// 确保 props 是对象类型才进行展开
|
|
884
|
+
if (_componentProps && typeof _componentProps === 'object') {
|
|
885
|
+
finalComponentProps = _objectSpread(_objectSpread(_objectSpread({}, finalComponentProps), _componentProps), {}, {
|
|
886
|
+
// 始终保证事件处理函数不被覆盖
|
|
887
|
+
onChange: _onChange,
|
|
888
|
+
onBlur: _onblur
|
|
889
|
+
});
|
|
890
|
+
}
|
|
891
|
+
}
|
|
861
892
|
}
|
|
862
893
|
var FormItem = null;
|
|
863
894
|
// 当 viewRender 存在时,需要排除 finalComponentProps 中的 children,避免覆盖 Container 的 children
|
|
@@ -929,7 +960,7 @@ var RenderField = _ref => {
|
|
|
929
960
|
return FormItem;
|
|
930
961
|
};
|
|
931
962
|
return /*#__PURE__*/_jsx(FieldProvider, {
|
|
932
|
-
value: ((
|
|
963
|
+
value: ((_componentProps2 = componentProps) === null || _componentProps2 === void 0 ? void 0 : _componentProps2.otherProps) || {},
|
|
933
964
|
children: finalFormItemProps.shouldUpdate ? /*#__PURE__*/_jsx(Form.Item, {
|
|
934
965
|
noStyle: true,
|
|
935
966
|
shouldUpdate: finalFormItemProps.shouldUpdate,
|
|
@@ -950,6 +981,12 @@ export default /*#__PURE__*/memo(RenderField, (prevProps, nextProps) => {
|
|
|
950
981
|
nextColumn = nextProps.column,
|
|
951
982
|
nextConfig = nextProps.config;
|
|
952
983
|
|
|
984
|
+
// 自定义 component/editRender 且行对象为同引用时,浅比较无法区分原地修改,需强制重渲染
|
|
985
|
+
var hasFunctionComponent = isFunction(prevColumn === null || prevColumn === void 0 ? void 0 : prevColumn.component) || isFunction(prevColumn === null || prevColumn === void 0 ? void 0 : prevColumn.editRender) || isFunction(nextColumn === null || nextColumn === void 0 ? void 0 : nextColumn.component) || isFunction(nextColumn === null || nextColumn === void 0 ? void 0 : nextColumn.editRender);
|
|
986
|
+
if (hasFunctionComponent && prevRecord === nextRecord) {
|
|
987
|
+
return false;
|
|
988
|
+
}
|
|
989
|
+
|
|
953
990
|
// 构建新的参数格式(与 ProForm 保持一致)
|
|
954
991
|
var prevNamePath = getNamePath(prevConfig === null || prevConfig === void 0 ? void 0 : prevConfig.name, prevConfig === null || prevConfig === void 0 ? void 0 : prevConfig.virtualKey);
|
|
955
992
|
var nextNamePath = getNamePath(nextConfig === null || nextConfig === void 0 ? void 0 : nextConfig.name, nextConfig === null || nextConfig === void 0 ? void 0 : nextConfig.virtualKey);
|
|
@@ -990,14 +1027,14 @@ export default /*#__PURE__*/memo(RenderField, (prevProps, nextProps) => {
|
|
|
990
1027
|
}
|
|
991
1028
|
|
|
992
1029
|
// 通用函数比较方法
|
|
993
|
-
//
|
|
994
|
-
// 对于纯函数,如果输入相同则输出相同
|
|
1030
|
+
// 优化:不直接调用函数,而是比较函数引用和输入参数
|
|
995
1031
|
var compareFunctionResult = (prevColumn, nextColumn, prevValues, nextValues, prevReactiveParams, nextReactiveParams, functionName) => {
|
|
996
1032
|
var prevFunc = prevColumn === null || prevColumn === void 0 ? void 0 : prevColumn[functionName];
|
|
997
1033
|
var nextFunc = nextColumn === null || nextColumn === void 0 ? void 0 : nextColumn[functionName];
|
|
998
1034
|
if (isFunction(prevFunc) && isFunction(nextFunc)) {
|
|
999
|
-
//
|
|
1000
|
-
|
|
1035
|
+
// 函数引用变化说明闭包可能捕获了新的外部状态(如异步加载的 list),必须重渲染
|
|
1036
|
+
if (prevFunc !== nextFunc) return false;
|
|
1037
|
+
// 同引用函数,比较输入参数(纯函数假设:输入相同则输出相同)
|
|
1001
1038
|
return isEqualWith(prevValues, nextValues, customEqualForFunction);
|
|
1002
1039
|
}
|
|
1003
1040
|
return true; // 如果不是函数或只有一个是函数,认为相等
|
|
@@ -25,6 +25,8 @@ import locale from "../../locale";
|
|
|
25
25
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
26
26
|
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
27
27
|
var columnDataSourceRefCache = new Map();
|
|
28
|
+
/** 追踪 component 函数引用,用于检测外部状态(如异步 list)变化导致的闭包更新 */
|
|
29
|
+
var columnComponentRefCache = new Map();
|
|
28
30
|
|
|
29
31
|
// 渲染操作栏
|
|
30
32
|
var getActionColumn = config => {
|
|
@@ -396,6 +398,18 @@ export var transformColumns = function transformColumns() {
|
|
|
396
398
|
}
|
|
397
399
|
// 动态 component 可能依赖行内其他字段,需比较整行
|
|
398
400
|
if (hasComponent) {
|
|
401
|
+
// component 函数引用变化说明外部依赖(如异步 list)已更新,必须重渲染
|
|
402
|
+
// 即使行数据未变,旧闭包仍持有过时的外部状态
|
|
403
|
+
var prevComponentRef = columnComponentRefCache.get(columnCacheKey);
|
|
404
|
+
var currentComponentRef = item.component;
|
|
405
|
+
if (prevComponentRef !== currentComponentRef) {
|
|
406
|
+
columnComponentRefCache.set(columnCacheKey, currentComponentRef);
|
|
407
|
+
return true;
|
|
408
|
+
}
|
|
409
|
+
// 同引用时 isEqual 恒为 true,无法感知原地修改,必须重渲染
|
|
410
|
+
if (record === prevRecord) {
|
|
411
|
+
return true;
|
|
412
|
+
}
|
|
399
413
|
var rowChanged = !isEqual(record, prevRecord);
|
|
400
414
|
return rowChanged;
|
|
401
415
|
}
|
|
@@ -44,7 +44,7 @@ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) r
|
|
|
44
44
|
var OMIT_FORM_ITEM_AND_DOM_KEYS = ['format', 'toISOString', 'toCSTString', 'switchValue', 'precision', 'clearNotShow', 'dependNames', 'shouldCellUpdate' // 表格内部性能优化属性,不应传递给 Form.Item
|
|
45
45
|
];
|
|
46
46
|
var RenderField = _ref => {
|
|
47
|
-
var _type, _type$replace, _fieldProps2, _fieldProps4, _names, _TargetComponent5,
|
|
47
|
+
var _type, _type$replace, _fieldProps2, _fieldProps4, _names, _TargetComponent5, _componentProps2;
|
|
48
48
|
var value = _ref.text,
|
|
49
49
|
record = _ref.record,
|
|
50
50
|
index = _ref.index,
|
|
@@ -244,6 +244,7 @@ var RenderField = _ref => {
|
|
|
244
244
|
// 允许formItem的属性放在column最外层 - 使用useMemo优化(剔除会透传到 DOM 的字段)
|
|
245
245
|
var _formItemProps = (0, _react.useMemo)(() => _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, defaultProps), (0, _lodash.omit)(resetProps, OMIT_FORM_ITEM_AND_DOM_KEYS)), internalRule), {}, {
|
|
246
246
|
validateTrigger
|
|
247
|
+
// 注意:当 hasFunctionDependency 时会设置 shouldUpdate,shouldUpdate 与 dependencies 互斥,不透传 dependencies
|
|
247
248
|
}), [defaultProps, resetProps, internalRule, validateTrigger]);
|
|
248
249
|
|
|
249
250
|
// 当这些函数类型存在时,自动添加 shouldUpdate
|
|
@@ -268,8 +269,8 @@ var RenderField = _ref => {
|
|
|
268
269
|
|
|
269
270
|
// 移除 isSingleMode 限制,让所有模式都支持响应式更新
|
|
270
271
|
// 性能优化已通过 useShouldUpdateForTable hook 的缓存和防抖机制实现
|
|
271
|
-
if (hasFunctionDependency
|
|
272
|
-
// 使用 shouldUpdate
|
|
272
|
+
if (hasFunctionDependency) {
|
|
273
|
+
// 使用 shouldUpdate 监听同一行的数据变化;shouldUpdate 与 dependencies 互斥,始终优先 shouldUpdate
|
|
273
274
|
_formItemProps.shouldUpdate = (prevValues, currentValues) => {
|
|
274
275
|
var prevRow = (0, _lodash.get)(prevValues, [...namePath, index]);
|
|
275
276
|
var currentRow = (0, _lodash.get)(currentValues, [...namePath, index]);
|
|
@@ -442,10 +443,11 @@ var RenderField = _ref => {
|
|
|
442
443
|
orgRow,
|
|
443
444
|
_TargetComponent,
|
|
444
445
|
_TargetComponent2,
|
|
445
|
-
|
|
446
|
-
_Object$
|
|
446
|
+
rowAfter,
|
|
447
|
+
_Object$keys2,
|
|
448
|
+
_Object$keys2$map,
|
|
447
449
|
diff,
|
|
448
|
-
|
|
450
|
+
_validateFieldKeys2,
|
|
449
451
|
_args2 = arguments;
|
|
450
452
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
451
453
|
while (1) switch (_context.prev = _context.next) {
|
|
@@ -470,7 +472,7 @@ var RenderField = _ref => {
|
|
|
470
472
|
row = form.getFieldValue(rowPath, true);
|
|
471
473
|
orgRow = (0, _lodash.cloneDeep)(row);
|
|
472
474
|
if (!onFieldChange) {
|
|
473
|
-
_context.next =
|
|
475
|
+
_context.next = 22;
|
|
474
476
|
break;
|
|
475
477
|
}
|
|
476
478
|
_args = formatArgs(innerArgs);
|
|
@@ -491,48 +493,62 @@ var RenderField = _ref => {
|
|
|
491
493
|
_context.next = 19;
|
|
492
494
|
return onFieldChange(..._args);
|
|
493
495
|
case 19:
|
|
494
|
-
|
|
496
|
+
// onFieldChange 内已通过 form.setFieldValue(子路径) 或原地改 record 更新 store;此处再整行 setFieldValue(rowPath, rowAfter) 易用滞后快照覆盖 Field 刚写入的新值(如 formType)。仅延后读表做校验与 forceUpdate,不再整行回写。
|
|
497
|
+
setTimeout(() => {
|
|
498
|
+
var _form$getFieldValue;
|
|
499
|
+
var rowAfter = (_form$getFieldValue = form.getFieldValue(rowPath, true)) !== null && _form$getFieldValue !== void 0 ? _form$getFieldValue : row;
|
|
500
|
+
if (validateTrigger && validateTrigger.includes('onChange')) {
|
|
501
|
+
if (!(0, _lodash.isEqual)(orgRow, rowAfter)) {
|
|
502
|
+
var _Object$keys, _Object$keys$map;
|
|
503
|
+
var diff = (0, _tools.difference)(rowAfter, orgRow) || {};
|
|
504
|
+
var _validateFieldKeys = (_Object$keys = Object.keys(diff)) === null || _Object$keys === void 0 || (_Object$keys$map = _Object$keys.map) === null || _Object$keys$map === void 0 ? void 0 : _Object$keys$map.call(_Object$keys, key => [...rowPath, key]).concat(dependencies || []);
|
|
505
|
+
if (_validateFieldKeys !== null && _validateFieldKeys !== void 0 && _validateFieldKeys.length) {
|
|
506
|
+
debounceValidate(_validateFieldKeys);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
if (!(0, _lodash.isEqual)(orgRow, rowAfter)) {
|
|
511
|
+
(0, _utils.compatStartTransition)(() => {
|
|
512
|
+
setState({
|
|
513
|
+
forceUpdate: {
|
|
514
|
+
rowKey: record === null || record === void 0 ? void 0 : record.rowKey
|
|
515
|
+
}
|
|
516
|
+
});
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
}, 0);
|
|
520
|
+
_context.next = 34;
|
|
495
521
|
break;
|
|
496
|
-
case
|
|
522
|
+
case 22:
|
|
497
523
|
_args = _args.concat([row, index, form]);
|
|
498
524
|
_context.t2 = (_TargetComponent2 = TargetComponent) === null || _TargetComponent2 === void 0 || (_TargetComponent2 = _TargetComponent2.props) === null || _TargetComponent2 === void 0 ? void 0 : _TargetComponent2.onChange;
|
|
499
525
|
if (!_context.t2) {
|
|
500
|
-
_context.next =
|
|
526
|
+
_context.next = 27;
|
|
501
527
|
break;
|
|
502
528
|
}
|
|
503
|
-
_context.next =
|
|
529
|
+
_context.next = 27;
|
|
504
530
|
return TargetComponent.props.onChange(..._args);
|
|
505
|
-
case
|
|
531
|
+
case 27:
|
|
506
532
|
_context.t3 = onChange;
|
|
507
533
|
if (!_context.t3) {
|
|
508
|
-
_context.next =
|
|
534
|
+
_context.next = 31;
|
|
509
535
|
break;
|
|
510
536
|
}
|
|
511
|
-
_context.next =
|
|
537
|
+
_context.next = 31;
|
|
512
538
|
return onChange(..._args);
|
|
513
|
-
case
|
|
514
|
-
|
|
515
|
-
form.setFieldValue(rowPath,
|
|
539
|
+
case 31:
|
|
540
|
+
rowAfter = row;
|
|
541
|
+
form.setFieldValue(rowPath, rowAfter);
|
|
516
542
|
if (validateTrigger && validateTrigger.includes('onChange')) {
|
|
517
|
-
if (!(0, _lodash.isEqual)(orgRow,
|
|
518
|
-
diff = (0, _tools.difference)(
|
|
519
|
-
|
|
520
|
-
if (
|
|
521
|
-
debounceValidate(
|
|
543
|
+
if (!(0, _lodash.isEqual)(orgRow, rowAfter)) {
|
|
544
|
+
diff = (0, _tools.difference)(rowAfter, orgRow) || {};
|
|
545
|
+
_validateFieldKeys2 = (_Object$keys2 = Object.keys(diff)) === null || _Object$keys2 === void 0 || (_Object$keys2$map = _Object$keys2.map) === null || _Object$keys2$map === void 0 ? void 0 : _Object$keys2$map.call(_Object$keys2, key => [...rowPath, key]).concat(dependencies || []);
|
|
546
|
+
if (_validateFieldKeys2 !== null && _validateFieldKeys2 !== void 0 && _validateFieldKeys2.length) {
|
|
547
|
+
debounceValidate(_validateFieldKeys2);
|
|
522
548
|
}
|
|
523
549
|
}
|
|
524
550
|
}
|
|
525
|
-
|
|
526
|
-
if (onFieldChange && !(0, _lodash.isEqual)(orgRow, row)) {
|
|
527
|
-
(0, _utils.compatStartTransition)(() => {
|
|
528
|
-
setState({
|
|
529
|
-
forceUpdate: {
|
|
530
|
-
rowKey: record === null || record === void 0 ? void 0 : record.rowKey
|
|
531
|
-
}
|
|
532
|
-
});
|
|
533
|
-
});
|
|
534
|
-
}
|
|
535
|
-
case 33:
|
|
551
|
+
case 34:
|
|
536
552
|
case "end":
|
|
537
553
|
return _context.stop();
|
|
538
554
|
}
|
|
@@ -581,8 +597,8 @@ var RenderField = _ref => {
|
|
|
581
597
|
rowPath,
|
|
582
598
|
row,
|
|
583
599
|
orgRow,
|
|
584
|
-
_Object$
|
|
585
|
-
_Object$
|
|
600
|
+
_Object$keys3,
|
|
601
|
+
_Object$keys3$map,
|
|
586
602
|
diff,
|
|
587
603
|
validateFieldKeys,
|
|
588
604
|
_args4 = arguments;
|
|
@@ -621,7 +637,7 @@ var RenderField = _ref => {
|
|
|
621
637
|
if (validateTrigger && validateTrigger.includes('onBlur')) {
|
|
622
638
|
if (!(0, _lodash.isEqual)(orgRow, row)) {
|
|
623
639
|
diff = (0, _tools.difference)(row, orgRow) || {};
|
|
624
|
-
validateFieldKeys = (_Object$
|
|
640
|
+
validateFieldKeys = (_Object$keys3 = Object.keys(diff)) === null || _Object$keys3 === void 0 || (_Object$keys3$map = _Object$keys3.map) === null || _Object$keys3$map === void 0 ? void 0 : _Object$keys3$map.call(_Object$keys3, key => [...rowPath, key]).concat(dependencies || []);
|
|
625
641
|
if (validateFieldKeys !== null && validateFieldKeys !== void 0 && validateFieldKeys.length) {
|
|
626
642
|
debounceValidate(validateFieldKeys);
|
|
627
643
|
}
|
|
@@ -756,7 +772,7 @@ var RenderField = _ref => {
|
|
|
756
772
|
var finalComponentProps = componentProps;
|
|
757
773
|
if (shouldUpdateMode) {
|
|
758
774
|
var _column$isEditable2;
|
|
759
|
-
//
|
|
775
|
+
// 重新获取最新的行数据(shouldUpdate 触发时,通过 getFieldValue 拿到最新值)
|
|
760
776
|
var latestRowData = form.getFieldValue([...namePath, index]) || record || {};
|
|
761
777
|
var latestReactiveParams = {
|
|
762
778
|
form,
|
|
@@ -812,6 +828,7 @@ var RenderField = _ref => {
|
|
|
812
828
|
});
|
|
813
829
|
|
|
814
830
|
// 更新 componentProps 中的所有响应式属性
|
|
831
|
+
// latestTargetComponent 稍后计算,此处先占位;最终 finalComponentProps 会在下方合并 latestTargetComponent?.props
|
|
815
832
|
finalComponentProps = _objectSpread(_objectSpread(_objectSpread({}, componentProps), latestFieldProps), {}, {
|
|
816
833
|
disabled: latestDisabled,
|
|
817
834
|
desensitization: latestDesensitization,
|
|
@@ -865,6 +882,20 @@ var RenderField = _ref => {
|
|
|
865
882
|
|
|
866
883
|
// 使用重新计算的 TargetComponent
|
|
867
884
|
TargetComponent = latestTargetComponent;
|
|
885
|
+
|
|
886
|
+
// componentProps 里展开了外层旧 TargetComponent?.props(如 { formType: "Input" }),
|
|
887
|
+
// 用 latestTargetComponent?.props 覆盖,确保不会被旧 cloneElement props 污染
|
|
888
|
+
if ( /*#__PURE__*/_react.default.isValidElement(latestTargetComponent)) {
|
|
889
|
+
var _componentProps = latestTargetComponent.props;
|
|
890
|
+
// 确保 props 是对象类型才进行展开
|
|
891
|
+
if (_componentProps && typeof _componentProps === 'object') {
|
|
892
|
+
finalComponentProps = _objectSpread(_objectSpread(_objectSpread({}, finalComponentProps), _componentProps), {}, {
|
|
893
|
+
// 始终保证事件处理函数不被覆盖
|
|
894
|
+
onChange: _onChange,
|
|
895
|
+
onBlur: _onblur
|
|
896
|
+
});
|
|
897
|
+
}
|
|
898
|
+
}
|
|
868
899
|
}
|
|
869
900
|
var FormItem = null;
|
|
870
901
|
// 当 viewRender 存在时,需要排除 finalComponentProps 中的 children,避免覆盖 Container 的 children
|
|
@@ -936,7 +967,7 @@ var RenderField = _ref => {
|
|
|
936
967
|
return FormItem;
|
|
937
968
|
};
|
|
938
969
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_useFieldProps.FieldProvider, {
|
|
939
|
-
value: ((
|
|
970
|
+
value: ((_componentProps2 = componentProps) === null || _componentProps2 === void 0 ? void 0 : _componentProps2.otherProps) || {},
|
|
940
971
|
children: finalFormItemProps.shouldUpdate ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Form.Item, {
|
|
941
972
|
noStyle: true,
|
|
942
973
|
shouldUpdate: finalFormItemProps.shouldUpdate,
|
|
@@ -957,6 +988,12 @@ var _default = exports.default = /*#__PURE__*/(0, _react.memo)(RenderField, (pre
|
|
|
957
988
|
nextColumn = nextProps.column,
|
|
958
989
|
nextConfig = nextProps.config;
|
|
959
990
|
|
|
991
|
+
// 自定义 component/editRender 且行对象为同引用时,浅比较无法区分原地修改,需强制重渲染
|
|
992
|
+
var hasFunctionComponent = (0, _lodash.isFunction)(prevColumn === null || prevColumn === void 0 ? void 0 : prevColumn.component) || (0, _lodash.isFunction)(prevColumn === null || prevColumn === void 0 ? void 0 : prevColumn.editRender) || (0, _lodash.isFunction)(nextColumn === null || nextColumn === void 0 ? void 0 : nextColumn.component) || (0, _lodash.isFunction)(nextColumn === null || nextColumn === void 0 ? void 0 : nextColumn.editRender);
|
|
993
|
+
if (hasFunctionComponent && prevRecord === nextRecord) {
|
|
994
|
+
return false;
|
|
995
|
+
}
|
|
996
|
+
|
|
960
997
|
// 构建新的参数格式(与 ProForm 保持一致)
|
|
961
998
|
var prevNamePath = (0, _tools.getNamePath)(prevConfig === null || prevConfig === void 0 ? void 0 : prevConfig.name, prevConfig === null || prevConfig === void 0 ? void 0 : prevConfig.virtualKey);
|
|
962
999
|
var nextNamePath = (0, _tools.getNamePath)(nextConfig === null || nextConfig === void 0 ? void 0 : nextConfig.name, nextConfig === null || nextConfig === void 0 ? void 0 : nextConfig.virtualKey);
|
|
@@ -997,14 +1034,14 @@ var _default = exports.default = /*#__PURE__*/(0, _react.memo)(RenderField, (pre
|
|
|
997
1034
|
}
|
|
998
1035
|
|
|
999
1036
|
// 通用函数比较方法
|
|
1000
|
-
//
|
|
1001
|
-
// 对于纯函数,如果输入相同则输出相同
|
|
1037
|
+
// 优化:不直接调用函数,而是比较函数引用和输入参数
|
|
1002
1038
|
var compareFunctionResult = (prevColumn, nextColumn, prevValues, nextValues, prevReactiveParams, nextReactiveParams, functionName) => {
|
|
1003
1039
|
var prevFunc = prevColumn === null || prevColumn === void 0 ? void 0 : prevColumn[functionName];
|
|
1004
1040
|
var nextFunc = nextColumn === null || nextColumn === void 0 ? void 0 : nextColumn[functionName];
|
|
1005
1041
|
if ((0, _lodash.isFunction)(prevFunc) && (0, _lodash.isFunction)(nextFunc)) {
|
|
1006
|
-
//
|
|
1007
|
-
|
|
1042
|
+
// 函数引用变化说明闭包可能捕获了新的外部状态(如异步加载的 list),必须重渲染
|
|
1043
|
+
if (prevFunc !== nextFunc) return false;
|
|
1044
|
+
// 同引用函数,比较输入参数(纯函数假设:输入相同则输出相同)
|
|
1008
1045
|
return (0, _lodash.isEqualWith)(prevValues, nextValues, _utils.customEqualForFunction);
|
|
1009
1046
|
}
|
|
1010
1047
|
return true; // 如果不是函数或只有一个是函数,认为相等
|
|
@@ -31,6 +31,8 @@ function _asyncToGenerator(fn) { return function () { var self = this, args = ar
|
|
|
31
31
|
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
32
32
|
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
33
33
|
var columnDataSourceRefCache = new Map();
|
|
34
|
+
/** 追踪 component 函数引用,用于检测外部状态(如异步 list)变化导致的闭包更新 */
|
|
35
|
+
var columnComponentRefCache = new Map();
|
|
34
36
|
|
|
35
37
|
// 渲染操作栏
|
|
36
38
|
var getActionColumn = config => {
|
|
@@ -402,6 +404,18 @@ var transformColumns = exports.transformColumns = function transformColumns() {
|
|
|
402
404
|
}
|
|
403
405
|
// 动态 component 可能依赖行内其他字段,需比较整行
|
|
404
406
|
if (hasComponent) {
|
|
407
|
+
// component 函数引用变化说明外部依赖(如异步 list)已更新,必须重渲染
|
|
408
|
+
// 即使行数据未变,旧闭包仍持有过时的外部状态
|
|
409
|
+
var prevComponentRef = columnComponentRefCache.get(columnCacheKey);
|
|
410
|
+
var currentComponentRef = item.component;
|
|
411
|
+
if (prevComponentRef !== currentComponentRef) {
|
|
412
|
+
columnComponentRefCache.set(columnCacheKey, currentComponentRef);
|
|
413
|
+
return true;
|
|
414
|
+
}
|
|
415
|
+
// 同引用时 isEqual 恒为 true,无法感知原地修改,必须重渲染
|
|
416
|
+
if (record === prevRecord) {
|
|
417
|
+
return true;
|
|
418
|
+
}
|
|
405
419
|
var rowChanged = !(0, _lodash.isEqual)(record, prevRecord);
|
|
406
420
|
return rowChanged;
|
|
407
421
|
}
|