@zat-design/sisyphus-react 4.1.2-beta.9 → 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, _componentProps;
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 && !(column !== null && column !== void 0 && column.dependencies)) {
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
- _Object$keys,
439
- _Object$keys$map,
439
+ rowAfter,
440
+ _Object$keys2,
441
+ _Object$keys2$map,
440
442
  diff,
441
- _validateFieldKeys,
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 = 21;
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
- _context.next = 30;
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 21:
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 = 26;
519
+ _context.next = 27;
494
520
  break;
495
521
  }
496
- _context.next = 26;
522
+ _context.next = 27;
497
523
  return TargetComponent.props.onChange(..._args);
498
- case 26:
524
+ case 27:
499
525
  _context.t3 = onChange;
500
526
  if (!_context.t3) {
501
- _context.next = 30;
527
+ _context.next = 31;
502
528
  break;
503
529
  }
504
- _context.next = 30;
530
+ _context.next = 31;
505
531
  return onChange(..._args);
506
- case 30:
507
- // 判断属性是否变动
508
- form.setFieldValue(rowPath, row);
532
+ case 31:
533
+ rowAfter = row;
534
+ form.setFieldValue(rowPath, rowAfter);
509
535
  if (validateTrigger && validateTrigger.includes('onChange')) {
510
- if (!isEqual(orgRow, row)) {
511
- diff = difference(row, orgRow) || {};
512
- _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 || []);
513
- if (_validateFieldKeys !== null && _validateFieldKeys !== void 0 && _validateFieldKeys.length) {
514
- debounceValidate(_validateFieldKeys);
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$keys2,
578
- _Object$keys2$map,
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$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 || []);
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: ((_componentProps = componentProps) === null || _componentProps === void 0 ? void 0 : _componentProps.otherProps) || {},
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
- // 如果 values 相同,则函数结果应该相同(纯函数假设)
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, _componentProps;
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 && !(column !== null && column !== void 0 && column.dependencies)) {
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
- _Object$keys,
446
- _Object$keys$map,
446
+ rowAfter,
447
+ _Object$keys2,
448
+ _Object$keys2$map,
447
449
  diff,
448
- _validateFieldKeys,
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 = 21;
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
- _context.next = 30;
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 21:
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 = 26;
526
+ _context.next = 27;
501
527
  break;
502
528
  }
503
- _context.next = 26;
529
+ _context.next = 27;
504
530
  return TargetComponent.props.onChange(..._args);
505
- case 26:
531
+ case 27:
506
532
  _context.t3 = onChange;
507
533
  if (!_context.t3) {
508
- _context.next = 30;
534
+ _context.next = 31;
509
535
  break;
510
536
  }
511
- _context.next = 30;
537
+ _context.next = 31;
512
538
  return onChange(..._args);
513
- case 30:
514
- // 判断属性是否变动
515
- form.setFieldValue(rowPath, row);
539
+ case 31:
540
+ rowAfter = row;
541
+ form.setFieldValue(rowPath, rowAfter);
516
542
  if (validateTrigger && validateTrigger.includes('onChange')) {
517
- if (!(0, _lodash.isEqual)(orgRow, row)) {
518
- diff = (0, _tools.difference)(row, orgRow) || {};
519
- _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 || []);
520
- if (_validateFieldKeys !== null && _validateFieldKeys !== void 0 && _validateFieldKeys.length) {
521
- debounceValidate(_validateFieldKeys);
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$keys2,
585
- _Object$keys2$map,
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$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 || []);
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: ((_componentProps = componentProps) === null || _componentProps === void 0 ? void 0 : _componentProps.otherProps) || {},
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
- // 如果 values 相同,则函数结果应该相同(纯函数假设)
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zat-design/sisyphus-react",
3
- "version": "4.1.2-beta.9",
3
+ "version": "4.1.2",
4
4
  "license": "MIT",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",